代码依赖与漏洞检测: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)。它不仅检测已知漏洞依赖,还能识别仓库内的重复功能,助力软件瘦身。例如:“为何该仓库同时使用libsodium和libssl?”
漏洞检测机制
it-depends使用CVEdb和Google开源漏洞(OSV)数据库来确定任何软件包中可能存在的已知漏洞。匹配到相应条目后,工具会生成代码仓库或软件包中所有可访问CVE的完整列表。
技术优势
递归依赖解析
现有方法通常仅解析直接依赖或依赖包锁定文件。而it-depends从源代码仓库或包规范开始递归构建项目依赖图,枚举所有可行依赖解析的超集,而非单一解析。这有助于识别仅在所有可行依赖解析子集中存在的潜在上游漏洞。
跨生态依赖检测
现有解决方案局限于其包管理生态内部。it-depends则能检测本地库使用和相互依赖关系。例如,它能正确识别Python包pytz依赖本地库libtinfo6,而后者又依赖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支持开发。本文表达的观点仅代表作者立场,不一定反映美国政府或DARPA的立场。