Go Repo Hijacking

ほぼこもセキュリティニュース By Terilogy Worx

Repo Hijackingというものがあります。
Repoはリポジトリです。
悪意のある攻撃者が、なんらかのコンピュータ言語のソフトウェア公開を実施しているアカウントのユーザー名の変更や削除を利用して、既存のユーザー名と同じ名前でリポジトリを作成し、オープンソースに悪意あるコードを混ぜ込むことを可能にする攻撃手法です。いわゆるソフトウェアサプライチェーン攻撃の一つの形です。

コンピュータ言語には、いろいろなものがあります。
そしてモダンなコンピュータ言語には、それぞれそのソフトウェア資産を公開して共有できる仕組みがあります。
Node.jsにはnpm、PythonにはPyPI、といった具合です。
これらのソフトウェア資産を公開する仕組みはリポジトリと呼ばれます。
npmやPyPIなどのリポジトリは、ひとつの仕組みとして運用されています。
npmのサイト、PyPIのサイト、といった具合です。

しかし、Go言語では様子が異なります。
Goには「https://pkg.go.dev/」というものがあります。
ここではGoのモジュールやパッケージが公開されています。
公開されています、と表現しましたが、ちょっとnpmやPyPIとは違います。
pkg.go.devは、Go言語のソフトウェア資産の検索サイトという体裁になっています。
なにか探したいソフトウェアモジュールがあるとき、pkg.go.devで検索して探すことができます。
検索ワードによっては、多数の検索結果がヒットします。
そして、表示される検索結果の候補を見てみると、GitHubの公開物に対するリンクとなっているものだったり、gocloud.devの公開物に対するリンクとなっているものだったりします。
pkg.go.devは、いわゆる他の言語のリポジトリと同じような気持ちで利用できる仕組みになっているのですが、pkg.go.devはある意味リポジトリではありません。
pkg.go.devは検索サイトであって、ここではソフトウェアは保持されていません。

このため、Go言語は他のモダンなコンピュータ言語に対して、Repo Hijackingに対して、もう少し脆弱であると考えられます。
先日VulnCheckが実施した調査で、次のような情報が公開されています。

  • VulnCheckは、9,000以上のリポジトリが、GitHubユーザー名の変更によるリポジャッキングに対して脆弱であることを発見しました。
  • VulnCheckは、6,000以上のリポジトリがアカウント削除によるリポジャッキングに対して脆弱であることを発見しました。

これは仕組みの構造が持つ問題と思えます。
根本的な対策は私たち利用者の立場では実施できそうにありません。
改善されることを祈るのみです。
改善されるまでに私たち開発者ができることは、使用するモジュールそのものと、モジュールの生成元のリポジトリの状態について注意して利用するということでしょうか。
Goに限った話ではありませんが、Goでは特に注意が必要ということになりそうです。

参考記事(外部リンク):Hijackable Go Module Repositories
vulncheck.com/blog/go-repojacking