以下是CVE-2009-0029的概述:
s390、powerpc、sparc64 和 mips 64 位平台上的 Linux 内核 2.6.28 及更早版本中的 ABI 要求从用户模式应用程序发送时,64 位寄存器中的 32 位参数已正确符号扩展,但无法验证这一点,这允许本地用户导致拒绝服务(崩溃)或可能通过精心设计的系统调用获得特权。
这怎么会发生?为什么该漏洞不影响 x86_64 或 Intel Itanium?
__SYSCALL_DEFINEx
Linux内核通过替换下面的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__))
我真的不知道它如何解决这个问题?