跳转到主要内容

扫描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 (228.3 kB 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面