在运行时检测和拦截链接库依赖项
Detecting and intercepting linked library dependencies at runtime
在 UNIX 系统上有没有一种简单的方法来识别动态(共享)库是否依赖于其他动态库?
我正在探索系统级 API,例如 dlopen
以及 C 和 C++ 中的朋友。我有一个受控环境,我将在其中调用 dlopen
并映射特定函数。这个想法是人们将能够为应用程序编写本机插件(让我们暂时假设确保库实际执行正确的功能并且不是恶意的符合作者的最大利益)。
但是,作为一项安全措施,我想在运行时确保加载的动态库不会 link 到任何其他动态库(目的是禁止系统调用,只允许来自本地的函数maths library) - 如果有,请不要加载它。
我想出的一些(很长 and/or 困难的)解决方案:
- 编写一个编译器 shim,使用一组非常具体的编译器选项编译插件代码,并注入某种校验和函数,可用于验证是否使用了编译器 shim。
- 单独删除所有引用我不想使用的函数名称的函数调用。
- 使用一些 linker 路径技巧拦截所有系统调用。
是否有一种简单的方法来检查动态库的依赖关系?
However, as a security measure I would like to ensure at runtime that the loaded dynamic library does not link to any other dynamic libraries
请注意,动态库可以导入符号 而无需 显式 linking 到任何其他动态库。例如:
int foo() { return open("/etc/passwd", O_RDONLY); }
gcc -fPIC -shared -o foo.so foo.c -nostdlib
现在 foo.so
没有任何 DT_NEEDED
共享库依赖项,但仍然 open
/etc/passwd
随意。
(the intention being to disallow system calls and only permit functions from the local maths library) - and if it does, don't load it.
你的意图错误太多了,一点都不好笑。
首先,您不需要link到任何外部库来直接执行系统调用,它可以在汇编中轻松完成。
此外,该插件可以查找和修改动态加载程序的数据,并且一旦这样做,它可以让您的主程序做任意事情。例如,它可以劫持所有主程序对 libc.so
的调用,并将它们重定向到其他地方。
一旦您 运行 流程中的代码不受信任,游戏就结束了。
solutions I've come up with
None 他们中的工作机会甚至很小。花在这上面的任何时间都是浪费时间。
在 UNIX 系统上有没有一种简单的方法来识别动态(共享)库是否依赖于其他动态库?
我正在探索系统级 API,例如 dlopen
以及 C 和 C++ 中的朋友。我有一个受控环境,我将在其中调用 dlopen
并映射特定函数。这个想法是人们将能够为应用程序编写本机插件(让我们暂时假设确保库实际执行正确的功能并且不是恶意的符合作者的最大利益)。
但是,作为一项安全措施,我想在运行时确保加载的动态库不会 link 到任何其他动态库(目的是禁止系统调用,只允许来自本地的函数maths library) - 如果有,请不要加载它。
我想出的一些(很长 and/or 困难的)解决方案:
- 编写一个编译器 shim,使用一组非常具体的编译器选项编译插件代码,并注入某种校验和函数,可用于验证是否使用了编译器 shim。
- 单独删除所有引用我不想使用的函数名称的函数调用。
- 使用一些 linker 路径技巧拦截所有系统调用。
是否有一种简单的方法来检查动态库的依赖关系?
However, as a security measure I would like to ensure at runtime that the loaded dynamic library does not link to any other dynamic libraries
请注意,动态库可以导入符号 而无需 显式 linking 到任何其他动态库。例如:
int foo() { return open("/etc/passwd", O_RDONLY); }
gcc -fPIC -shared -o foo.so foo.c -nostdlib
现在 foo.so
没有任何 DT_NEEDED
共享库依赖项,但仍然 open
/etc/passwd
随意。
(the intention being to disallow system calls and only permit functions from the local maths library) - and if it does, don't load it.
你的意图错误太多了,一点都不好笑。
首先,您不需要link到任何外部库来直接执行系统调用,它可以在汇编中轻松完成。
此外,该插件可以查找和修改动态加载程序的数据,并且一旦这样做,它可以让您的主程序做任意事情。例如,它可以劫持所有主程序对 libc.so
的调用,并将它们重定向到其他地方。
一旦您 运行 流程中的代码不受信任,游戏就结束了。
solutions I've come up with
None 他们中的工作机会甚至很小。花在这上面的任何时间都是浪费时间。