Lucene search

K
seebugRootSSV:4610
HistoryDec 31, 2008 - 12:00 a.m.

Linux Kernel ib700wdt.c缓冲区溢出漏洞

2008-12-3100:00:00
Root
www.seebug.org
13

0.0004 Low

EPSS

Percentile

10.1%

BUGTRAQ ID: 33003
CVE(CAN) ID: CVE-2008-5702

Linux Kernel是开放源码操作系统Linux所使用的内核。

Linux kernel的drivers/watchdog/ib700wdt.c中的ibwdt_ioctl函数存在缓冲区下溢漏洞,本地用户可以通过特定的/dev/watchdog WDIOC_SETTIMEOUT IOCTL调用来触发这个溢出,导致拒绝服务或执行任意内核态代码。

以下是ib700wdt.c文件中有漏洞的代码段:

static int wd_times[] = {
30, /* 0x0 /
28, /
0x1 /
26, /
0x2 /
24, /
0x3 /
22, /
0x4 /
20, /
0x5 /
18, /
0x6 /
16, /
0x7 /
14, /
0x8 /
12, /
0x9 /
10, /
0xA /
8, /
0xB /
6, /
0xC /
4, /
0xD /
2, /
0xE /
0, /
0xF */
};

function ibwdt_ioctl:

case WDIOC_SETTIMEOUT:
if (get_user(new_margin, p))
return -EFAULT;
if (ibwdt_set_heartbeat(new_margin))
return -EINVAL;
ibwdt_ping();
/* Fall */

case WDIOC_GETTIMEOUT:
return put_user(wd_times[wd_margin], p);

function ibwdt_set_heartbeat:
static int
ibwdt_set_heartbeat(int t)
{
int i;

    if ((t < 0) || (t > 30))
            return -EINVAL;

    for (i = 0x0F; i > -1; i--)
            if (wd_times[i] > t)
                    break;
    wd_margin = i;
    return 0;

}

如果使用30这个值调用ibwdt_set_heartbeat(int t),则由于t == 30,ibwdt_set_heartbeat中的((t < 0) || (t > 30))检查就不会失败,但在循环中,wd_times[i] >检查不会为真,因为没有wd_times大于t的值(也就是30)。退出循环时i == -1,因此将wd_margin设置为-1。

Linux kernel 2.6.x
厂商补丁:

Linux

目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

<a href=“http://kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.28-rc1.tar.bz2” target=“_blank”>http://kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.28-rc1.tar.bz2</a>