首页 -> 安全研究

安全研究

安全漏洞
Linux Kernel IA32 ExecVE本地溢出漏洞

发布日期:2005-07-12
更新日期:2005-07-12

受影响系统:
Linux kernel 2.6.x <= 2.6.6
Linux kernel 2.4.x <= 2.4.31
不受影响系统:
Linux kernel 2.6.7
Linux kernel 2.4.32-pre1
描述:
BUGTRAQ  ID: 14205
CVE(CAN) ID: CVE-2005-1768

Linux Kernel是Linux操作系统所使用的内核。

Linux Kernel中存在本地缓冲区溢出漏洞,攻击者可以本地利用这个漏洞获得root权限。

起因是ia32仿真系统调用中的竞争条件可能导致覆盖之前已分配缓冲区的内存拷贝操作。ia64和amd64平台的ia32兼容中包含有execve()系统调用的兼容代码。在这个系统调用中存在竞争条件,可能导致缓冲区溢出:

static int nargs (unsigned int arg, char **ap) {
unsigned int addr;
int n=0, err;
...
do {
err = get_user(addr, (unsigned int *)A(arg));
...
if (ap)
*ap++ = (char *) A(addr);
arg += sizeof(unsigned int);
n++;
...
} while (addr);
return n - 1;
}
asmlinkage long sys32_execve (char *filename, unsigned int argv,
unsigned int envp, int dummy3, int dummy4, int dummy5, int dummy6,
int dummy7, int stack) {
struct pt_regs *regs = (struct pt_regs *)&stack;
unsigned long old_map_base, old_task_size, tssd;
char **av, **ae;
int na, ne, len;
long r;
na = nargs(argv, NULL);
...
ne = nargs(envp, NULL);
...
av = kmalloc( (na+ne+2) * sizeof(*av) , GFP_KERNEL);
...
ae = av + na + 1;
av[na] = NULL;
ae[ne] = NULL;
r = nargs(argv, av);
...
r = nargs(envp, ae);
...

可见nargs()函数用于计算用户区中的指针数,然后执行kmalloc(),接着再次使用nargs()函数将参数从用户区拷贝到kernel分配的空间。如果在完成计数之后拷贝指针之前并行线程更改了指针数组的话就可能导致缓冲区溢出。

<*来源:Ilja van Sprundel (ilja@suresec.org
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=112110120216116&w=2
        http://www.suresec.org/advisories/adv4.pdf
*>

建议:
厂商补丁:

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

Linux Patch patch-2.4.32-pre1.bz2
http://kernel.org/pub/linux/kernel/v2.4/testing/patch-2.4.32-pre1.bz2

Linux Upgrade linux-2.6.7.tar.bz2
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.7.tar.bz2

浏览次数:3346
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障