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浏览次数:3359
严重程度:0(网友投票)