Skip to content
  • Roland McGrath's avatar
    x86-64: seccomp: fix 32/64 syscall hole · 5b101740
    Roland McGrath authored
    On x86-64, a 32-bit process (TIF_IA32) can switch to 64-bit mode with
    ljmp, and then use the "syscall" instruction to make a 64-bit system
    call.  A 64-bit process make a 32-bit system call with int $0x80.
    
    In both these cases under CONFIG_SECCOMP=y, secure_computing() will use
    the wrong system call number table.  The fix is simple: test TS_COMPAT
    instead of TIF_IA32.  Here is an example exploit:
    
    	/* test case for seccomp circumvention on x86-64
    
    	   There are two failure modes: compile with -m64 or compile with -m32.
    
    	   The -m64 case is the worst one, because it does "chmod 777 ." (could
    	   be any chmod call).  The -m32 case demonstrates it was able to do
    	   stat(), which can glean information but not harm anything directly.
    
    	   A buggy kernel will let the test do something, print, and exit 1; a
    	   fixed kernel will make it exit with SIGKILL before it does anything.
    	*/
    
    	#define _GNU_SOURCE
    	#include <assert.h>
    	#include <inttypes.h>
    	#include <stdio.h>
    	#in...
    5b101740