小编Edd*_*ett的帖子

颠覆 Linux 系统上的执行标志。为什么这是可能的?

在阅读本文时,我发现了以下漏洞:

% 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)
Run Code Online (Sandbox Code Playgroud)

这个片段表明我们可以作为普通的非特权用户轻松地回避文件系统的执行权限。我在 Ubuntu 12.04 上运行了这个。

虽然 Linux 加载器根据 file(1) 是一个共享对象,但它也有一个允许直接执行的入口点。当以这种方式执行时,Linux 加载器充当 ELF 二进制文件的解释器。

然而,在我的 OpenBSD 机器上,此漏洞利用并不有效,因为您可能不会将加载程序作为程序执行。OpenBSD 手册页说:“ld.so 本身是一个最初由内核加载的共享对象。”。

在 Solaris 9 上试试这个,你会得到一个段错误。我不确定其他地方会发生什么。

因此,我的问题是:

  • 为什么 Linux 加载程序(直接执行时)在解释 ELF 二进制文件之前检查文件系统属性?
  • 为什么要实现一种设计为不允许执行文件的机制,如果它是如此微不足道的回避?我错过了什么吗?

linux security file-permissions shared-libraries

24
推荐指数
2
解决办法
2882
查看次数