flawopen.com/リファレンス/Dependency Confusion
Dependency Confusion:パッケージ取得元の混同が起きる仕組み
High Severity
CWE-829: Inclusion of Functionality from Untrusted Control Sphere
ソフトウェアサプライチェーン
やさしい説明 — 名前が似ている仕入先
チームが仕入先カタログから部品を注文するとします。異なる仕入先が同じ商品名を使い、規則で正規の仕入先を指定していなければ、ビルドは意図しない部品を受け取ることがあります。Dependency Confusionは、組織が信頼するつもりのないレジストリや名前空間からパッケージを解決してしまう取得元選択の失敗です。
Boundary: パッケージ名、名前空間、レジストリ設定、ロックファイルの出所
Failure: リゾルバーが意図しない取得元から同名パッケージを取得する可能性
Impact: 未審査のサードパーティコードがビルドに入り、許可時はインストールスクリプトも実行される
Remediation: 明示的な名前空間とレジストリの方針、審査済みロックファイル、最小権限のビルド
Dependency Confusionの発生メカニズム
挙動はパッケージマネージャーと設定によって異なります。pipの公式文書は、プライベートな--index-urlと公開の--extra-index-urlの併用により、同名の公開パッケージが選ばれる可能性を警告しています。npmはscopeまたは既定設定でレジストリを選択し、常に公開版と非公開版を比較して大きい方を選ぶわけではありません。共通の原因は取得元方針の曖昧さです。スクリプトが有効なら、ビルドジョブの権限で実行されます。
pip.conf と requirements.txt(曖昧な取得元)リスクのある設定
[global]
index-url = https://packages.example.internal/simple
extra-index-url = https://pypi.org/simple
corp-auth-utils
.npmrc と package.json(scopeの明示的なルーティング)対策例
@corp:registry=https://packages.example.internal/repository/npm/
{
"dependencies": {
"@corp/billing-engine": "1.2.0"
}
}
Dependency Confusionの発生経路
- 1内部パッケージ名または名前空間が組織外に知られる。
- 2公開レジストリに同名のscopeなしパッケージが存在するか、そのレジストリが依存関係の取得元として許可されている。
- 3リゾルバーが意図しない取得元を選ぶ。ロックファイルがない、再生成される、または未審査で承認される場合、レビューで置換を見逃すことがあります。
- 4インストールやビルドのスクリプトが有効なら、パッケージコードはジョブの権限で実行されます。影響は認証情報、ネットワーク、隔離に左右され、root実行が必須というわけではありません。
エンジニアリング上の防御策
- ✓取得元方針を明確にする:組織所有のscopeや名前空間を使い、指定レジストリへルーティングし、非公開名が公開ソースへフォールバックしないようにします。Pythonでは非公開パッケージに
--extra-index-urlを併用せず、管理されたプロキシまたは単一の権威ある索引を使います。 - ✓名前空間の所有権を管理する:レジストリが対応する場合は組織名を確保します。ただし名前の確保を解決方針の代わりにしてはいけません。内部名を一覧化し、公開レジストリでの衝突を監視します。
- ✓ロックファイルを審査して強制する:ロックファイルを管理し、CI向け固定インストールを使います(npmでは
npm ci)。パッケージ名、レジストリURL、バージョン、integrity値の変更を確認してください。ロックファイルは再現性を高めますが、取得元が正規発行元である証明にはなりません。 - ✓ビルド実行を制限する:不要なら依存パッケージのスクリプトを無効にし、例外を審査します。短期間で最小権限の認証情報を使い、本番シークレットからビルドを隔離し、外向き通信を制限します。
関連するセキュリティ記事とインシデント分析:セキュリティディレクトリ →