针对 CVE-2026-96889 的离线 Sharp / librsvg 证据检查工具。提供 Sharp 和 librsvg 的版本与构建证据。独立 Python 实现;支持 JSON/CSV/HTML 报告;不含漏洞利用载荷。
一个针对 CVE-2026-96889 / GHSA-wq5f-xc86-pv6w 的离线证据检查器,该漏洞是通过 Sharp 使用的 librsvg 内存漏洞。它对你所报告的版本、来源和配置进行分类;它不会检查正在运行的系统。
该检查器将选定的原生库、报告的版本、来源、平台、libc、SVG 输入路径和加固措施分开处理。它不会导入 Sharp、执行应用程序、解码图像、发送探测、测试可达性或检测入侵。每个结果都保留 exploitability: not_tested。
结果描述的是所提供的证据,而非经过验证的运行时状态。仅对你获授权评估的资产使用该检查器,并将真实清单和报告保存在版本控制之外。
python3 或带版本号的可执行文件;python --version 必须报告 3.10 或更高版本。sharp_rsvg_rce_check.py。无需任何软件包、Node.js、配套文件或网络访问。python sharp_rsvg_rce_check.py --sharp-version 0.35.4 --library-source bundled --sharp-build-source upstream
python sharp_rsvg_rce_check.py --sharp-version 0.35.5 --library-source bundled --sharp-build-source upstream
python sharp_rsvg_rce_check.py --library-source global --librsvg-version 2.63.2 --librsvg-build-source upstream
python sharp_rsvg_rce_check.py --inventory examples/inventory.json --format json
python sharp_rsvg_rce_check.py --inventory examples/inventory.json --format html --output report.html
前两条命令评估下方的官方 Sharp 捆绑包及其报告的修复版本,第三条评估一个独立报告的全局 librsvg,最后两条评估一个合成清单。examples/inventory.json 是合成的。未指定 --output 时,报告会打印到 stdout(默认 JSON)。
打开合成示例报告。仅为示例数据;这不是实时评估。预览图是该示例的截图,并非来自真实系统的输出。
运行 python sharp_rsvg_rce_check.py --help 查看完整选项列表。提供清单、至少一个报告版本或显式适配器文件:
--inventory FILE,一个有界 schema-v1 JSON 清单。它不能与按资产选项组合使用。--sharp-version、--librsvg-version、--library-source、--platform、--libc、--node-pie、--svg-decoder 和 --untrusted-svg。--sharp-version 和 --librsvg-version 可重复指定,以便保留冲突的观测结果而不是合并它们。--evidence-root(参见本地元数据和源适配器)。不会隐式扫描任何目录。字段值、边界和清单格式见参考和清单 schema。
--library-source bundled 表示部署进程被报告使用官方 Sharp 捆绑包。--sharp-build-source upstream 是操作员声明,不是经过验证的来源。--library-source global 并配合独立的原生库证据(--librsvg-version、--librsvg-build-source)。| 状态 | 含义 |
|---|---|
unknown | 选择、确切版本、来源或支持的规则覆盖范围无法确定所选组件的补丁状态。 |
potentially_affected | 报告的官方 Sharp 捆绑包低于其修复版本。运行时条件另行考虑;这并不确认可利用性。 |
precondition_present | 该受影响捆绑包与操作员报告的条件符合文档中描述的可能 RCE 条件。未执行实时验证。 |
mitigated_configuration | 受影响捆绑包仍被记录,同时操作员报告有效的 SVG 阻止或 Node PIE。这不是已修补或安全的结果。 |
fixed_version_reported | 所选组件达到其经审查的修复阈值。这并不证明已部署的二进制文件或补丁集。 |
所选组件的版本评估与其平台、前置条件和缓解维度是分开的。fixed_version_reported 是报告版本结果:它既不是经过验证的已部署补丁,也不是安全保证,而 potentially_affected 不是已确认的可利用性。全局结果分类的是独立提供的原生库,而不是已安装的 Sharp 包。
缺少 libc 或 PIE 在前置条件维度中仍为 unknown。非 glibc 平台或报告不存在不可信输入路径,并不能清除底层内存缺陷。PIE 针对的是文档中描述的 RCE 条件;其他内存破坏影响仍可能存在。
操作失败(退出码 2)与评估结果不同。
| 退出码 | 含义 |
|---|---|
0 | 已完成且没有启用的门禁匹配。未知证据默认不会导致失败。 |
1 | --fail-on-finding 匹配到受影响版本,包括 mitigated_configuration,因为补丁仍需审查;或 --fail-on-unknown 匹配到未知版本评估或受影响版本上未解决的条件。这两个门禁相互独立。 |
2 | 参数、输入或输出错误,硬限制或 schema 校验失败。 |
130 | 已中断。当报告可以写入时,已完成的资产会以 complete=false 保留。 |
在完整报告发布后发生中断会保留该报告并以 130 退出。如果中断导致文件发布状态不确定,检查器会以 130 退出且不重试;在重试前请检查输出,因为诊断信息无法确定发布是否成功。一旦 stdout 发布开始,中断可能留下部分文档,并且不会追加第二份报告。
维护者公告和 GitHub 公告记录已于 2026-10-24 审查。
| 证据 | 已实现的比较 |
|---|---|
| 官方 Sharp 捆绑包 | 低于 0.35.5 的稳定 0.x 可能受影响;0.35.x 内的 0.35.5+ 是已报告的修复。未来发布线在此快照中保持未知。 |
| 全局 librsvg | 独立上游 2.63.x 内的 2.63.2+ 是已报告的修复。更早版本保持未知,需要供应商审查:公告指明了修复,但没有单独给出原生库受影响范围的下界。 |
| 供应商/自定义/未知构建来源 | 未知;上游包版本号不能确定是否存在向后移植或自定义补丁集。 |
生效的 VipsForeignLoadSvg 阻断 | 单独的解码器缓解声明。 |
| 使用 PIE 编译的 Node 可执行文件 | 单独的 RCE 缓解声明;不是库补丁。 |
格式错误、相互冲突、带限定条件、预发布以及未覆盖的未来版本保持未知。相互矛盾的 Sharp/原生库观察结果也保持未知。内嵌快照没有更新器,运行时评估从不获取规则更新;请查阅当前供应商指南以进行修复。规则来源见方法论。
python sharp_rsvg_rce_check.py --npm-lock examples/package-lock.example.json --evidence-root examples
python sharp_rsvg_rce_check.py --source examples/source.example.js --evidence-root examples --format html
python sharp_rsvg_rce_check.py --node-elf path/to/node --evidence-root path/to
python sharp_rsvg_rce_check.py --sbom path/to/bom.json --evidence-root path/to
可重复使用的 --npm-lock、--sbom、--node-elf 和 --source 选项需要 --evidence-root。所选文件必须解析到该目录内;报告中的路径为相对路径。它们可以与现有的清单或版本输入一同使用,但会生成单独的 adapter-* 资产记录。生成的标识符不得与提供的清单 ID 冲突。不会进行目录搜索、包管理器操作、应用程序导入、原生执行或镜像解码。
所有适配器结果均保持为 unknown,可利用性为 not_tested。元数据无法识别已部署的原生库选择或发布者补丁来源。它绝不会填充操作者前置条件、更改单独的版本评估或确立有效的缓解措施。现有的 schema 1.0 证据契约将这些观察结果作为清单/来源证据和位置进行承载;JSON、CSV 和 HTML 使用相同的已验证记录。
| 适配器 | 行为与限制 |
|---|---|
| npm lock(v1/v2/v3) | 提取 Sharp 包版本观察结果,包括嵌套实例和显式别名。链接的、格式错误的和带限定符的标识保持为 unknown。旧版 v2 依赖记录是单独的、不确定的观察结果,绝不用于清除冲突的主条目。不收集注册表 URL 和脚本。受支持范围为空并不代表不存在。 |
| SBOM | JSON CycloneDX 1.4/1.5/1.6 和 SPDX 2.2/2.3 的 Sharp/librsvg 包元数据。名称和版本仍为提供的元数据,而非链接证据;不获取外部引用,也不打开任何包路径。CycloneDX 组件命名空间(group)必须为文本;非空命名空间不会被当作未限定作用域的 Sharp/librsvg 标识。嵌套组件会被独立遍历。不支持的标识仍为 unknown 覆盖范围。 |
ELF(--node-elf) | 读取标识/头部、最多 1,024 个标准大小的程序头以及一个解释器字符串(最多 512 字节)。支持两种字节序的 ELF32/64;文件大小限制为 2 GiB,元数据读取限制为 58 KiB。截断的或超出文件的表/段、重复的解释器、扩展头部计数以及不支持的布局会被拒绝。带解释器的 ET_DYN 是动态可执行文件候选;单独的 ET_DYN 也可能是共享库或静态 PIE。ET_EXEC 和解释器基名提示会被报告,但不主张 Node 身份、已加载的 libc、运行时 PIE、补丁状态或安全性。不报告确切的加载器路径。不分析其他加固特性。 |
源代码(--source) | 显式选择的 JS/TS 文件。简单的 Sharp 默认导入和 CommonJS 绑定可识别工厂以及 block/unblock 调用候选,并附带相对行号。有界本地窗口中的 SVG 加载器标记可能属于无关代码。无匹配、缺少标记、未知选项、非活动块、变量遮蔽、顺序或动态语法绝不构成有效的阻断或输入信任。模板以及正则/除法歧义需要人工审查。不报告源代码字符串和片段。 |
预算:100 个适配器文件、1,000 条合并结果记录、有界的 4 MiB JSON/文本读取以及现有的 JSON 结构/深度限制;10,000 个包元数据条目、每个文件 200,000 个源令牌以及每个文件 100 个源候选。普通常规文件检查需要稳定的证据副本,而非文件系统沙箱。输出保护包括所有选定的证据文件和别名,即使使用 --force 也是如此。--fail-on-unknown 包含这些 unknown 适配器记录。
格式来源已于 2026-10-25 审查:Linux ELF 头/程序头布局、npm lock 语法、CycloneDX 1.6 schema 和 SPDX 包字段。Linux Foundation gABI 页面访问被拒绝;未绕过任何访问限制。公告阈值、规则日期和原生受影响范围的不确定性保持不变。