使用 Deptective 调查你的依赖项

Deptective 是 Trail of Bits 发布的一款开源工具,旨在自动发现软件运行所需的依赖包。通过跟踪软件的系统调用,Deptective 能够识别缺失的文件,并在 Linux 发行版的索引中查找包含这些文件的软件包,最终确定并安装所有必要的依赖项,从而成功运行软件。

你有没有尝试编译一个开源软件,结果发现你忘记安装它的某个原生依赖项了?或者,也许某个二进制文件“从卡车后面掉了下来”,你想尝试运行它,但不知道它需要哪些共享库。或者,也许你需要使用一个打包很差的软件,它的维护者忘记列出原生依赖项。

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

这是 Deptective 自动查找 jq 的所有构建时依赖项:

Deptective jq demo - YouTube

Photo image of trailofbits

trailofbits

2.89K subscribers

Deptective jq demo

trailofbits

Search

Watch later

Share

Copy link

Info

Shopping

Tap to unmute

If playback doesn't begin shortly, try restarting your device.

More videos

More videos

You're signed out

Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.

CancelConfirm

Share

Include playlist

An error occurred while retrieving sharing information. Please try again later.

Watch on

0:00

0:00 / 2:05 •Live

Watch on YouTube

等等,不是已经有一个工具可以做这个了吗?

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

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

Deptective 在精神上类似于 nix-autobahn,但 Deptective 不与 Nix 绑定,还可以枚举任意运行时依赖项。

它是如何工作的?

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

Deptective’s dependency exploration and backtracking strategyFigure 1: Deptective 的依赖项探索和回溯策略

跟踪

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

找到要安装的正确软件包

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

安装潜在的依赖项

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

尝试一下

与我们所有的开源工具一样,你可以在我们的 GitHub 上找到 Deptective。按照 README 中编写的说明进行设置和运行。

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

  • 原文链接: blog.trailofbits.com/202...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Trail of Bits
Trail of Bits
https://www.trailofbits.com/