关于Vanir
Vanir是是一款基于源代码的静态分析工具,可自动识别目标系统中缺失的安全补丁列表。默认情况下,Vanir 会从开源漏洞 (OSV) 中提取最新的 CVE 及其相应的签名,以便用户可以透明地扫描缺失的补丁以获取最新的 CVE 列表。
Vanir 目前支持 C/C++ 和 Java 源代码,Google 提供的 Vanir 签名涵盖自 2020 年 7 月以来通过Android 安全公告发布的 CVE。Vanir 的主要设计目的是以可持续且可扩展的方式检测缺失的安全补丁,且误报率较低。
工具特性
1、代码差异容忍度: Vanir 可以从定制补丁中识别出缺失的安全补丁。这对于下游分支维护者(例如 Android 设备供应商和自定义内核维护者)尤其有益,他们通常需要对上游代码进行额外更改以使其适应他们的设备,并且还希望确保其设备的安全性与最新的安全更新保持一致。
2、与元数据无关的检测: Vanir 从根本上不依赖目标系统的元数据,例如版本号、提交历史记录和 SBOM。Vanir 直接分析目标系统的实际源代码并确定需要特定安全补丁的文件/功能。虽然 Vanir 用户可以选择通过提供元数据来过滤掉不需要的发现,但其核心检测逻辑与元数据无关。这使 Vanir 用户可以灵活地使用该工具,并使用各种选项来实现不同的目的。
3、自动签名生成: Vanir 签名生成过程高度自动化,使漏洞发布者(如 CNA 和生态系统安全维护者)能够有效利用 Vanir 并确保其下游分支维护者采用安全补丁,从而简化工作流程并优化资源分配。
4、运行时间:由于 Vanir 使用基于源代码的静态分析来检测缺失的补丁,因此与基于二进制的静态分析工具或动态分析工具相比,运行时间会更短。
5、透明度: Vanir 是一款独立的、完全开源的应用程序。这使用户能够独立调查和解决 Vanir 发现的任何漏洞,而无需依赖或受外部服务提供商的响应阻碍。
6、持续更新的漏洞数据: Vanir 工具与漏洞数据分离,Vanir 的更新 Android 漏洞数据将由OSV中的 Google Android 安全团队维护。这样一来,Vanir 用户只需运行 Vanir 即可获得最新的漏洞数据,而无需每月更新。其他 CNA或系统安全维护人员的进一步贡献将使用户能够将 Vanir 用于其他生态系统。
7、CI/CD 集成: Vanir 也以 Python 库的形式提供。用户可以将 Vanir 库集成到自己的自动化管道中,以高度自动化和系统化的方式验证任何缺失的补丁。
工具架构
工具要求
requests
absl-py
mmh3
unidiff
jinja2
typing_extensions>=4,<5
python-dateutil
工具安装
由于该工具基于Python 3开发,因此我们首先需要在本地设备上安装并配置好最新版本的Python 3环境。
接下来,广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone https://github.com/google/vanir.git
然后切换到项目目录中,使用pip命令和项目提供的requirements.txt安装该工具所需的其他依赖组件:
cd vanir pip install -r requirements.txt
工具使用
根据所有已知签名扫描其中的所有存储库:
./bazel-bin/detector_runner repo_scanner Android ~/android-src
针对位于的本地内核代码运行:
./bazel-bin/detector_runner android_kernel_scanner /tmp/test_kernel
针对本地检出的 Android 框架/基本源运行:
./bazel-bin/detector_runner \ package_scanner Android platform/frameworks/base /tmp/test_fwk_base
针对目录中所有受支持的源文件的所有签名运行:
./bazel-bin/detector_runner \ {{ '<strong>' }}--target_selection_strategy all_files{{ '</strong>' }} \ offline_directory_scanner /some/directory/with/code
下列命令即可输出结果:
Scanned 833 source files (skipped 106253 source files likely unaffected by known vulnerabilities). Found 12 potentially unpatched vulnerabilities: CVE-2020-11116, CVE-2020-26139, CVE-2020-26141, CVE-2020-26145, CVE-2020-26146, CVE-2020-3698, CVE-2021-0476, CVE-2021-1977, CVE-2021-30319, CVE-2022-22065, CVE-2022-25670, CVE-2023-43534 Detailed report: - /tmp/vanir/report-20240321182302.html - /tmp/vanir/report-20240321182302.json
报告文件示例:
{ "options": "--target_root=/tmp/test_kernel_simple --vulnerability_file_name=/tmp/vanir_vul_with_sign_20230705.json", "covered_cves": [ "CVE-2017-18509", ... "CVE-2023-20938" ], "missing_patches": [ { "ID": "ASB-A-174737742", "CVE": [ "CVE-2020-15436" ], "OSV": "https://osv.dev/vulnerability/ASB-A-174737742", "details": [ { "unpatched_code": "fs/block_dev.c::blkdev_get", "patch": "https://android.googlesource.com/kernel/common/+/49289b1fa5a67011", "matched_signature": "ASB-A-174737742-1030258c" }, { "unpatched_code": "fs/block_dev.c", "patch": "https://android.googlesource.com/kernel/common/+/49289b1fa5a67011", "matched_signature": "ASB-A-174737742-339e9e91" } ] }, ... { "ID": "ASB-A-185125206", "CVE": [ "CVE-2021-39698" ], "OSV": "https://osv.dev/vulnerability/ASB-A-185125206", "details": [ { "unpatched_code": "fs/signalfd.c::signalfd_cleanup", "patch": "https://android.googlesource.com/kernel/common/+/9537bae0da1f", "matched_signature": "ASB-A-185125206-c9d43168" }, { "unpatched_code": "fs/signalfd.c", "patch": "https://android.googlesource.com/kernel/common/+/9537bae0da1f", "matched_signature": "ASB-A-185125206-e8972c8a" } ] } ] }
工具运行演示
假设目标项目源代码路径为~/my/android/repo,可以直接运行下列命令:
bazel build //:detector_runner ./bazel-bin/detector_runner repo_scanner Android ~/my/android/repo
接下来,可以直接在/tmp/vanir/report-YYYYMMDDhhmmss.html和/tmp/vanir/report-YYYYMMDDhhmmss.json中找到Vanir识别出的缺失补丁。
HTML 报告文件:
许可证协议
本项目的开发与发布遵循BSD-3-Clause开源许可协议。
项目地址
Vanir:【GitHub传送门】