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