Linux是一款开放源代码的操作系统。 Linux针对DCCP支持存在多个问题,本地攻击者可以利用漏洞访问敏感信息。 问题存在于net/dccp/proto.c文件中的do_dccp_getsockopt()函数: ----------------------- static int do_dccp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen) ... if (get_user(len, optlen)) return -EFAULT; if (len < sizeof(int)) return -EINVAL; ... ----------------------- 上面代码没有检查'len'变量回负值,如果'len'小于0,那么(len < sizeof(int))一直为真,在之后调用copy_to_user(): ----------------------- if (put_user(len, optlen) || copy_to_user(optval, &val, len)) return -EFAULT; ----------------------- 根据CPU使用的架构有自身的copy_to_user()实现。在IA-32如下: ----------------------- unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) { BUG_ON((long) n < 0); ----------------------- 会防止被利用,但内核会由于BUG_ON()中的非法opcode而崩溃。 在一些X86-64架构上,内核空间数据会拷贝到用户提供的缓冲区而导致敏感信息泄露。 Ubuntu Ubuntu Linux 7.04 sparc Ubuntu Ubuntu Linux 7.04 powerpc Ubuntu Ubuntu Linux 7.04 i386 Ubuntu Ubuntu Linux 7.04 amd64 Ubuntu Ubuntu Linux 6.10...
Linux是一款开放源代码的操作系统。 Linux针对DCCP支持存在多个问题,本地攻击者可以利用漏洞访问敏感信息。 问题存在于net/dccp/proto.c文件中的do_dccp_getsockopt()函数: ----------------------- static int do_dccp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen) ... if (get_user(len, optlen)) return -EFAULT; if (len < sizeof(int)) return -EINVAL; ... ----------------------- 上面代码没有检查'len'变量回负值,如果'len'小于0,那么(len < sizeof(int))一直为真,在之后调用copy_to_user(): ----------------------- if (put_user(len, optlen) || copy_to_user(optval, &val, len)) return -EFAULT; ----------------------- 根据CPU使用的架构有自身的copy_to_user()实现。在IA-32如下: ----------------------- unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) { BUG_ON((long) n < 0); ----------------------- 会防止被利用,但内核会由于BUG_ON()中的非法opcode而崩溃。 在一些X86-64架构上,内核空间数据会拷贝到用户提供的缓冲区而导致敏感信息泄露。 Ubuntu Ubuntu Linux 7.04 sparc Ubuntu Ubuntu Linux 7.04 powerpc Ubuntu Ubuntu Linux 7.04 i386 Ubuntu Ubuntu Linux 7.04 amd64 Ubuntu Ubuntu Linux 6.10 sparc Ubuntu Ubuntu Linux 6.10 powerpc Ubuntu Ubuntu Linux 6.10 i386 Ubuntu Ubuntu Linux 6.10 amd64 Ubuntu Ubuntu Linux 6.06 LTS sparc Ubuntu Ubuntu Linux 6.06 LTS powerpc Ubuntu Ubuntu Linux 6.06 LTS i386 Ubuntu Ubuntu Linux 6.06 LTS amd64 Linux kernel 2.6.20 .4 Linux kernel 2.6.20 .1 Linux kernel 2.6.20 Linux kernel 2.6.20.3 Linux kernel 2.6.20.2 目前没有详细解决方案提供: <a href="http://www.linux.org/" target="_blank">http://www.linux.org/</a>