タイポスクワッティング
Typosquatting
概要(サマリー)
タイポスクワッティングとは、正規の名前に似た綴りのドメインやパッケージで、人や開発ツールを誤って誘導する手口である。
typo は打ち間違い、squatting は場所を勝手に占めることである。
人が一文字だけ打ち間違えることを見越して、偽の名前を先に用意する。
開いた先がフィッシングサイトになったり、入れたパッケージが不正な処理をしたりする。
詳細解説
名前の綴りを、わずかにずらす
正規の名前と、見た目がほとんど同じ名前を作る。
文字の入れ替え、似た形の文字への置き換え、一文字の追加、ハイフンの有無などが使われる。
次の二つは、説明のための架空の名前である。インストールする対象ではない。
正規のつづり: example-library
似せたつづり: exarnple-library
m と rn のように、フォントによっては同じに見える置き換えもある。
人が急いでいるとき、一覧の上から順に選ぶとき、違いを見落としやすい。
Webサイトのアドレスでも起きる
ドメインのタイポスクワッティングは、有名サイトの URL を一文字間違えて開いたとき、偽サイトへ着く手口である。
そこからログインを求められれば、フィッシングと同じ被害になる。
ブラウザの補完履歴に、誤った綴りが残ると、次からも同じ偽サイトを開きやすい。
メールアドレスのドメインを一文字ずらすと、サプライチェーン攻撃の前段や、ビジネスメールのなりすましにもつながる。
表示名が正しくても、@ の右側の綴りが公式と違うことがある。
パッケージ名でも起きる
開発では、npm などの公開レジストリにあるパッケージ名が対象になる。
人気のライブラリに似た名前のパッケージを公開し、インストールした人の環境で不正な処理を動かす。
これはサプライチェーン攻撃の入り口の一つである。
依存関係に一度入ると、自分のパソコンだけでなく、チームのビルドや本番環境へ広がることがある。
「自分の打ち間違いだから、自分の画面だけで終わる」は成り立たない。
実例として、2017年に npm で見つかった crossenv がある。
人気のパッケージ cross-env にハイフン一つだけ違う名前で、本物と同じように動きながら、インストールした環境の環境変数を外部へ送っていた。
npm は同じ公開者による似た名前のパッケージ約40個を削除し、インストールした人には認証情報の取り替えを呼びかけた。
npm は、人気パッケージに似た名前の公開を検知して止める仕組みがある、と説明している。
npm audit も、報告済みの脆弱性や不正パッケージを知らせる。
ただし、どちらも見つかったあとの問題に強い仕組みである。公開されたばかりの偽物まで、すべてを事前に止められるわけではない。
似た手口に、依存関係の混乱(dependency confusion)がある。
会社の中だけで使う非公開パッケージと同じ名前を、公開レジストリへ先に登録し、設定によってはそちらが入ってしまう手口である。
npm は、非公開パッケージに @組織名/ のようなスコープ付きの名前を使うよう勧めている。
ロックファイルは、入ったあとの記録である
package-lock.json のようなロックファイルは、実際に入ったパッケージの版を固定する。
似た名前が一度ロックに書かれると、チームの他の人も同じ名前を入れる。
したがって、最初に名前を足す人が綴りを確認する。
確認するのは、ダウンロード数の多さだけではない。
公式ドキュメントが案内している名前か、公開元、公開からの期間、中身の更新が不自然でないかを見る。
AI や記事が書いたインストールコマンドを、レジストリで名前を照合する前に実行しない。
AI が存在しない名前を出す問題
LLM は、実在しないがそれらしいパッケージ名を提案することがある。
その名前を攻撃者が先にレジストリへ登録していると、提案をそのまま実行した人が偽パッケージを入れる。
タイポスクワッティングが「人の打ち間違い」だけを待つとは限らない。AI の提案文も、間違いの発生源になる。
この AI 由来の手口は、打ち間違い(typo)ではなく AI の雑な出力(slop)を狙うことから、スロップスクワッティング(slopsquatting)とも呼ばれる。
提案された名前は、公式ドキュメントの綴りと一文字ずつ比べる。
初めて見る名前は、その場でインストールせず、何のための依存かを説明できるまで保留する。
入れたあとに気づいたとき
似た名前を入れてしまったら、追加のインストールや、AI への「このエラーを直して」の連続実行を止める。
そのパッケージ名を依存関係から外し、ロックファイルも更新する。
公式の綴りのパッケージを、あらためて公式ドキュメントのコマンドで入れ直す。
環境変数やAPIキーを、その開発用パソコンに置いていたなら、それらの秘密は入れ直す。
偽パッケージが何を読んだかを、あとから完全には確認しにくいためである。
チームで同じロックファイルを使っているなら、入れた名前と時刻を共有し、他の人の環境にも同じ名前が入っていないか見る。
AIコーディングとの関係
AI は、依存関係の追加コマンドをよく提案する。
コマンドの形が正しくても、パッケージ名の一文字が違うだけで中身は別物である。
AI には「このパッケージ名が公式ドキュメントのどのページの綴りと一致するか、インストールせずに照合する手順を書いてください」と頼む。
照合が終わるまで、提案されたインストールは実行しない。
package.json に足す名前も、AI の文章からコピーした直後に、レジストリの公式ページと読み比べる。
{
"dependencies": {
"example-library": "^1.0.0"
}
}
上の JSON は、名前の置き場所を示す見本である。
example-library は実在の案内ではない。実際の開発では、公式が書いている綴りだけをこの位置へ入れる。
APIキーや、非公開のパッケージの URL を AI の会話に貼らない。
よくある勘違い
人気のライブラリなら、似た名前も同じ作者?
公開レジストリでは、似た名前を別の人が公開できる。
人気があることと、一文字違いの名前が同じ中身であることは別である。
公式ドキュメントに書かれた綴りだけを使う。
フィッシングサイトと同じもの?
フィッシングサイトは、偽の Web ページで情報の入力を求める。
タイポスクワッティングは、似た名前でそこへ誘導したり、偽のパッケージを入れさせたりする名前の手口である。
Web の偽サイトにも、開発用パッケージにも使われる。
自分のパソコンに入っただけなら被害は小さい?
開発用のパッケージは、認証情報を読んだり、次のビルドへ混ざったりする。
ロックファイル経由で、チームの他の環境へ同じ名前が再現される。
入れたあとに気づいたら、その名前を依存から外し、何が実行されたかを確認する。
まとめ
- タイポスクワッティングは、正規の名前に似た綴りで人やツールを誤誘導する手口である。
- Web のドメインと、npm などのパッケージ名の両方で起きる。
- サプライチェーン攻撃の入り口になり、ロックファイルでチームへ広がることがある。
- AI が提案した名前も、公式の綴りと照合してからインストールする。
情報ソース
- npm Docs:Threats and mitigations(英語)
- npm Blog:crossenv malware on the npm registry(2017年、英語)
- npm Docs:npm audit(英語)
より詳しくAIに聞いてみよう
- タイポスクワッティングを、一文字だけ違う店の看板の例で説明してください。
- ドメインのタイポスクワッティングと、パッケージ名のタイポスクワッティングの違いを整理してください。
- AI が提案したパッケージ名を、インストール前に確認する手順を教えてください。
- 依存関係の追加を AI に頼むとき、公式の綴りと照合させる指示文を書いてください。
- 非公開パッケージの URL や API キーを AI に貼らずに、名前の確認方法だけを聞く聞き方を教えてください。