假设setuid
/setgid
位无关紧要。为什么要有单独的执行权限?
从哲学上来说,我觉得写权限包含读权限,读权限包含执行权限。当然,在 Linux 中情况并非如此,这有时很有用,但我认为很少有用。例如,如果一个进程可以读取一个不可执行的文件,那么只要该进程可以在某个目录中写入,它就可以简单地将文件复制到那里,设置执行位,然后运行该程序。确实,读取包含了简单情况下的执行。显然,如果源文件具有 setuid 位,或者进程只能在 noexec 挂载点中写入,则这将无法正常工作。
我问这个问题的原因是我正在实现一个 Linux 系统调用,该系统调用允许进程访问exec
其内存的任意块。 (具体用例是我的主程序中捆绑了一个完整的程序,并且我不想将其写入磁盘以便调用execve
。)我应该注意这样的系统调用是否存在任何严重问题?
答案1
正如您所猜测的,执行权限作为权限很少有用。将其作为权限而不是文件的属性有点历史意外。然而,既然存在,就不会消失。在两种情况下,拥有与读取权限不同的执行权限很重要。
- 如果执行文件授予额外的权限,那么谁可以执行该特定文件就很重要。 setuid 或 setgid 或 setcap 可执行文件可能是世界可读的,但不是世界可执行的(许多发行版使 setxid 文件世界可读,即使它们不是世界可执行的,因为它们不是机密的 - 任何人都可以从发行版的下载文件)档案)。
- 某些帐户可能受到限制,不允许它们向可执行文件写入任何内容。例如,一个帐户可能只能访问受限外壳不带
chmod
,或者只能写入使用 . 挂载的文件系统上的目录noexec
。这样的用户只能使用已经存在的可执行文件。
从内存中添加对 exec 的系统调用允许受限帐户执行任意代码。它相当于拥有一个可以从任何地方(甚至是受限帐户)访问的本机代码解释器。这在主流内核中不会被接受,因为它会破坏安全限制。您可以将其部署在您自己的计算机上,但您应该牢记其含义。
然而,对于已经存在的功能来说,需要进行大量的工作和大量的安全包袱。可以在不写入磁盘的情况下执行代码。您只需将代码写入非磁盘文件系统(例如 tmpfs)上的文件即可。
答案2
忽略
setuid
/setgid
,其目的之一执行位是:- 允许具有模式的文件只执行-执行访问不可读的文件。
关于您问题的第二部分 - 关于
linux syscall
您实施的:
这似乎创造了一个新的攻击源。
如果您想得到认真的答案,您应该提供详细信息(最好在新问题中提供):
- 您将实现哪种逻辑?
- 数据如何复制到RAM?
- 在执行 RAM 中的代码之前,API 将执行哪些检查?
- API 是否也会被执行
root
(因此可能允许特权升级)