dependency confusion とは? 内部パッケージ名を乗っ取る
dependency confusion とは、何者かがあなたの private な内部パッケージと同じ名前の public なパッケージを公開し、あなたの build がそちらを取得することを狙う攻撃です。
多くの組織は private なパッケージ、つまり private registry にのみ公開される内部ライブラリを持っています。dependency confusion は、package manager が名前を解決する仕組みを悪用します。public registry に同名でより高いバージョンのパッケージがあれば、build はあなたのものではなく public(攻撃者が制御する)ものを引き込むことがあります。攻撃者はあなたのネットワークに侵入する必要はなく、名前を推測するだけです。
解決の欠陥
package manager が private registry と public registry の両方をチェックするよう設定されている場合、それらすべてにわたって見つけられる最も高いバージョンを選ぶことがよくあります。攻撃者はあなたの内部名と巨大なバージョン番号を持つ public パッケージを公開し、resolver はそれを優先します。
攻撃の展開
- 攻撃者が内部パッケージ名を知る(漏れた manifest、エラーメッセージ、推測から)。
- その名前のパッケージを高いバージョンで public registry に公開する。
- あなたの build が public バージョンに解決してインストールする。
- 悪意あるパッケージの install スクリプトが、あなたの build の権限で実行される。
名前がどう漏れるか
内部パッケージ名は、commit された lockfile、stack trace、公開リポジトリ、Dockerfile に現れます。攻撃者に多くは要りません。public な artifact 内の内部名への単一の参照があれば、始めるのに十分です。
防御
内部パッケージにスコープまたは namespace を付け、名前が衝突しないようにします。package manager が内部名を private registry からのみ取得するよう設定します。lockfile でバージョンを固定します。一部の registry では、偽物をブロックするために namespace を public に主張または予約できます。
なぜ CI にとって重要か
install は pipeline 内で起こり、そこにはシークレットが最も豊富にあります。CI に着地した confusion 攻撃は、攻撃者に build 環境を与えます。スコープが絞られた認証情報を備えた isolation された ephemeral なランナーは、その侵害された install が到達できる範囲を限定します。
重要なポイント
- dependency confusion は、あなたの private なパッケージ名の public な偽物を公開する。
- registry をまたいで最も高いバージョンを優先する resolver は、攻撃者のパッケージを引き込む。
- 内部パッケージに namespace を付け、解決を private registry に固定してブロックする。