在运行时检测和拦截链接库依赖项

时间:2015-05-16 12:41:35

标签: c++ c unix shared-libraries dynamic-linking

在UNIX系统上有一种简单的方法来识别动态(共享)库是否依赖于其他动态库吗?

我正在探索系统级API,例如dlopen和C和C ++中的朋友。我有一个受控环境,我将调用dlopen并映射特定功能。我们的想法是人们将能够在应用程序中编写本机插件(现在让我们假设确保库实际执行正确的功能并且不是恶意的,这符合作者的最佳利益)

但是,作为一种安全措施,我想在运行时确保加载的动态库不链接到任何其他动态库(意图是禁止系统调用,只允许来自本地数学库的函数) - 如果确实如此,不要加载它。

我提出的一些(长期和/或困难)解决方案:

  • 编写一个编译器垫片,用一组非常特定的编译器选项编译插件代码,并注入某种校验和函数,可用于验证编译器填充程序是否被使用。
  • 单独切出引用我不想使用的功能名称的所有函数调用。
  • 使用某些链接器路径欺骗拦截所有系统调用。

是否有一种简单的(r)方法来检查动态库'依赖

1 个答案:

答案 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,并将其重定向到其他位置。

在您的流程中运行不受信任的代码后,游戏

  

我提出的解决方案

他们都没有远程工作的机会。任何时候你花在这上面都是浪费时间。