system - 在 Linux 上加载一个程序需要多少个文件?

标签 system sandbox

(目前假设的)情况是我的系统的用户将获得一大块 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/

相关文章:

security - 使用 LuaJIT 编写脚本并选择性地沙盒化 FFI

paypal - "name": "INVALID_RESOURCE_ID", "message":"Requested resource ID was not found."

extjs - 将 ExtJS4 组件添加到 ExtJS3 组件?

c - shm_open() 导致 No such file or directory

android - 如何查看安卓系统版本?

c - 程序中有什么错误?

javascript - 使用 Javascript 将 HTML5 沙盒属性添加到 iframe

hadoop - 无法在 HDP 2.2 沙盒上安装 Storm

php - 登录系统,禁止用户php

delphi调试排除system.pas