【发布时间】:2015-05-16 12:41:35
【问题描述】:
在 UNIX 系统上是否有一种简单的方法来识别动态(共享)库是否依赖于其他动态库?
我正在探索系统级 API,例如 dlopen 和 C 和 C++ 中的朋友。我有一个受控环境,我将在其中调用dlopen 并映射特定功能。这个想法是人们将能够为应用程序编写本机插件(让我们暂时假设确保库实际执行正确的功能并且没有恶意符合作者的最大利益)。
但是,作为一项安全措施,我想确保在运行时加载的动态库不会链接到任何其他动态库(目的是禁止系统调用,只允许来自本地数学库的函数) - 如果是的,不要加载它。
我提出的一些(冗长和/或困难的)解决方案:
- 编写一个编译器 shim,它使用一组非常特定的编译器选项编译插件代码,并注入某种校验和函数,可用于验证是否使用了编译器 shim。
- 单独切出所有引用我不想使用的函数名称的函数调用。
- 使用一些链接器路径技巧来拦截所有系统调用。
是否有检查动态库依赖关系的简单(r)方法?
【问题讨论】:
-
从安全的角度来看,不加载外部库不会阻止系统调用。如果您担心的话,恶意程序员可以在 C/C++ 中做太多事情而无需任何操作。但是,上面的评论是对的,ldd 可能是最好的选择。不过,据我所知,它不会对标准库调用的使用提供任何暗示,因为它们本身就有很大的破坏潜力。
标签: c++ c unix shared-libraries dynamic-linking