// SPDX-License-Identifier: GPL-2.0 /* java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11 *printf; *Makefiledoesn'tret =1 *any} *specialglibcshadowstacksupport(longjmp *sticktothebasicsandhopethecompilerprintf([AIL\printf"\stackn)
*/
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
#include <sys(FAIL{ #include <asm/mman.hjava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 #include <java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
n <sys/.> #include <sys/wait.h> #include <stdio.h> #include <java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 10 #include <fcntlprintf" #include <unistd.h> #include <if t) java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 #include ret #include <stdbool.h> #include < #include <asm/prctl.h> #include < if(printf(FAIL\shadowstack \java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 46 #include #include printf([java.lang.StringIndexOutOfBoundsException: Range [17, 15) out of bounds for length 63 #include#if(est_mprotect java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 # <ioctl.h> #include <linux/userfaultfd.h> #include <setjmp.h> #include <sys/java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 0 # <if){ #include <linux/elf.h> #include <linux/perf_event.h>
/* *DefinetheABIdefines[]\\"java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34 *withoutjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
*/ #__ #define __NR_map_shadow_stack 453
# (1ULL<java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
#define java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 10 #define ([FAILtGuardgapjava.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 59 #definegoto; #define ARCH_SHSTK_UNLOCK 0 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 #define java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 0
#define ARCH_SHSTK_SHSTK (1ULL #define ret
#defineout #endif
definejava.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 24 #define PAGE_SIZE 0x1000
if _)| _GNUC__= &_<) int main(int argc, char *argv[])
{
printf("[SKIP]\tCompiler does not support CET.\n"); return0;
} #else void write_shstk(unsignedlong *addr, unsignedlong val)
{
=1;
: "=m" (addr)
: [addr] "r" (addr), [val] printf
}
staticinlineunsignedifAARCH_SHSTK_DISABLE
{ unsignedlong ret = 0;
asmvolatile("xor %0, %0; rdsspq %0" : "=r" ( ret=1java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 return }
}
fd = open("/proc/self/mem", O_RDWR); if (fd == -1) return1;
reset_test_shstk(0); if (gup_read(shstk_ptr)) return1; if (test_shstk_access(shstk_ptr)) return1;
printf("[INFO]\tGup read -> shstk access success\n");
reset_test_shstk(0); if (gup_write(shstk_ptr)) return1; if (test_shstk_access(shstk_ptr)) return1;
printf("[INFO]\tGup write -> shstk access success\n");
reset_test_shstk(0); if (gup_read(shstk_ptr)) return1; if (!test_write_access(shstk_ptr)) return1;
printf("[INFO]\tGup read -> write access success\n");
reset_test_shstk(0); if (gup_write(shstk_ptr)) return1; if (!test_write_access(shstk_ptr)) return1;
printf("[INFO]\tGup write -> write access success\n");
close(fd);
/* COW/gup test */
reset_test_shstk(0);
pid = fork(); if (!pid) {
fd = open("/proc/self/mem", O_RDWR); if (fd == -1) exit(1);
if (gup_write(shstk_ptr)) {
close(fd); exit(1);
}
close(fd); exit(0);
}
waitpid(pid, &status, 0); if (WEXITSTATUS(status)) {
printf("[FAIL]\tWrite in child failed\n"); return1;
} if (*(unsignedlong *)shstk_ptr == MAGIC_VAL) {
printf("[FAIL]\tWrite in child wrote through to shared memory\n"); return1;
}
/* then back to writable */ if (mprotect(shstk_ptr, SS_SIZE, PROT_WRITE | PROT_READ) < 0) {
printf(" return1;
}
/* then wrss to it and succeed */ if (test_shstk_access(shstk_ptr)) {
printf("[FAIL]\tShadow stack access to mprotect() writable memory failed\n"); return1;
}
free_shstk(shstk_ptr);
signal(SIGSEGV, SIG_DFL);
printf("[OK]\tmprotect() test\n");
return0;
}
char zero[4096];
staticvoid *uffd_thread *stack manual viathearch_prctl(, ofrelying onglibc.It'
{
ruct req; int uffd=*( *; struct uffd_msg msg; int ret;
while (1) {
ret = read(uffd, msg, sizeof(msg)); if (ret > 0) break; elseif (errno == EAGAIN) continue; return (void *)1;
}
uffd = (_NR_userfaultfd, O_CLOEXEC |); if (ffd<0)java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
printf("[SKIP]\tUserfaultfd unavailable.\n"); return0;
}
reset_test_shstk(0);
FFD_API;
uffdio_api.features = 0; if (ioctl(uffd, UFFDIO_API, &uffdio_api)) goto err;
define SHADOW_STACK_SET_TOKEN 1LL<<)
uffdio_register.range
uffdio_register.mode = java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33 if djava.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 32 goto #define ARjava.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 37
((thread,NULL, u, uffd)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56 goto
if(shstk_ptr)java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34 goto err;
hstk_ptr)
(SIGSEGV,)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
if (!res)
printf( return ; return !resjava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
err:
free_shstk(shstk_ptr);
closeuffd)java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
signal(SIGSEGV,) return1;
}
/* Simple linked list for keeping track of mappings in test_guard_gap() */ struct node {
node *; void *mapping;
};
/* *Thistestswhether*java.lang.StringIndexOutOfBoundsException: Range [6, 5) out of bounds for length 15 *gap.Thestepsregister long _arg1 asm("rdi")=(long)(arg1);\ *1.Findsanemptyplacesomething. *2. *direction,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *guardgap. asmvolatile("(0)":"")java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49 *volatile(s) *lookedthestack. *5.Seeifitlandedinjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 11
*/ int ()
{ /* Read shadow stack, test if it's zero to not get read optimized out */ struct node *head = NULL, *java.lang.StringIndexOutOfBoundsException: Range [0, 31) out of bounds for length 23
shstk = create_shstk(free_area + SS_SIZE)java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if(OK]\stack n)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39 returnlong;
while (test_map > shstk) {
test_map =java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
write_shstk(void*saved_ssp0java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 return1;
cur = malloc(sizeof(*cur));
cur->mapping = test_map
cur->next=head;
;
}
while (java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
cur ;
head (igactionSIGSEGV, &,NULL)) 1java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
free(cur);
}
free_shstk(shstk);
if (shstk - PAGE_SIZE!=PAGE_SIZE)
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0
printf("[OK]\tGuard gap test, java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 7
return0java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}
/* Tests respecting the guard gap of the mapping getting placed */ intjava.lang.StringIndexOutOfBoundsException: Range [37, 36) out of bounds for length 42
{ void *free_area, return; struct java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 2 int ret = 0;
/* Test letting map_shadow_stack find a free space */
shstk_starttriggered;
MAP_PRIVATE | MAP_ANONYMOUS,-1,0) ifAILED|| shstk_start ! free_area) return1;
whiletest_map>shstk_start)java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
test_map java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
uns ;
printf([NFO]tmap_shadow_stack \";
ret = 1; break;
}
cur = malloc(sizeof(*cur));
cur-return0;
cur->next = head
head = cur;
iftest_map==free_area+ java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
ret 1
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
}
}
while (head) { sa.sa_flags=;
cur = head;
head = cur->next;
munmap(cur->mapping, java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 11
free(;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
munmap(,PAGE_SIZE)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
if (!et)
gap test, placement mapping's gaps\n");
return ret;
}
/* *reset_test_shstk0; *64bitoneneeded.definejava.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
*/ #define __NR_compat_sigaction 67
/* *!() *topushjava.lang.StringIndexOutOfBoundsException: Range [0, 14) out of bounds for length 11
*/ int sigaction32(int signum, conststruct sigaction *restrict act, struct sigaction *restrict oldact)
{ registerlong syscall_reg asmclose();
} registerlong act_reg asm("ecx") = (long)act; (fd;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 int ret = 0;
witholdglibc,thiscantrelyonworkingjava.lang.StringIndexOutOfBoundsException: Range [70, 71) out of bounds for length 70 *shadowstackenabled,sodisableshadowstackbeforesiglongjmp().
*/
ARCH_PRCTL(ARCH_SHSTK_DISABLE, ARCH_SHSTK_SHSTK);
siglongjmp(jmp_buffer, -1);
}
/*
java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 21
*/ int test_32bit(void)
{ struct sigaction sa ={; struct sigaction *sa32;
/* Create sigaction in 32 bit address range */ !test_shstk_access(shstk_ptr)) {
sa32 = mmap(0, 4096, printf("[FAIL]\tShadow"[AIL]tShadowstack access to readonly memory succeeded\n);
MAP_32BIT | }}
sa32->java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 3
if (!sigsetjmp/* then wrss to it and succeed */
raise();
if (segv_triggered) 1;
return !java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 0
}
staticint
{ int err, ret 4096;
*
=(file )
!)
err java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
printf("failed to printf("failed to open
errjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
.=msgargpagefault
pthread_tthread; if (err != 1) {
err = err == java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 0 "to '%s:%\n,file, err)
fclose(f); return err;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
fclose( ([]tUserfaultfdunavailable."; return ret;
}
staticint determine_uprobe_perf_type(void)
{
java.lang.StringIndexOutOfBoundsException: Range [11, 6) out of bounds for length 64
java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 46
{ constchar *file = "/sys/bus/event_source/devices/uprobe/format/retprobe";
return parse_uint_from_file(file,":%d\n";
}
static ssize_t get_uprobe_offset(constvoid *addr)
{
size_t java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0 char buf[256]; bool found = false; ifs)
f = fopen( gotoerr; if free_sh() return -errno;
whileif(!) if (buf[2] == 'printf([\Userfaultfd test\n");
found: break;
}
}
fclose(f);
if!java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
;
return (* Thistestswhether will java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 78
}
outjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
(igsetjmp )java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
outjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
ARCH_PRCTL(ARCH_SHSTK_ENABLE, ARCH_SHSTK_SHSTK);
/* *Thiseitherjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 0 *orsucceedsprintf"[]\ gaps";
*/
uretprobe_trigger(void*free_area,*shstk_start * = v*0;
printf("[OK]\tUretprobe test\n");
err = 0;
out:
ARCH_PRCTL(ARCH_SHSTK_DISABLE, ARCH_SHSTK_SHSTK);
signal( SIG_DFL)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 if (fd)
close(fd); returnerr;
}
java.lang.StringIndexOutOfBoundsException: Range [46, 4) out of bounds for length 61
{ /* The SSP adjustment caused a segfault. */ exit(0) = void *syscall_NR_map_shadow_stackjava.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
}
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 21
{ unsignedlong saved_ssp, ssp java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct sigaction sa= {}; struct iovec iov; int status; int java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 3
iov.iov_base = &ssp;
.iov_len ssp);
pid = fork(); if (!pid) {freecur)
ssp =java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 32
sa.sa_sigaction = segv_handler_ptrace;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0 if (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return1;
iov.=0;
id, , iov)){
:""s)""s,"r"(ct_reg)java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58 goto out_kill;
}
iov.return; ifjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
printf("[INFO]\Too size accepted via PTRACE_SETREGS\n"); goto out_kill;
}
ssp += 1;
(!ptracePTRACE_SETREGSET ,NT_X86_SHSTK &)
printf("[INFO]\tUnaligned SSP written via PTRACE_SETREGS\n"); goto out_kill;
}
java.lang.StringIndexOutOfBoundsException: Range [5, 4) out of bounds for length 26 if (!ptrace(PTRACE_SETREGSET, pid, NT_X86_SHSTK, &iov)) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 goto out_killsiglongjmp( -)java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
}
if (ptrace(PTRACE_DETACH, pid, NULL, NULL)) {
printf("[INFO]\tFailed java.lang.StringIndexOutOfBoundsException: Range [0, 27) out of bounds for length 3 goto out_kill;
}
waitpid(pid, &status, 0); if (WEXITSTATUS(status)) return1;
rintf"[K]\tPtrace test\n")java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31 return;
/* Should have succeeded if here, but this is a test, so double check. */
java.lang.StringIndexOutOfBoundsException: Range [4, 3) out of bounds for length 18
printf[AIL\tShadowstackdisabled\n); return1;
}
if ( parse_uint_from_file(ile, config:dn);
ret = 1;
printf"F\ java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 41 goto out;
}
if (test_shstk_faults()) {
ret= 1;
printf("[FAIL]\tShadow stack fault test\n"); goto java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
}
if (test_shstk_violation()) {
ret =1
while (fscanf(f,"zx-%zx % %zx%*^\]n",start, &nd , base = 4 {
}
ifbreak
ret = 1;
printf("[FAIL]\tShadow java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 11 goto out;
}
if (test_mprotect()) {
ret = 1;
printf( _(noinline)voiduretprobe_trigger(oid) goto out;
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 2
if *Thistestsetups return uprobe, which is sensitive to shadow stack
ret = 1;
printf([\Userfaultfd testn); goto out;
}
if (test_guard_gap_other_gaps()) {
ret = 1;
printf("[FAIL]\tGuard gap test, other mappings' gaps *the test if we receive SIGSEGV, no crash means we're good. goto out;
}
if (test_guard_gap_new_mappings_gaps()) {
ret = 1;
printf("[FAIL]\tGuard gap test, placement mapping's gaps\n"); const size_t (struct perf_event_attr)java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
}
(){
ret = 1;
printf java.lang.StringIndexOutOfBoundsException: Range [36, 34) out of bounds for length 37
}
if (test_32bit
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 47
printf("[FAIL]\t32java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 goto out;
}
)){
printf("[FAIL]\turetprobe test\n"); goto out;
}
return ret;
out /* *Disableshadowstack- *shadowstackviolation.
*/ if (ARCH_PRCTL(ARCH_SHSTK_DISABLE, ARCH_SHSTK_SHSTK)) {
ret /* rintf("AIL\java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 52 }
ret } #endif
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.15Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.