Dependency Confusion
依存関係の混乱
説明
依存関係の混乱 (Dependency confusion) または置換攻撃は、リモートコード実行につながる可能性のある新しい攻撃手法です。この攻撃は通常、ビルド環境、CI/CD パイプライン、および開発者のワークステーションに影響を与えます。
ほとんどのプログラミング言語では、サードパーティの依存関係を取得するために外部パッケージ管理システムを利用できます。
パッケージマネージャーは通常、内部専用のパッケージをホストするためにプライベートリポジトリをデプロイする機能を提供します。
ビルドプロセス中、パッケージマネージャーはプライベートリポジトリを優先するのではなく、バージョンが最も高いものを優先します。攻撃者は、パブリックリポジトリに悪意のあるパッケージを作成し、ビルド時に悪意のあるパッケージが確実に関使用されるように十分に高いバージョンを使用することで、この動作を悪用する可能性があります。
推奨事項
プロジェクトの依存関係を管理する場合、より良い構成とセキュリティのためにスコープ付きパッケージ (scoped packages) を活用することが不可欠です。NPM の場合は、次の手順に従ってスコープ付きパッケージを作成し、スコープ付きレジストリを設定し、スコープの乗っ取りを防ぎ、依存関係を効果的に定義します。
1. スコープ付きパッケージを作成する:
まだ作成していない場合は、プロジェクト用のスコープ付きパッケージを作成します。手順 に従ってこれを行うことができます:
- npm の「Sign In」ページでアカウントの詳細を入力し、Sign In をクリックします。
- ページの右上隅にあるプロフィール写真をクリックし、Add an Organization をクリックします。
- 組織作成ページの Name フィールドに、組織の名前を入力します。組織名は、組織のスコープにもなります。
- Name フィールドの下で、「Unlimited private packages」有料プランまたは「Unlimited public packages」無料プランのいずれかを選択し、Buy または Create をクリックします。
- (オプション) 組織への招待ページで、組織にメンバーとして追加するユーザーの npm ユーザー名またはメールアドレスを入力し、招待するチームを選択して、Invite をクリックします。
- Continue をクリックします。
2. スコープ付きレジストリの設定:
.npmrc ファイルに次の行を追加して、スコープ付きレジストリを設定します:
@[ORG]:registry = https://reg.[ORG].internal/
3. スコープの乗っ取りを防止する:
使用しようとしているスコープ (@ORG) が保護されており、攻撃者に乗っ取られないことを確認します。これには、所有権の確認や、関連する組織またはユーザーアカウントの制御の維持が含まれます。
4. 依存関係の定義:
前に定義したスコープを必ず使用して、package.json ファイル内で依存関係を定義します。例:
{
"name": "@org/dep1",
"version": "1.2.3",
"description": "Scoped dependency 1",
"dependencies": {
"@ostorlab/dep2": "1.2.3"
}
}
これらの実行可能な手順に従うことで、スコープ付きパッケージを効果的に活用し、レジストリ構成を確保し、権限のないエンティティによるスコープ乗っ取りのリスクを軽減できます。
リンク
- Microsoft warns enterprises of new 'dependency confusion' attack technique
- Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies
- Avoiding npm substitution attacks
標準
- OWASP_MASVS_L1:
- MSTG_CODE_5
- OWASP_MASVS_L2:
- MSTG_CODE_5
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_3
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_4_2
- CC_6_6
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_8_1
- CC_9_1