扫描Nix存储库中受漏洞影响的所有派生。
项目描述
Nix(OS) 漏洞扫描器
这是一个验证Nix存储库中所有可从活动路径访问的包的实用程序,这些包可能受到NVD中列出的漏洞的影响。
它实现了一个CLI实用程序来检查当前状态,以及Sensu的监控集成。
示例输出
2 derivations with active advisories ------------------------------------------------------------------------ binutils-2.31.1 /nix/store/zc1lbkaf9l9hlsp1jdiq3si56nsglymh-binutils-2.31.1.drv CVE CVSSv3 https://nvd.nist.gov/vuln/detail/CVE-2018-1000876 7.8 https://nvd.nist.gov/vuln/detail/CVE-2018-20657 7.5 https://nvd.nist.gov/vuln/detail/CVE-2018-20712 6.5 ------------------------------------------------------------------------ libssh2-1.9.0 /nix/store/mfpfclry68r4sv4mcc9hb88z0lb9jk1c-libssh2-1.9.0.drv CVE CVSSv3 https://nvd.nist.gov/vuln/detail/CVE-2019-17498 8.1
工作原理
vulnix 从 NIST 拉取所有已发布的CVE,并将其本地缓存。它将所有从命令行引用的派生名称和版本与已知的CVE条目进行匹配。使用白名单过滤掉不需要的结果。
将 Nix 包名称匹配到 NVD 产品目前是通过粗略启发式方法实现的。首先尝试直接匹配。如果找不到产品,则尝试使用小写字母和下划线代替破折号进行变体匹配。很明显,这种映射过于简单,需要在未来的版本中改进。
系统要求
依赖于常见的 Nix 工具,如 nix-store。这些工具预期在 $PATH 中。
依赖于能够与 Nix 存储数据库(/nix/var/nix/db)交互。这意味着它必须以拥有 Nix 存储数据库的同一用户身份运行,或者 nix-daemon 必须处于活动状态。
直接解析 *.drv 文件。已测试与 Nix >=1.10 和 2.x 一起使用。
它拒绝在没有某些区域环境设置的情况下工作。如果看到编码错误,请尝试 export LANG=C.UTF-8。
使用示例
为我当前系统列出哪些漏洞
vulnix --system
检查 nix-build 输出及其传递闭包
vulnix result/
检查所有传递的派生项,但不要确定需求
vulnix -R /nix/store/*.drv
用于机器后处理的 JSON 输出
vulnix --json /nix/store/my-derivation.drv
有关所有选项的列表,请参阅 vulnix –help。
白名单
vulnix 输出可能包含误报、无法修复的包或已知已解决的内容。白名单功能允许排除匹配特定标准的包。
用法
从本地文件或 HTTP 服务器加载白名单
vulnix -w /path/to/whitelist.toml \ -w https://example.org/published-whitelist.toml
语法
白名单是包含要过滤的包作为节标题的 TOML 文件,后面跟每个包的进一步选项。
节标题 - 包选择
排除特定版本的包
["openjpeg-2.3.0"] ...
无论版本如何排除包(可能适用额外的 CVE 过滤器,见下文)
["openjpeg"]
排除所有包(下面再次说明 CVE 过滤器)
["*"]
选项
- cve
要匹配的 CVE 标识符列表。只要检测到的 CVE 是此处列出的 CVE 的子集,白名单规则就有效。如果检测到额外的 CVE,则此白名单规则不再有效。
- until
形式为“YYYY-MM-DD”的日期,限制此规则的生存期。在指定日期及以后,此白名单规则不再有效。
- issue_url
指向任何问题跟踪器的 URL 或 URL 列表。仅用于信息。
- comment
包含自由文本的字符串或字符串列表。仅用于信息。
示例
在您最喜欢的问题跟踪器上创建工单。估计修复有漏洞的包所需的时间。创建白名单条目
["ffmpeg-3.4.2"] cve = ["CVE-2018-6912", "CVE-2018-7557"] until = "2018-05-01" issue_url = "https://issues.example.com/29952" comment = "need to backport patch"
此特定版本的 ffmpeg 将在报告中被排除,直到另一个 CVE 发布或指定的日期到来。
CVE 补丁自动检测
vulnix 将检查派生项以查找据说修复特定 CVE 的补丁。当补丁文件名包含一个或多个 CVE 标识符时,这些将不再报告。示例 Nix 代码
patches = [ ./CVE-2018-6951.patch ];
修复多个 CVE 的补丁应该使用非数字分隔符命名它们,例如 CVE-2017-14159+CVE-2017-17740.patch。
即使通过 fetchpatch 和朋友拉取补丁,只要名称中包含 CVE 标识符,自动检测也能正常工作。示例
patches = [ (fetchpatch { name = "CVE-2018-9055.patch"; url = http://paste.opensuse.org/view/raw/330751ce; sha256 = "0m798m6c4v9yyhql7x684j5kppcm6884n1rrb9ljz8p9aqq2jqnm"; }) ];
构建 vulnix
要创建开发环境,请使用 Python 3 virtualenv
python3 -m venv . bin/pip install -e ".[test]"
运行测试
bin/py.test
构建 man 页面
提供的 makefile 需要 ronn 将 Markdown 转换为 troff
make -C doc
更改
1.10.1 (2022-02-06)
在纯文本和 JSON 输出中公开 CVE 描述 (#78)。
修复由于 pyyaml 6.0 而在 nixpkgs-unstable 中引起的不兼容性问题 (#83)。
1.10.0 (2021-07-16)
扩展 -f/–file 输入。现在它还接受包含包名称和应用的补丁的 JSON 输入。
在并发调用上等待而不是失败 (#60)。
忽略没有 cpe23Uri 的 NVD 条目 (#68)。
添加 –profile 选项以扫描用户环境 (#72)。
在并发调用上等待锁定而不是失败 (#73)。
改进了查找派生者的策略 (#74)。
正确处理NVD表达式中同时给定显式版本和版本范围的场景(#77)。
1.9.6 (2020-07-02)
修复flake8检查(#64)。
打包:改进关键词。
1.9.5 (2020-06-30)
添加 -f 选项,可以直接从文件中读取衍生的列表。
默认排除.tgz衍生版本。
更改NIST数据源默认镜像(#61)。
Python 3.8兼容性。
1.9.4 (2019-12-11)
修复“无效包选择器”错误。
1.9.3 (2019-11-26)
默认打印CVSS评分。
修复从旧数据库迁移时的可靠性问题(#58)。
1.9.2 (2019-11-16)
通过预取每个候选漏洞的所有缓存的CPE配置来提高性能。此更改需要重建ZODB数据库,这会透明地进行。
修复在尝试使用新的CVE扩展现有的白名单条目时导致vulnix崩溃的错误(#57)。
1.9.1 (2019-11-14)
修复打包错误。
1.9.0 (2019-11-13)
从https://nvd.nist.gov/feeds/json/cve/1.1/ 拉取NVD数据源,因为XML数据源已被取消(#55)。
为每个CVE打印CVSS v3基本分数。按CVSS分数降序排序(#53)。
在CPE条目中评估版本范围。
1.8.2 (2019-06-17)
正确处理包含连字符的包版本(例如,R版本)(#50)。
1.8.1 (2019-04-08)
同时使用PyYAML 3.13和5.1构建(#49)。
1.8.0 (2019-03-09)
仅在结合 –show-whitelisted 时返回退出代码1(#45)。
修复处理‘until’白名单字段时的错误(#43)。
1.7.1 (2018-07-23)
改进TOML文件包含语法错误时的错误消息。
修复安装要求,使其与上游nixpkgs(NixOS/nixpkgs#43999)匹配。
1.7 (2018-07-20)
选择性CVE报告:仅报告不存在白名单条目的CVE(#41)。
考虑给定包的所有适用的白名单条目(pkg-version,pkg,“*”)(#42)。
细化TOML部分标题检查。
1.6.3 (2018-05-02)
真正修复FC-101294。现在对于包含多行的白名单 :)(#25)
在白名单标题中包和版本之间出现空格时失败。
1.6.2 (2018-05-02)
对JSON输出中的CVE进行排序。
错误修复:如果部分标题未引用,则明确失败(FC-101294)。
1.6.1 (2018-04-20)
使用 __structuredAttrs = true 解析衍生物文件(感谢@adisbladis)。
1.6.0 (2018-04-19)
完全重构白名单子系统。白名单现在可以写成TOML文件,并支持更广泛的表达式选项,包括到期日期。旧YAML语法仍然受支持(#36)。
从补丁文件名猜测CVE标识符时忽略大小写(感谢@adisbladis)。
添加手册页(#29)。
1.4.0 (2017-11-27)
从 patches 衍生环境变量中猜测应用的CVE补丁(参见nixpkgs FC-15660)。
1.3.4 (2017-10-29)
添加‘–no-requisites’标志,停止vulnix确定命令行上传递的衍生物的传递闭包。
使用 –json 提供结构化JSON输出。
从README中删除白名单,因为它现在相当有缺陷。
1.3.3 (2017-10-16)
修复返回代码错误(FC-28741)。
修复同时存在多个漏洞版本的产品的部分白名单问题(#24)。
改进错误报告,以报告不正确构成的 whitelist 规则。
1.3.2 (2017-10-06)
小修:修复打包问题。
1.3.1 (2017-10-06)
安全:修复在派生评估期间执行任意代码的错误。
1.3.0 (2017-09-18)
可以直接在命令行上指定 .drv 文件。
更新PyPI依赖。
记录系统要求(#12)。
不要在 /tmp 中留下大文件。
在输出中移除重复的CVE(#25)。
修复报告少于3个漏洞的错误(#28)。
1.2.2 (2017-01-28)
打包改进:在setup.py中固定版本,在sdist中包含NVDCVE测试数据。
减少NVDCVE固定的大小。这使测试运行时间减少了50%以上。
1.2.1 (2017-01-27)
在系统检查期间跳过 /nix/var/nix/gcroots/booted-system。
通过删除视觉杂乱使输出更容易阅读。
1.2 (2016-12-22)
提高CPU和内存使用:重构了我们获取、解析、存储和处理数据的方式。我们现在利用ZODB作为解析数据的存储,这有助于高效查找。
在我们的测试系统中,这导致内存使用从 > 1GiB 降至 ~70MiB,对现有数据的纯评估时间约为7-10秒。
此更改需要重新检索所有历史源。
至少使用一次烟测试来提高我们新抓取程序的单位测试覆盖率。
1.1.5 (2016-10-13)
保持反向索引:产品名称 -> 漏洞,以加快扫描过程。
用星号标记“进行中”的漏洞。
“-w”开关也接受URL。
vulnix不再扫描 /var/nix/var/gcroots/booted-system
只保存缓存文件(要删除存档)
添加travis构建:定期对nixpkgs/master进行运行,并在成功时更新requirements*.nix文件
1.1.4 (2016-08-25)
将src添加到PYTHONPATH,以便在旧版NixOS版本上运行测试(在15.09上测试过)。
修正URL,添加元数据。
将nix添加到传播的构建输入中,因为vulnix在运行时调用nix-store。
1.1.3 (2016-08-16)
将Python版本锁定为3.4(仅限Nix)
1.1.2 (2016-08-15)
将Nix表达式(Nix/NixOS)添加到MANIFEST.in
1.1.1 (2016-08-12)
将VERSION添加到MANIFEST.in
1.1 (2016-08-11)
扫描整个系统(仅限NixOS),当前用户环境或项目特定的路径(例如,./result)。 #1
除了内置的默认白名单外,还可以指定特定站点的白名单。 #4
使用default.nix完全可重复安装。感谢Rok Garbas。 #4
缓存预解析的NVD文件以提高扫描速度。 #2
支持多个白名单(重复-w选项)。 #3
在~/.cache/vulnix中缓存NVD文件。 #7
记录白名单文件格式。 #10
修复macOS上的Nix构建。 #11
项目详情
vulnix-1.10.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d5310cc8475fc422e902de9af6a9507b4444fe2cc4469a39d56b44b8776b631f |
|
MD5 | 6afc41f473c0d8fc48d31af78bf5462f |
|
BLAKE2b-256 | dd7110628b64cb89ca079ad627395e602ed06e750e7891713207f37f2a872ce4 |