代码依赖分析利器it-depends:自动检测漏洞与依赖关系
您刚刚克隆了一个新的源代码仓库,想要快速了解其依赖关系?我们的工具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编写且易于扩展。它建立在一组可插拔解析器之上,用于处理不同的包管理器和源代码仓库。每个解析器充当其特定包宇宙的预言机,扩展全局依赖关系图。为新的构建系统或包管理器添加解析器基本上只需要实现一个resolve方法:
|
|
本地解析(独特秘方)
it-depends具有通用插件功能,可推断给定软件包的本机操作系统级依赖关系。为实现这一目标,每个软件包都安装在容器中,并使用ptrace监控本地库。文件访问被转换为提供软件包加载的库文件的Ubuntu软件包,并且从Ubuntu软件包仓库中提取本地间依赖关系。建立基线以移除当前正在分析的软件包类型固有的软件包。
亲自尝试!
it-depends是免费开源的。您可以通过运行pip3 install it-depends
来安装它。进一步的安装说明可在该工具的GitHub页面上找到。请尝试使用,并告诉我们它的效果如何!
致谢
it-depends由Trail of Bits根据DARPA合同号HR001120C0084(分发声明A,批准公开发布:无限制分发)支持的工作开发。本材料中表达的任何意见、发现、结论或建议均为作者的观点,不一定反映美国政府或DARPA的观点。