Skip to content
Latchkey

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 に固定してブロックする。

関連ガイド