昨今何かと話題になるサプライチェーン攻撃の対策として、Takumi Guardというレジストリプロキシ機能が無料で利用できることを知った。パッケージマネージャーの設定だけでは防げない、サプライチェーンに対する攻撃手法を拡張して防いでくれることを期待している。
例えば、以前よりtypesquattingと呼ばれる、有名パッケージとよく似た名前の悪意のあるパッケージをnpm等に公開することで、ミスを起点に開発環境に悪意のあるコードを侵入させる攻撃手法がある。個人的はCodexなどのコーディングエージェントによってコードを書く時間はほぼ0になったが、それでもちょっとしたnpm install といったパッケージインストールは手動で行うことも多く、多少気をつけているつもりではいるがtypoすることだってある。そのため若干不安を覚えながら利用していた背景がある。
また最近は、slopsquatting とよばれる、AIのハルシネーションによって生成されたあたかも実際にありそうなパッケージ名を狙った攻撃手法も確認されているとのこと。
typosquatting: パッケージ名の打ち間違いを狙った攻撃。cross-env に対する crossenv、express に対する expresss のように、一文字違いの名前でパッケージを登録し、ミスタイプしたインストールを待ち構える。
slopsquatting: AI コーディングツールの普及で増加している新しい攻撃手法。LLMはハルシネーションによって存在しないパッケージ名を生成しインストールを提案することがある。攻撃者はそのあたかも存在しそうな架空のパッケージ名をあらかじめ登録しておき、開発者が AI の提案をそのまま承認してしまい、 npm install するのを狙う。UT San Antonio・Virginia Tech などの研究チームが57.6万件のコードサンプルで16モデルを調査したところ、オープンソースモデルが提案したパッケージ名の平均21.7% が実在しないものだったという。[1] [2]
Takumi Guard
Takumi Guard は GMO Flatt Security が提供するレジストリプロキシ。npm, pypi, rubygem, go へのインストールリクエストをFlattのセキュリティチームが構築してくれた独自のリアルタイムの脅威データベースと照合し、悪性パッケージのインストールをブロックしてくれる。詳細はドキュメントを参照されたし。
レジストリプロキシのブロック機能は匿名・無料で利用可能。マルウェア、typosquatting、侵害済みパッケージをブロックしてくれるとドキュメントには記載がある。おそらくだがslopsquattingにも多少効果はあるのではないかと思っている。
また、メールアドレスを登録しておくことで、侵害されたパッケージのインストールが後日確認された時に、メール通知を行ってくれる機能もある。こちらも無料。本当にありがたい。
クイックスタート
基本的には、npm, pnpm, pip, uvといったパッケージマネージャーの宛先レジストリを、設定ファイルや環境変数にて、
flatt.tech に向けることで利用可能。設定は必ずTakumi Guardのドキュメントを参照すること。この記事は概要のみで細かいコマンドや設定方法は記載しない。
npm
プロジェクトの .npmrc にレジストリに下記を記載。
registry=https://npm.flatt.tech/
グローバルに設定したい場合は次のコマンドで。
npm config set registry https://npm.flatt.tech/
pnpm・yarn なども同様に対応している。
# pnpm
pnpm config set registry https://npm.flatt.tech/
# yarn berry (.yarnrc.yml)
npmRegistryServer: "https://npm.flatt.tech/"
pypi
プロジェクトの pyproject.toml や、設定コマンド、環境変数で設定可能。
# pip
pip config set global.index-url https://pypi.flatt.tech/simple/
# uv(環境変数で設定)
export UV_DEFAULT_INDEX=https://pypi.flatt.tech/simple/
今回は一旦自分がよく利用している言語のパッケージマネージャーである、pnpm, uvについてプロキシ設定を行ってみた。メールアドレスも登録してるため、一ヶ月ほど個人開発で利用してみて、またはメール通知が来たタイミングで使用感やインストール・ネットワークエラーが発生しないか等をまた記事に反映する予定だ。