0

以下是CVE-2009-0029的概述:

s390、powerpc、sparc64 和 mips 64 位平台上的 Linux 内核 2.6.28 及更早版本中的 ABI 要求从用户模式应用程序发送时,64 位寄存器中的 32 位参数已正确符号扩展,但无法验证这一点,这允许本地用户导致拒绝服务(崩溃)或可能通过精心设计的系统调用获得特权。

这怎么会发生?为什么该漏洞不影响 x86_64 或 Intel Itanium?

__SYSCALL_DEFINExLinux内核通过替换下面的marco定义来修复这个缺陷

#define __SYSCALL_DEFINEx(x, name, ...)                 \
     asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)) 

#define __SYSCALL_DEFINEx(x, name, ...)                 \
     asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));      \
     static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));  \
     asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))       \
     {                              \
         __SC_TEST##x(__VA_ARGS__);             \
         return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));   \
     }                              \
     SYSCALL_ALIAS(sys##name, SyS##name);               \
     static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))

我真的不知道它如何解决这个问题?

4

1 回答 1

1

在这些架构上,32 位值由 64 位寄存器处理。因此,如果函数具有 32 位int参数,恶意调用者可以将一个值放入此寄存器,该值大于int.

此外,因为编译器“知道” anint不能有一个不适合int变量的值,所以不容易检查该值是否超出范围,因为编译器可以优化该检查。

作为一种解决方法,该SyS_xxx函数首先假定其所有参数都是 64 位long值,然后将它们显式转换为实际类型。

在 x86_64 和 Itanium 上,处理器在访问 32 位值时会忽略寄存器的高位。

于 2013-09-19T07:55:09.423 回答