7d09435354
Mind this is aesthetics mainly - we do not care much about privilege escalations in AppVM.
97 lines
3.6 KiB
Plaintext
97 lines
3.6 KiB
Plaintext
From: H. Peter Anvin <hpa@linux.intel.com>
|
|
Date: Tue, 14 Sep 2010 19:42:41 +0000 (-0700)
|
|
Subject: x86-64, compat: Test %rax for the syscall number, not %eax
|
|
Git-commit: 36d001c70d8a0144ac1d038f6876c484849a74de
|
|
References: CVE-2010-3301 bnc#639708
|
|
Patch-mainline: 2.6.36
|
|
Introduced-by: 2.6.27
|
|
|
|
x86-64, compat: Test %rax for the syscall number, not %eax
|
|
|
|
On 64 bits, we always, by necessity, jump through the system call
|
|
table via %rax. For 32-bit system calls, in theory the system call
|
|
number is stored in %eax, and the code was testing %eax for a valid
|
|
system call number. At one point we loaded the stored value back from
|
|
the stack to enforce zero-extension, but that was removed in checkin
|
|
d4d67150165df8bf1cc05e532f6efca96f907cab. An actual 32-bit process
|
|
will not be able to introduce a non-zero-extended number, but it can
|
|
happen via ptrace.
|
|
|
|
Instead of re-introducing the zero-extension, test what we are
|
|
actually going to use, i.e. %rax. This only adds a handful of REX
|
|
prefixes to the code.
|
|
|
|
Reported-by: Ben Hawkes <hawkes@sota.gen.nz>
|
|
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
|
Cc: <stable@kernel.org>
|
|
Cc: Roland McGrath <roland@redhat.com>
|
|
Cc: Andrew Morton <akpm@linux-foundation.org>
|
|
Acked-by: Jeff Mahoney <jeffm@suse.com>
|
|
Automatically created from "patches.fixes/x86-64-compat-test-rax-for-the-syscall-number-not-eax" by xen-port-patches.py
|
|
|
|
--- 11.3-2010-09-14.orig/arch/x86/ia32/ia32entry-xen.S 2010-09-17 11:18:22.000000000 +0200
|
|
+++ 11.3-2010-09-14/arch/x86/ia32/ia32entry-xen.S 2010-09-17 11:18:28.000000000 +0200
|
|
@@ -145,7 +145,7 @@ ENTRY(ia32_sysenter_target)
|
|
orl $TS_COMPAT,TI_status(%r10)
|
|
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
|
|
jnz sysenter_tracesys
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
+ cmpq $(IA32_NR_syscalls-1),%rax
|
|
ja ia32_badsys
|
|
jmp ia32_do_call
|
|
|
|
@@ -159,7 +159,7 @@ ENTRY(ia32_sysenter_target)
|
|
movl $AUDIT_ARCH_I386,%edi /* 1st arg: audit arch */
|
|
call audit_syscall_entry
|
|
movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall number */
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
+ cmpq $(IA32_NR_syscalls-1),%rax
|
|
ja ia32_badsys
|
|
movl %ebx,%edi /* reload 1st syscall arg */
|
|
movl RCX-ARGOFFSET(%rsp),%esi /* reload 2nd syscall arg */
|
|
@@ -186,7 +186,7 @@ sysenter_tracesys:
|
|
call syscall_trace_enter
|
|
LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */
|
|
RESTORE_REST
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
+ cmpq $(IA32_NR_syscalls-1),%rax
|
|
ja int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */
|
|
jmp ia32_do_call
|
|
CFI_ENDPROC
|
|
@@ -240,7 +240,7 @@ ENTRY(ia32_cstar_target)
|
|
orl $TS_COMPAT,TI_status(%r10)
|
|
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
|
|
jnz cstar_tracesys
|
|
- cmpl $IA32_NR_syscalls-1,%eax
|
|
+ cmpq $IA32_NR_syscalls-1,%rax
|
|
ja ia32_badsys
|
|
cstar_do_call:
|
|
IA32_ARG_FIXUP 1
|
|
@@ -267,7 +267,7 @@ cstar_tracesys:
|
|
LOAD_ARGS32 ARGOFFSET, 1 /* reload args from stack in case ptrace changed it */
|
|
RESTORE_REST
|
|
xchgl %ebp,%r9d
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
+ cmpq $(IA32_NR_syscalls-1),%rax
|
|
ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */
|
|
jmp cstar_do_call
|
|
END(ia32_cstar_target)
|
|
@@ -324,7 +324,7 @@ ENTRY(ia32_syscall)
|
|
orl $TS_COMPAT,TI_status(%r10)
|
|
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
|
|
jnz ia32_tracesys
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
+ cmpq $(IA32_NR_syscalls-1),%rax
|
|
ja ia32_badsys
|
|
ia32_do_call:
|
|
IA32_ARG_FIXUP
|
|
@@ -343,7 +343,7 @@ ia32_tracesys:
|
|
call syscall_trace_enter
|
|
LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */
|
|
RESTORE_REST
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
+ cmpq $(IA32_NR_syscalls-1),%rax
|
|
ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */
|
|
jmp ia32_do_call
|
|
END(ia32_syscall)
|