(目前假设的)情况是我的系统的用户将获得一大块 C 代码,并且需要我的系统在 chroot 中编译和运行它。即时生成的沙箱,我希望尽可能减少沙箱中的文件。我只愿意使用编译器和链接器设置(例如,静态链接我期望能够找到的所有内容)并对代码可以期望使用的内容做一些适度的限制(例如,它们不能使用任意库)。
问题是我可以获得沙箱的简单程度。显然我需要可执行文件,但是 ELF 加载程序和用于系统调用的 .so 呢?我可以丢弃它们中的任何一个吗?我还需要其他东西吗?
最佳答案
除了可执行文件之外,您不需要任何东西来运行静态链接的 hello world。当然,您还需要 很多 来编译它。
您可以很容易地对此进行测试,我使用以下简单的 C 代码进行了测试:
#include <stdio.h>
int main() {
puts("Hello, world\n");
return 0;
}
用 gcc -static 编译它。然后创建一个新目录(我称之为“chroot-dir”),将输出(“hello”)移动到其中。所以 chroot 中的唯一文件现在是可执行文件。然后运行 chroot chroot-dir ./hello
,你会得到 Hello, world。
注意有些东西是不能静态编译的。例如,如果您的程序进行身份验证(通过 PAM),则 PAM 模块始终是动态加载的。另请注意,某些调用需要/etc 中的各种文件;任何 getpw* 和 getgr* 函数、域名解析函数等都需要 nsswitch.conf
(和一些共享对象,可能还有更多的配置文件,有时甚至更多的可执行文件,具体取决于配置的查找方法。) /etc/hosts
、/etc/services
和 /etc/protocols
可能对任何网络都非常有用.
找出程序使用哪些文件的一种简单方法是在 strace 下运行它。当然,您必须首先信任该程序。
关于system - 在 Linux 上加载一个程序需要多少个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2785767/