( PaXTeam | 2008. 09. 10., sze – 12:15 )

innen lehet csemegezni tovabbi reszletek irant. a rovid sztori az, hogy az elmult evtizedben mar sokszor felfedeztek ezt a dolgot, es senkinek sem sikerult a valo eletre is atultetnie (a tobb problema kozul emitt lehet pl. a mimikri tamadasokrol olvasni). az a 'zero false positive' meg a szokasos akademiai kamu, nem valodi programokra vonatkozik (mert azok dinamikusan linkeltek, tobbszaluak, van bennuk asm kod, stb). amugy az a kernel patch is eleg mokas dolgokat tartalmaz, pl. az i386 syscall path-on ez van:

--- a/arch/i386/kernel/entry.S
+++ b/arch/i386/kernel/entry.S
@@ -367,6 +367,17 @@ ENTRY(system_call)
CFI_ADJUST_CFA_OFFSET 4
SAVE_ALL
GET_THREAD_INFO(%ebp)
+/* system calls security hook */
+#ifdef CONFIG_SECURITY_SYSCALL
+ pushl %eax
+ pushl %ebp
+ call security_system_call
+ cmpl $0, %eax
+ jnz syscall_noperm
+ popl %eax
+ popl %eax
+#endif

ez eddig meg akar jo is lehetne, csak hogy mi tortenik, ha az a jnz megis ugrik:

+#ifdef CONFIG_SECURITY_SYSCALL
+syscall_noperm:
+ movl $-EACCES,PT_EAX(%esp)
+ jmp resume_userspace
+END(syscall_noperm)
+#endif /* CONFIG_SECURITY_SYSCALL */

hat igen, az a ket pop erosen hianyzik, ez igy ranezesre egy ring-0 kodvegrehajtas kategoriaju hiba (minden 8 byte-tal eltolodik, a resume_userspace vegen levo iret szepen a userlandbol jovo eax:fs cimre fog visszaterni, az pedig siman kontrollalhato).