代码依赖分析利器it-depends:自动检测漏洞与依赖关系

本文介绍Trail of Bits开源的it-depends工具,支持自动枚举代码库依赖关系并检测已知漏洞,涵盖cargo、npm、pip等多语言生态,通过递归构建依赖图识别潜在安全风险。

你的代码使用了什么?是否存在漏洞?It-Depends!- Trail of Bits博客

Evan Sultanik
2021年12月16日
supply-chain, research-practice

你刚克隆了一个新的源代码仓库,想要快速了解其依赖关系。我们的工具it-depends可以帮你实现这一目标。

我们自豪地宣布发布it-depends,这是一个用于自动枚举依赖关系的开源工具。你只需将其指向源代码仓库,它就会构建包含所需依赖关系的图谱。it-depends目前支持cargo、npm、pip、go、CMake和autotools代码库,其关联包管理器中的软件包,以及Ubuntu apt。

现代编程语言和打包框架越来越多地包含用于枚举依赖关系甚至将其映射到已知漏洞的实用程序(例如npm audit、cargo audit和pip-audit)。it-depends将这些功能统一到一个工具中,并支持autotools和CMake等没有类似工具的语言和框架。只需在源代码仓库的根目录运行it-depends,该工具就会为仓库可能依赖的所有软件包生成软件物料清单(SBOM)。it-depends不仅检测已知易受攻击的依赖项,还识别仓库内的重复功能,这可以支持软件减负工作。“为什么这个仓库同时使用libsodium和libssl?”

it-depends使用CVEdb和Google的开源漏洞(OSV)数据库来确定哪些已知漏洞可能从任何软件包中触及。找到匹配条目后,该工具会生成代码仓库或软件包中所有可触及CVE的全面列表。

现有方法通常仅解析直接依赖项或依赖包锁定文件。相比之下,it-depends从源代码仓库或软件包规范开始递归构建项目的依赖关系图,枚举所有可行依赖项解析的超集,而不仅仅是单一解析。这有助于识别可能仅在所有可行依赖项解析宇宙的子集中存在的潜在上游漏洞。

现有解决方案停留在其包管理生态系统的围墙花园内。相比之下,it-depends能够检测本地库的使用和相互依赖关系。例如,it-depends正确识别Python包pytz依赖于本地库libtinfo6,而libtinfo6本身依赖于libcrypt1,libcrypt1又依赖于libc6,依此类推。

it-depends可以生成SBOM、依赖关系图或交互式HTML页面

为什么枚举依赖关系很困难

  • 语义版本控制:我们不仅关心系统上安装的特定版本;我们还想推理所有可以满足依赖关系的可能版本。
  • 一些构建系统(如autotools和CMake)没有包的概念,而且本地库版本控制没有明确定义。
  • 如果使用高级语言(如Python或JavaScript)编写的软件包使用本地库怎么办?
  • 将CVE映射到源代码包并非易事。

基本功能(常规操作)

it-depends用Python编写,易于扩展。它建立在一组可插拔解析器之上,用于处理不同的包管理器和源代码仓库。每个解析器充当其特定包宇宙的预言机,扩展全局依赖关系图。为新的构建系统或包管理器添加解析器基本上只需要实现一个解析方法:

1
2
3
4
5
6
from it_depends.dependencies import DependencyResolver, Dependency, Package

class CustomResolver(DependencyResolver):
    def resolve(self, dependency: Dependency) -> Iterator[Package]:
        """Yields all packages that satisfy the given dependency"""
        raise NotImplementedError("TODO: Implement")

本地解析(不那么秘密的秘诀)

it-depends具有一个通用插件,用于推断给定软件包的本机操作系统级依赖关系。为实现这一目标,每个软件包都安装在容器中,并使用ptrace监控本地库。文件访问被转换为提供软件包加载的库文件的Ubuntu软件包,并且从Ubuntu软件包仓库中提取本地间依赖关系。建立基线以移除当前正在分析的软件包类型固有的软件包。

亲自尝试!

it-depends是免费开源的。你可以通过运行pip3 install it-depends来安装它。该工具的GitHub页面上提供了进一步的安装说明。请尝试一下,并告诉我们它的效果如何!

致谢

it-depends由Trail of Bits根据DARPA根据合同号HR001120C0084(分发声明A,批准公开发布:无限制分发)支持的工作开发。本材料中表达的任何意见、发现和结论或建议均为作者的观点,不一定反映美国政府或DARPA的观点。

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

页面内容

  • 为什么枚举依赖关系很困难
  • 基本功能(常规操作)
  • 本地解析(不那么秘密的秘诀)
  • 亲自尝试!
  • 致谢

近期文章

  • 使用Deptective调查你的依赖关系
  • 系好安全带,Buttercup,AIxCC的评分回合正在进行中!
  • 使你的智能合约超越私钥风险
  • Go解析器中意外的安全陷阱
  • 我们审查首批DKLs23库的收获
  • Silence Laboratories的23个库

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

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