
cve-2026-59891-control-lab v0.3.0
@sigstore/oci の CVE-2026-59891 に特化した、隔離されたリグレッションおよびセキュリティ統制ラボ
CVE-2026-59891 Regression & Control Lab
@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つのクレデンシャル選択シナリオを自動 検証します。
- collision:
ghcr.ioの認証情報しかないのに、対象はcr.io - exact: 対象と正確に一致する
cr.ioの認証情報がある
脆弱バージョンは最初のシナリオで認証情報を誤って選択し、修正 バージョンは拒否する必要があります。両バージョンとも2番目の正常 シナリオは成功する必要があります。
ここに、実際の外部レジストリの代わりに 127.0.0.1 の使い捨てモック
レジストリを使用した動的比較を追加しました。脆弱バージョン 0.7.0 は
ローカルに2件のリクエストを行い、認証チャレンジの後の2番目の
リクエストで合成された Authorization ヘッダーが観察されます。修正
バージョン 0.7.1 はクレデンシャル選択段階で拒否されるため、リクエスト
は0件です。結果にはヘッダーの値の代わりに、観察の有無とリクエスト数
のみが残ります。
プロジェクト露出点検 CLI
cve-2026-59891-audit は、対象プロジェクトの package-lock.json と
明示的に指定した Docker config の メタデータのみ を読み取り、以下を
識別します。
- 影響を受ける
@sigstore/ociのインストール場所とバージョン - 脆弱バージョンの存在と実際の露出条件の充足有無
- レジストリの部分文字列の衝突と JSON key の順序上の実際の選択対象
- 環境別の優先順位、対応事項と再試験手順
- レジストリのホスト名と絶対パスが除去された JSON・Markdown の証跡
合成フィクスチャですぐに実行:
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、ラボのマーカー、偽の値がすべて正確なときだけパッケージを呼び出します。- 既存の選択回帰プローブは、すべての HTTP(S)、TCP、TLS、DNS と
fetch呼び出しをトリップワイヤーとしてブロックします。 - 動的プローブが使用する Node ネットワーク表面では、OS が割り当てた
正確な
127.0.0.1ポートの HTTP リクエストのみ許可します。外部・他の ポートの HTTP、DNS resolver、TLS、UDP、グローバルfetch・WebSocket は 遮断します。 - 子プロセスに現在のセッションのトークン・Docker 環境変数を継承し ません。
- stdout/stderr と監査結果には偽のヘッダーさえ保存せず、 boolean とリクエスト数のみを残すことをテストします。
- 点検 CLI は
--docker-configを省略できず、HOME やDOCKER_CONFIGからファイルを推測しません。 - CLI はクレデンシャルの値を decode・hash・出力せず、対象プロジェクト のパッケージ・Docker・credential helper を実行したり、ネットワークに 接続したりしません。
- symlink、重複 JSON key、サポートしていない lockfile、優先順位がより高い
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個の
ファイルを生成します。
このプロジェクトが示す能力
- 実際の CVE の発生条件をコードレベルで説明し、安全に再現
- 脆弱バージョンと修正バージョンを同一条件で比較する回帰テスト設計
- 合成クレデンシャルのローカル送信有無まで動的に比較する loopback-only 試験設計
- 公開 CVSS とは別に、実際の環境の攻撃前提条件を評価
- package-lock v1・v2・v3、エイリアスとネストした依存関係を静的に識別
- 秘密情報を除外した JSON・Markdown 監査証跡の自動生成
- 発見 → 影響分析 → 修正検証 → 統制へと続く脆弱性管理
- 実際の認証情報に触れないフェイルセーフ型セキュリティテスト
出典と範囲
このプロジェクトは限定された教育用の統制評価です。loopback の結果は 合成環境の動作の違いのみを証明し、実際の企業環境におけるクレデンシャルの 露出・侵害や統制効果を証明するものではありません。CISA 資格、ISMS-P 認証、または特定組織の規程準拠を意味するものではありません。Node API guard はロックした依存関係の観察された実行経路のための防御層であり、 OS レベルの network namespace やファイアウォールではありません。
詳細な範囲、テスト、リスクおよび統制のドキュメントは docs/ にあり、
npm run evidence は再現可能な実行証跡と SHA-256 manifest を
生成します。