FreeBSD I386_Set_LDT()多个本地拒绝服务漏洞 CVE-2006-4178 CNNVD-200609-428 CNVD-2006-7365

4.9 AV AC AU C I A
发布: 2006-09-26
修订: 2018-10-17

FreeBSD就是一种运行在Intel平台上、可以自由使用的开放源码Unix类系统。 FreeBSD中的i386_set_ldt()调用允许用户系统的程序动态管理每个进程的本地描述符表。由于使用了有符号的整数且缺少输入验证,内核中bzero可能会被要求处理很大的参数,漏洞代码如下: 415 int error = 0, i; 416 int largest_ld; .. 449 largest_ld = uap->start + uap->num; 450 if (largest_ld > pldt->ldt_len) 451 largest_ld = pldt->ldt_len; 452 i = largest_ld - uap->start; 453 bzero( &((union descriptor *)(pldt->ldt_base))[uap->start], 454 sizeof(union descriptor) * i); 在415和416行,\"i\"和\"largest_ld\"变量都是有符的整数。在449行,同时添加了uap->start和uap->num,这两个变量都是用户控制的且没有经过正确的检查。在452行,可以将\"i\"设置为很大的负值,导致在453行以很大的长度参数调用bzero。无效的内存访问会导致内核忙碌。 i386_set_ldt()系统调用会在LDT中设置当前进程的i386描述符列表。该调用接受一个开始选择器数(start)、包含有将要设置描述符的内存数组(descs),以及将要设置的条目数(num)。用户在通过sysarch()调用i386_set_ldt()时,如果将start参数设置为很低的整数值、将descs设置为非空的值,并将num设置为很高的无符整数值,就会触发largest_ld和descs_size(533和540行)中的整数溢出,导致耗尽所有可用的系统资源(541行)。此外还可以将start参数设置为低整数值、descs设置为空、num设置为很高的无符整数值触发largest_ld(515行)中的整数溢出,导致删除系统中的敏感数据(519和520行)。有漏洞的函数如下: 476 static int 477 i386_set_ldt(td, args) 478 struct thread *td;...

0%
当前有2条漏洞利用/PoC
当前有5条受影响产品信息