Linux内核本地整数溢出和内存泄露漏洞

2008-04-09 04:21:02来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

Linux内核本地整数溢出和内存泄露漏洞

发布日期:2004-12-15
更新日期:2004-12-23

受影响系统:
Linux kernel 2.6.9
Linux kernel 2.6.8
Linux kernel 2.6.7
Linux kernel 2.6.6
Linux kernel 2.6.5
Linux kernel 2.6.4
Linux kernel 2.6.3
Linux kernel 2.6.2
Linux kernel 2.6.1
Linux kernel 2.6
Linux kernel 2.4.9
Linux kernel 2.4.8
Linux kernel 2.4.7
Linux kernel 2.4.6
Linux kernel 2.4.5
Linux kernel 2.4.4
Linux kernel 2.4.3
Linux kernel 2.4.28
Linux kernel 2.4.27
Linux kernel 2.4.26
Linux kernel 2.4.25
Linux kernel 2.4.24
Linux kernel 2.4.23
Linux kernel 2.4.22
Linux kernel 2.4.21
Linux kernel 2.4.20
Linux kernel 2.4.2
Linux kernel 2.4.19
Linux kernel 2.4.18
Linux kernel 2.4.17
Linux kernel 2.4.16
Linux kernel 2.4.15
Linux kernel 2.4.14
Linux kernel 2.4.13
Linux kernel 2.4.12
Linux kernel 2.4.11
Linux kernel 2.4.10
Linux kernel 2.4.1
Linux kernel 2.4
描述:
Linux Kernel是开放源代码操作系统Linux的内核。

Linux Kernel ip_options_get和vc_resize存在整数溢出,ip_options_get存在内存泄露问题,本地攻击者可以利用这些漏洞使内核崩溃或获得敏感信息。

问题一vc_resize:

vt.c中的rc_resize存在一个整数溢出:

--------------------
int vc_resize(int currcons, unsigned int cols, unsigned int lines)
{
unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0;
unsigned int old_cols, old_rows, old_row_size, old_screen_size;
unsigned int new_cols, new_rows, new_row_size, new_screen_size;
unsigned short *newscreen;

WARN_CONSOLE_UNLOCKED();

if (!vc_cons_allocated(currcons))
return -ENXIO;

new_cols = (cols ? cols : video_num_columns);
new_rows = (lines ? lines : video_num_lines);
new_row_size = new_cols << 1;
new_screen_size = new_row_size * new_rows;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if (new_cols == video_num_columns && new_rows == video_num_lines)
return 0;

newscreen = (unsigned short *) kmalloc(new_screen_size, GFP_USER);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(new_row_size * new_rows)可能> 2^32 - 1

它被vt_ioctl.c case VT_RESIZEX调用,这可导致一个整数溢出。

问题二ip_options_get内存泄露:

如果ip_cmsg_send多次调用ip_options_get可导致一个本地内存泄露,ip_options_get执行kmalloc()时,覆盖kmalloc()之前的指针,因此由于不能释放而导致内存泄露。

问题三ip_options_get 整数溢出:

linux kernel 2.6.9版本ip_options_get(net/ipv4/ip_options.c)存在本地整数溢出,可通过ip_cmsg_send (net/ipv4/ip_sockglue.c)触发:
-------
int err;

case IP_RETOPTS:
err = cmsg->cmsg_len - CMSG_ALIGN(sizeof(struct cmsghdr));
err = ip_options_get(&ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40, 0);
------------------------------------------------ ^^^^^^^^^^^^^^^

if cmsg->cmsg_len is -1, optlen in ip_options_get may be -13 and then
opt = kmalloc(sizeof(struct ip_options) ((optlen 3)&~3), GFP_KERNEL);
overflows and then
memcpy(opt->__data, data, optlen);
blows the kernel.

another interesting code path with negative cmsg_len is
compat.c:
-----------------------
int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg,
unsigned char *stackbuf, int stackbuf_size)
{
if(kcmlen > stackbuf_size)
kcmsg_base = kcmsg = kmalloc(kcmlen, GFP_KERNEL);
while(ucmsg != NULL) {
__get_user(ucmlen, &ucmsg->cmsg_len);
tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg)))
CMSG_ALIGN(sizeof(struct cmsghdr)));
kcmsg->cmsg_len = tmp;
__get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level);
__get_user(kcmsg->cmsg_type, &ucmsg->cmsg_type);

/* Copy over the data. */
if(copy_from_user(CMSG_DATA(kcmsg), CMSG_COMPAT_DATA(ucmsg),
(ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg)))))
goto out_free_efault;
--------------

<*来源:Georgi Guninski (guninski@guninski.com)

链接:http://marc.theaimsgroup.com/?l=full-disclosure&m=110374209001676&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Realone2.0 pnxr3260.dll远程IE浏览器崩溃漏洞

下一篇:Moodle多个安全漏洞