サプライチェーン
タイポスクワッティングとは?
タイポスクワッティングとは、人気のある名前によく似た名前を登録し、誰かが打ち間違えるのを待つ攻撃です。もともとはWebサイトのドメインで始まりました。ソフトウェアでは、攻撃者がcross-envの代わりにcrossenvといった名前で悪意のあるパッケージを公開し、インストールコマンドのたった1つのタイプミスで、開発者のマシンやCIパイプライン上で攻撃者のコードが実行されます。
更新日
パッケージのタイポスクワッティングの仕組み
- 標的を選ぶ。攻撃者は人気のあるパッケージを選びます。タイプミスの割合がわずかでも、件数が積み重なるためです。
- よく似た名前を登録する。1文字の違い、ハイフンの欠落、文字の入れ替え、もっともらしい接尾辞などで区別されます。
- ペイロードを隠す。パッケージは本物をラップしていることが多いため、すべてが正常に動作し、何もおかしく見えません。
- インストール時に実行する。パッケージマネージャーはインストール中にスクリプトを実行できるため、コードは誰かが呼び出す前に、環境変数やトークンにアクセスできる状態で実行されます。
- 盗んで広げる。盗んだ認証情報を使って、攻撃者はさらにパッケージを公開したり、ほかのシステムに到達したりします。
タイポスクワッティングの代表的な手法
| 手法 | 本物のパッケージ | 偽物 |
|---|---|---|
| 区切り文字の欠落 | cross-env |
crossenv |
| 接尾辞の追加 | jquery |
jquery.js |
| 文字の入れ替え | ffmpeg |
ffmepg |
| 文字の欠落 | mongoose |
mongose |
| 接頭辞の追加 | sqlite |
node-sqlite |
上記の偽物はすべて、次に紹介する1つの実際のキャンペーンによるものです。
実例:crossenv
2017年、hacktaskという名前のnpmユーザーがcrossenvを公開しました。人気のあるcross-envを模倣したもので、本物のパッケージの動作を保ちながら、インストールした人の環境変数を攻撃者のサーバーに送信していました。ビルドでは、トークンが置かれているのは環境変数です。Snykの分析によれば、これは同じアカウントによる30を超える悪意のあるパッケージの1つで、あるエンジニアが発見するまで約2週間気づかれませんでした。
AIコーディングアシスタントが状況を悪化させる理由
AIアシスタントは、存在しないパッケージを提案することがあります。攻撃者がその名前を登録すれば、次にその提案を受け入れた人がマルウェアをインストールすることになります。これはスロップスクワッティングと呼ばれることもあります。人間が名前を確認せずに依存関係をインストールする自動化エージェントは、リスクをさらに高めます。
タイポスクワッティングと依存関係の混乱の違い
どちらもパッケージ名の解決方法を悪用しますが、ミスの種類が異なります。
| タイポスクワッティング | 依存関係の混乱 | |
|---|---|---|
| 誰のミスか | 人が名前を打ち間違える | ビルドシステムが誤ったレジストリを選ぶ |
| 名前 | 公開パッケージに似ている | 非公開の社内パッケージと同一 |
| 攻撃が成功する仕組み | 誰かが誤ってインストールする | より大きなバージョン番号を持つ公開版が優先される |
| 主な防御策 | ロックファイルと新しい依存関係のレビュー | スコープ付きパッケージと、社内の名前を非公開に保つレジストリ設定 |
依存関係の混乱が有名になったのは2021年で、研究者のAlex Birsanがこの手法を使い、バグバウンティプログラムのもとで、または許可を得て、Apple、Microsoft、PayPalを含む35を超える組織の内部でコードを実行させました。
タイポスクワッティングを防ぐ方法
-
CIではロックファイルからインストールする。
npm ciやそれに相当するコマンドを使います。そうすれば、タイプミスが入り込む経路はレビュー済みの変更だけになります。ロックファイルにできること、できないことをご覧ください。 - プルリクエストで新しい依存関係をレビューする。名前そのものを確認し、ロックファイルの差分を読み飛ばさずに読んでください。
- インストール前に確認する。名前をプロジェクト自身のドキュメントと照らし合わせ、ダウンロード数が少ない、初回公開が最近、リポジトリへのリンクがない、といったパッケージには注意してください。
- インストールスクリプトを制限する。ビルドで可能な場合は無効にしてください。
- 新しいパッケージの採用を少し待つ。悪意のあるパッケージは、公開後まもなく発見・削除されることがよくあります。
- ビルドがアクセスできる範囲を制限する。既知のホストとしか通信できないビルドは、悪意のあるパッケージが実行されても、シークレットを攻撃者に送信できません。GitHub Actionsのエグレスポリシーをご覧ください。
- AIの提案はすべて確認する。インストールする前に、パッケージが存在し、意図したものであることを確かめてください。
なお、タイポスクワッティングのパッケージには出現した当日にCVEがないため、アドバイザリに基づくSCAスキャンでは検出されません。詳しくはソフトウェアサプライチェーンセキュリティのベストプラクティスをご覧ください。
ドメインのタイポスクワッティング
URLハイジャックとも呼ばれるこの攻撃の元の形態では、銀行やログインページの綴りを間違えたドメインなどを登録します。アドレスを打ち間違えた訪問者は、認証情報を盗んだりマルウェアを配布したりするために作られたサイトのコピーにたどり着きます。防御策は異なります。自社ドメインのよくある綴り間違いを登録し、よく似たドメインの登録を監視し、パスワードマネージャーを使用してください。パスワードマネージャーは誤ったドメインでは自動入力しません。
CRACIが被害を抑える方法
CRACIは、新しい悪意のあるパッケージを振る舞いや評判によって検出しません。その目的にはパッケージファイアウォールや振る舞い分析ツールをご利用ください。CRACIが行うのは封じ込めです。GitHub Actionsランナーとして、ビルドに不要な接続をブロックするエグレスポリシーを適用するため、シークレットを盗むパッケージがあっても、誰も見たことのない攻撃であっても、送信先がありません。ジョブが取得したすべてのパッケージが記録に残るため、攻撃が判明すればどのビルドがそれを取り込んだかを確認でき、CVEが公開されたリリースにはフラグが付き、ポリシーゲートでブロックできます。サプライチェーン攻撃とはをご覧ください。
タイポスクワッティングに関するよくあるご質問
タイポスクワッティングを簡単に言うと何ですか?
パッケージやWebサイトなど、人気のある名前とほとんど同じに見える名前を登録し、誰かが打ち間違えるのを待つことです。偽物はマルウェアを届けたり、認証情報を盗んだりします。
タイポスクワッティングの例を教えてください。
2017年、npmパッケージのcrossenvは人気のあるcross-envを模倣しました。本物のパッケージと同じように動作しながら、利用者の環境変数を攻撃者のサーバーに送信していました。
タイポスクワッティングと依存関係の混乱の違いは何ですか?
タイポスクワッティングは、人が公開パッケージの名前を打ち間違えることを利用します。依存関係の混乱は非公開パッケージとまったく同じ名前を使い、ビルドシステムが代わりに公開版を取得することを利用します。
タイポスクワッティングは違法ですか?
マルウェアの公開や認証情報の窃取は、ほとんどの国や地域で違法です。ドメインのタイポスクワッティングは、米国のAnticybersquatting Consumer Protection Actなどの商標法に違反する場合もあります。
スロップスクワッティングとは何ですか?
AIアシスタントが作り出しがちなパッケージ名を攻撃者が登録する、タイポスクワッティングの一種です。提案されたパッケージをインストールした人は、攻撃者のコードを受け取ることになります。
タイポスクワッティングはどう検出しますか?
新しい依存関係を名前とメタデータでレビューし、パッケージ名を人気のあるものと比較したり、振る舞いを分析したりするツールを使います。アドバイザリに基づくスキャナーが役立つのは、パッケージが報告された後だけです。