以相同输入比较 @sigstore/oci 的实际易受攻击版本与修复版本,
并检查各环境下的暴露条件的隔离式实验与只读审计
项目。
本项目的 CVE Reporter 是 gyubin02。
招聘·面试用摘要: CVE-2026-59891 漏洞管理自动化案例
CVE-2026-59891 的核心是在选择 Registry 认证信息时发生的 hostname 混淆。
0.7.0:由于 cr.io 存在于 ghcr.io 字符串之中,
可能会选择 ghcr.io 认证信息。0.7.1:对 hostname 进行规范化后,仅选择完全匹配的
认证信息。本仓库首先自动验证两种 credential 选择场景。
ghcr.io 认证信息,而目标是 cr.iocr.io 认证信息易受攻击版本在第一个场景中会错误地选择认证信息,修复 版本则应当拒绝。两个版本在第二个正常场景中都应当 成功。
在此基础上,还添加了使用 127.0.0.1 上的一次性 mock
Registry 而非真实外部 Registry 的动态比较。易受攻击版本 0.7.0
会向本地发起 2 次请求,并在认证 challenge 之后的第二次请求中观察到合成的
Authorization header。修复版本 0.7.1 在 credential
选择阶段即被拒绝,请求数为 0。结果中不保留 header 值,仅保留
是否观察到以及请求数。
cve-2026-59891-audit 仅读取目标项目的 package-lock.json 和
显式指定的 Docker config 的 metadata,以区分以下内容。
@sigstore/oci 安装位置与版本使用合成 fixture 直接运行:
npm run audit:demo
检查其他 Node.js 项目:
npm run audit:project -- \
--project ../target-project \
--docker-config ../review-copy/config.json \
--image cr.io/example/demo \
--destination-trust unknown \
--format markdown \
--output reports/cve-2026-59891.md
--destination-trust 必须明确指定以下之一。
trusted:已确认目标受代码和允许列表限制untrusted:外部输入或工作流输入会影响目标unknown:尚未确认判定分为 exposure_conditions_met、potential_exposure、
affected_component_only、not_detected、indeterminate。
not_detected 也只是针对已记录输入范围的结果,
并不意味着“安全”或“合规”。
~/.docker/config.json。HOME 和无价值的
lab-user / LAB_ONLY_FAKE_TOKEN。HOME、实验室标记和假值全部准确时,才调用包。fetch
调用。127.0.0.1 端口发起 HTTP 请求。外部及其他
端口的 HTTP、DNS resolver、TLS、UDP、全局 fetch·WebSocket 均
被拦截。--docker-config,且不会从 HOME 或
DOCKER_CONFIG 推断文件。npm-shrinkwrap.json,不会断言其安全,而是失败。由于会故意安装存在漏洞的包,npm package 发布已通过
"private": true 阻止。不得将其用作产品代码的依赖。
因此,npm audit 报告 0.7.0 是预期结果,
例外的范围和原因已记录在 SECURITY.md 中。
要求:Node.js 22.22.2+、24.15.0+ 或 26 以上。推荐版本已固定于
.nvmrc。
npm ci --ignore-scripts
npm test
npm run demo
npm run dynamic:demo
npm run audit:fixture
npm run audit:demo
npm run evidence
npm run demo 的核心预期结果:
0.7.0 collision credential-selected
0.7.1 collision credential-rejected
0.7.0 exact credential-selected
0.7.1 exact credential-selected
Regression result: PASS
npm run dynamic:demo 的核心预期结果:
{
"vulnerable": {
"packageVersion": "0.7.0",
"credentialSelection": "credential-selected",
"requestCount": 2,
"authorizationObserved": true,
"digestVerified": true,
"networkPolicy": "exact-loopback-only"
},
"fixed": {
"packageVersion": "0.7.1",
"credentialSelection": "credential-rejected",
"requestCount": 0,
"authorizationObserved": false,
"digestVerified": false,
"networkPolicy": "exact-loopback-only"
},
"regressionResult": "PASS"
}
全自动化测试共 34 个。npm run evidence 会生成检查对象
6 个产物,加上用于验证其完整性的 SHA256SUMS,共 7 个
文件。
本项目是受限的教育性控制评估。loopback 结果仅证明 合成环境中的行为差异,并不证明实际企业环境中的 credential 暴露、侵害或控制效果。不代表 CISA 资质、ISMS-P 认证或特定组织的合规。Node API guard 是针对已锁定 dependency 的已观察执行路径的防御层, 并非 OS 级 network namespace 或防火墙。
详细的范围、测试、风险与控制文档位于 docs/,
npm run evidence 会生成可复现的执行证据与 SHA-256 manifest。