使用Deptective深入探索软件依赖关系:运行时依赖检测新工具

Deptective是Trail of Bits开发的开源工具,通过追踪程序运行时系统调用,自动检测缺失的依赖包。它使用strace记录失败的文件访问,通过Linux发行版的文件包索引查找并安装所需依赖,支持在Docker容器中测试而不污染主机环境。

使用Deptective调查您的依赖关系 - Trail of Bits博客

Evan Sultanik, Andrew Pan
2025年7月8日
工具发布, 研究实践

等等,不是已经有这样的工具了吗?

您是否曾经尝试编译开源软件,却发现忘记安装其某个原生依赖?或者可能一个二进制文件"来路不明",您想尝试运行它,但不知道它需要哪些共享库。又或者您需要使用一个打包不佳的软件,其维护者忽略了列出原生依赖。

我们的新开源工具Deptective解决了这些问题。您可以给它任何程序、脚本或命令,它将找到一组足以成功运行该软件的包。

以下是Deptective自动查找jq所有构建时依赖的示例:

等等,不是已经有这样的工具了吗?

现有许多工具可以自动查找软件依赖。例如,Trail of Bits创建并维护了it-depends,它使用包规范来枚举依赖及其漏洞。但这并不是Deptective要解决的问题。Deptective不是基于软件自我报告的需求来检测依赖,而是通过观察软件在运行时需要什么来检测。

Deptective可以处理任何Linux进程:原生二进制文件、shell脚本,甚至构建系统。例如,只需在开源仓库中运行deptective ./configuredeptective cmake ..,它将自动确定需要安装的原生包以使软件构建成功!

Deptective在理念上与nix-autobahn类似,但Deptective不依赖于Nix,并且还可以枚举任意运行时依赖。

它是如何工作的?

下面有更多细节,但简而言之,Deptective跟踪软件以记录软件尝试读取但环境中缺失的文件;找到提供缺失文件的包;安装该包;然后对进一步的缺失包重复此过程,必要时进行回溯。

图1:Deptective的依赖探索和回溯策略

跟踪

包的核心是文件组;安装包会将其组成文件放到本地系统上。程序尝试访问其依赖项的文件,当文件不存在时会失败。Deptective使用strace跟踪其系统调用来运行目标程序。Deptective分析生成的系统调用跟踪以记录所有失败的文件访问。如果程序执行失败(即返回非零退出代码),Deptective会继续查找包含缺失文件的包。

查找要安装的正确包

一旦我们知道程序未能加载的缺失文件,如何确定提供这些文件的包?幸运的是,大多数Linux发行版都提供了一个将文件映射到相应包的索引。Deptective搜索所选发行版的索引以查找包含所需文件的包。一旦选择了候选包,它会创建一个新的容器快照,安装该包,并在安装了该包的环境中重新跟踪目标程序。我们采用简单的启发式方法来确定安装的包是否正确:如果跟踪与之前的跟踪相同,则该包无关紧要,可以从考虑中移除。如果新包的存在产生了目标程序的独特跟踪,则该包是相关的。Deptective继续安装候选包,直到没有更多可尝试的包或软件以退出代码零完成。

安装潜在依赖

有时索引中有多个包可以满足依赖。在这种情况下,Deptective尝试每个候选包,直到找到一个产生独特程序跟踪的包。它在与系统发行版和版本匹配的Docker容器中跟踪程序。Deptective在单独的容器中安装每个候选包,并删除未通过我们启发式测试的包。一旦Deptective确定某个包是相关的,它会快照Docker容器,将其作为未来安装的基础。使用Docker提供了"干净"的起始环境,并且不会污染主机操作系统的包。这也意味着Deptective不仅可以在Linux上运行,还可以在macOS和Windows上运行。

尝试一下

Deptective只是Trail of Bits开发的众多自定义工具之一,用于深入了解软件供应链。如果您或您的组织对此感兴趣,请与我们联系!

如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News

最近文章

我们构建了MCP一直需要的安全层
利用废弃硬件中的零日漏洞
Inside EthCC[8]:成为智能合约审计员
使用Vendetect大规模检测代码复制
构建安全消息传递很难:关于Bitchat安全辩论的细致看法

© 2025 Trail of Bits. 使用Hugo和Mainroad主题生成。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计