Vanir:一款基于基于源代码的静态分析工具

科技   2025-01-18 10:02   上海  

关于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

https://github.com/google/vanir


FreeBuf粉丝交流群招新啦!
在这里,拓宽网安边界
甲方安全建设干货;
乙方最新技术理念;
全球最新的网络安全资讯;
群内不定期开启各种抽奖活动;
FreeBuf盲盒、大象公仔......
扫码添加小蜜蜂微信回复「加群」,申请加入群聊】





FreeBuf
中国网络安全行业门户
 最新文章