在阅读本文的同时,我发现了以下漏洞:
% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
此代码片段表明,我们可以像普通的非特权用户一样轻易地避开文件系统的执行权限。我在Ubuntu 12.04上运行它。
虽然Linux加载器是file(1)的共享对象,但它也具有允许直接执行的入口点。当以这种方式执行时,Linux加载程序将充当ELF二进制文件的解释器。
但是,在我的OpenBSD机器上,此利用无效,因为您可能未将加载程序作为程序执行。OpenBSD手册页显示:“ ld.so本身是一个共享对象,最初由内核加载。”
在Solaris 9上尝试此操作,您将遇到段错误。我不确定其他地方会发生什么。
因此,我的问题是:
- 为什么Linux加载器(直接执行时)在解释ELF二进制文件之前不检查文件系统属性?
- 为什么要实施一种机制,该机制被设计成不允许执行文件(如果它被轻易地绕开了)?我错过了什么吗?
libc
(我曾经做过一次,升级了Arch框),那么您会对这个小怪癖表示感谢。