假设我有一个加载动态库“L”的进程“A”。
问:有没有办法禁止对“L”内部函数的“exec”函数的访问?
为此使用AppArmor 。它允许专门减少应用程序可以执行的操作:可以读取/写入哪些文件,可以调用哪些操作系统功能,可以使用哪些网络服务。
设置起来有点困难,但您可以使用一个工具来记录运行您的应用程序所需的所有操作。运行后,您可以检查输出,稍作修改,然后使用它。
动态库与调用应用程序共享相同的进程空间,因此这绝对不容易(而且我认为不可能,除非您的应用程序也否认它)。如果您可以将库包装在单独的应用程序中,那么 AppArmor 或 SELinux 可能会有所帮助,但总的来说:为什么要将不受信任的库加载到您的应用程序中?
您可能还会发现了解 Chromium 如何处理沙盒是有帮助的。
如果您使用的是 Linux,则可以执行以下操作:
实现你的 exec() 和 system() 的 OWN 版本,它们可以做你想做的事情(或不做),或者 LD_PRELOAD 它,或者将 RTLD_DEEPBIND 传递给 dlopen()... 这将导致链接器更喜欢你的版本这些方法超过了 libc 提供的版本。
您可以做一些技巧(例如,使用 MMU 将包含 exec() 函数的 C 库部分映射为不可执行),可能会获得您想要的效果。
但是 - 由于动态库与您在同一进程空间中运行,因此您无法为库无法撤消的库永久禁用它。