linux/arch
John Blackwood 97c2803c9c [PATCH] x86_64: Plug GS leak in arch_prctl()
In linux-2.6.16, we have noticed a problem where the gs base value
returned from an arch_prtcl(ARCH_GET_GS, ...) call will be incorrect if:

   - the current/calling task has NOT set its own gs base yet to a
     non-zero value,

   - some other task that ran on the same processor previously set their
     own gs base to a non-zero value.

In this situation, the ARCH_GET_GS code will read and return the
MSR_KERNEL_GS_BASE msr register.

However, since the __switch_to() code does NOT load/zero the
MSR_KERNEL_GS_BASE register when the task that is switched IN has a zero
next->gs value, the caller of arch_prctl(ARCH_GET_GS, ...) will get back
the value of some previous tasks's gs base value instead of 0.

    Change the arch_prctl() ARCH_GET_GS code to only read and return
    the MSR_KERNEL_GS_BASE msr register if the 'gs' register of the calling
    task is non-zero.

    Side note: Since in addition to using arch_prctl(ARCH_SET_GS, ...),
    a task can also setup a gs base value by using modify_ldt() and write
    an index value into 'gs' from user space, the patch below reads
    'gs' instead of using thread.gs, since in the modify_ldt() case,
    the thread.gs value will be 0, and incorrect value would be returned
    (the task->thread.gs value).

    When the user has not set its own gs base value and the 'gs'
    register is zero, then the MSR_KERNEL_GS_BASE register will not be
    read and a value of zero will be returned by reading and returning
    'task->thread.gs'.

    The first patch shown below is an attempt at implementing this
    approach.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-04-09 11:53:53 -07:00
..
alpha Manual merge with Linus. 2006-04-02 00:08:05 -05:00
arm Merge master.kernel.org:/home/rmk/linux-2.6-arm 2006-04-02 13:34:00 -07:00
arm26 [PATCH] unexport get_wchan 2006-03-31 12:19:01 -08:00
cris [PATCH] unify PFN_* macros 2006-03-27 08:44:48 -08:00
frv [PATCH] unexport get_wchan 2006-03-31 12:19:01 -08:00
h8300 [PATCH] unexport get_wchan 2006-03-31 12:19:01 -08:00
i386 [PATCH] i386: Remove printk about reboot fixups at reboot 2006-04-09 11:53:53 -07:00
ia64 [IA64] Avoid "u64 foo : 32;" for gcc3 vs. gcc4 compatibility 2006-03-31 10:28:29 -08:00
m32r [PATCH] unify PFN_* macros 2006-03-27 08:44:48 -08:00
m68k [PATCH] unexport get_wchan 2006-03-31 12:19:01 -08:00
m68knommu [PATCH] unexport get_wchan 2006-03-31 12:19:01 -08:00
mips Manual merge with Linus. 2006-04-02 00:08:05 -05:00
parisc [PARISC] Enabled some NLS modules in a500, b180 and c3000 defconfigs 2006-03-30 17:48:58 +00:00
powerpc Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input 2006-04-02 12:49:19 -07:00
ppc [PATCH] for_each_possible_cpu: ppc 2006-03-29 13:44:16 +11:00
s390 [PATCH] for_each_possible_cpu: s390 2006-03-31 12:18:52 -08:00
sh [PATCH] Don't pass boot parameters to argv_init[] 2006-03-31 12:18:53 -08:00
sh64 [PATCH] RTC: Remove some duplicate BCD definitions 2006-03-28 09:16:01 -08:00
sparc [SPARC]: Wire up sys_sync_file_range() into syscall tables. 2006-03-31 23:49:34 -08:00
sparc64 [SPARC]: Wire up sys_sync_file_range() into syscall tables. 2006-03-31 23:49:34 -08:00
um [PATCH] uml: check for differences in host support 2006-03-31 12:18:52 -08:00
v850
x86_64 [PATCH] x86_64: Plug GS leak in arch_prctl() 2006-04-09 11:53:53 -07:00
xtensa [PATCH] unexport get_wchan 2006-03-31 12:19:01 -08:00