
@sigstore/oci の CVE-2026-59891 に特化した、隔離されたリグレッションおよびセキュリティ統制ラボ
@sigstore/oci の実際の脆弱バージョンと修正バージョンを同じ入力で比較し、
環境別の露出条件を点検する隔離型の演習および read-only 監査
プロジェクトです。
このプロジェクトの CVE Reporter は gyubin02 です。
採用・面接用の要約: CVE-2026-59891 脆弱性管理自動化の事例
CVE-2026-59891 の核心は、レジストリの認証情報を選ぶ際に発生する ホスト名の混同です。
0.7.0: cr.io が ghcr.io 文字列の中にあるという理由で
ghcr.io の認証情報を選択できます。0.7.1: ホスト名を正規化した上で、正確に一致する認証情報のみを
選択します。このリポジトリは、まず2つのクレデンシャル選択シナリオを自動 検証します。
ghcr.io の認証情報しかないのに、対象は cr.iocr.io の認証情報がある脆弱バージョンは最初のシナリオで認証情報を誤って選択し、修正 バージョンは拒否する必要があります。両バージョンとも2番目の正常 シナリオは成功する必要があります。
ここに、実際の外部レジストリの代わりに 127.0.0.1 の使い捨てモック
レジストリを使用した動的比較を追加しました。脆弱バージョン 0.7.0 は
ローカルに2件のリクエストを行い、認証チャレンジの後の2番目の
リクエストで合成された Authorization ヘッダーが観察されます。修正
バージョン 0.7.1 はクレデンシャル選択段階で拒否されるため、リクエスト
は0件です。結果にはヘッダーの値の代わりに、観察の有無とリクエスト数
のみが残ります。
cve-2026-59891-audit は、対象プロジェクトの package-lock.json と
明示的に指定した Docker config の メタデータのみ を読み取り、以下を
識別します。
@sigstore/oci のインストール場所とバージョン合成フィクスチャですぐに実行:
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: コードと許可リストで destination が制限されていることを確認untrusted: 外部入力や workflow 入力が destination に影響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 の結果は 合成環境の動作の違いのみを証明し、実際の企業環境におけるクレデンシャルの 露出・侵害や統制効果を証明するものではありません。CISA 資格、ISMS-P 認証、または特定組織の規程準拠を意味するものではありません。Node API guard はロックした依存関係の観察された実行経路のための防御層であり、 OS レベルの network namespace やファイアウォールではありません。
詳細な範囲、テスト、リスクおよび統制のドキュメントは docs/ にあり、
npm run evidence は再現可能な実行証跡と SHA-256 manifest を
生成します。