在UNIX系统上有一种简单的方法来识别动态(共享)库是否依赖于其他动态库吗?
我正在探索系统级API,例如dlopen
和C和C ++中的朋友。我有一个受控环境,我将调用dlopen
并映射特定功能。我们的想法是人们将能够在应用程序中编写本机插件(现在让我们假设确保库实际执行正确的功能并且不是恶意的,这符合作者的最佳利益)
但是,作为一种安全措施,我想在运行时确保加载的动态库不链接到任何其他动态库(意图是禁止系统调用,只允许来自本地数学库的函数) - 如果确实如此,不要加载它。
我提出的一些(长期和/或困难)解决方案:
是否有一种简单的(r)方法来检查动态库'依赖
答案 0 :(得分:1)
但是,作为安全措施,我想在运行时确保加载的动态库不会链接到任何其他动态库
请注意,动态库可以导入符号,而不会显式链接到任何其他动态库。例如:
int foo() { return open("/etc/passwd", O_RDONLY); }
gcc -fPIC -shared -o foo.so foo.c -nostdlib
现在foo.so
没有任何DT_NEEDED
共享库依赖项,但仍然会open
/etc/passwd
。
(目的是禁止系统调用,只允许来自本地数学库的函数) - 如果是,则不要加载它。
你的意图有很多错误的,它甚至都不好笑。
首先,您不需要链接到任何外部库来直接执行系统调用,它可以在装配中轻松完成。
此外,该插件可以查找和修改动态加载程序的数据,一旦这样做,它可以使您的主程序执行任意操作。例如,它可以将所有主要程序的调用劫持到libc.so
,并将其重定向到其他位置。
在您的流程中运行不受信任的代码后,游戏
。我提出的解决方案
他们都没有远程工作的机会。任何时候你花在这上面都是浪费时间。