LLM統合アプリケーションが普及するにつれ、潜在的なセキュリティリスクの調査は極めて重要です。これらのシステムにおける最も重大な脆弱性の1つは、間接的プロンプトインジェクションによる敵対的攻撃を受けやすいことです。このリポジトリでは、悪意のある攻撃者が、LLMから派生したリモートのWebナビゲーションエージェントの動作を制御できるユニバーサルトリガーを生成する方法を示します。この情報を公開することで、実務者が自身の潜在的な脆弱性を認識し、研究者がこの種の攻撃に対する防御策を開発するきっかけとなることを願っています。
このリポジトリをクローンした後、Browser Gym からWebナビゲーションインフラストラクチャをセットアップするには、以下のコマンドが必要です。
conda create -n browser-gym
conda init
conda activate browser-gym
pip install browsergym-core
playwright install chromium
pip install transformers
詳細はコンピューティング環境によって異なる場合があります。
ユニバーサルトリガー最適化手順を実行したい場合は、WebサイトとWebナビゲーション目標のデータセットを生成する必要があります。これは、src/actions/mask_dataset.py ファイルで提供されるコマンドで実行できます。また、いくつかのAPIキーを作成し、安全な環境に保管する必要があります。
pip install python-dotenv を実行し、次に touch .env を実行します。OPENAI_API_KEY=<key>
GOOGLE_API_KEY=<key>
GOOGLE_ENGINE_NAME=<name>
GOOGLE_CX=<engine ID>
python -m src.dataset.actions.make_dataset get_webs を実行します。python -m src.dataset.actions.make_dataset set_goals を実行して、ブロックされたWebサイトのJSONをフィルタリングし、サイトクラスのバランスを取り直し、残りのWebサイトの目標オブジェクトを生成するためにOpenAI APIにバッチジョブを送信します。WebサイトのJSONが10kを超える場合は、--n_batch_splits <int> フラグを追加してください。set_goals コマンドを実行すると、バッチIDがターミナルに出力されます。バッチジョブが完了している場合は、python -m src.dataset.actions.make_dataset get_goals --batch_ids <batch ID 1> <batch ID 2> ... を実行して、対応するWebサイトのJSONに目標オブジェクトを書き込みます。OpenAIのバッチジョブは完了に24時間かかる場合があるため、このコマンドが成功するまでに1日待つ必要があるかもしれません。デモ1は、攻撃者がリンクにマルウェアを埋め込んだWebサイトをホストし、Webナビゲーションエージェントに毎回そのリンクをクリックさせる方法を示しています。WebサイトのJSONと、Webエージェントの出力を制御するトリガーは、それぞれ data/ フォルダと triggers/ フォルダに保存されています。
python -m src.attack.actions.run_demo を実行すると、サンプルWebページとLLMチャットインターフェースを備えたブラウザが起動します。LLMチャットは、Webナビゲーションエージェントの目標を入力するよう求めます。ウィンドウに「シカゴ行きのフライトを検索して」のようなタスクを入力してください。エージェントは、期待どおりサンプルWebページが表示されたタブでタスクを完了します。
python -m src.attack.actions.run_demo --trigger_json triggers/zzz_travel_ad_demo_1_trigger_uni_secondary.json を実行して、このタスクでWebナビゲーションエージェントを攻撃します。先ほどと同様に、サンプルWebページとLLMチャットインターフェースを備えたブラウザが起動するので、チャットウィンドウに何か目標を入力してください。プロセスはコントロールと同じですが、唯一の違いは、zzz_travel_ad_demo_1_trigger_uni_secondary.json ファイルのトリガーがWebサイトの隠しリンクに挿入されることです。今回は、Webエージェントがあなたが入力した指示を無視して、フッターの広告をクリックするはずです。
任意のWebサイト上でWebナビゲーションエージェントの出力を制御する敵対的トリガーを最適化するには、find_narrow_trigger.py ファイルを使用できます。データセット作成ユーティリティを使用してWebサイトのJSONを生成したら、ax ツリー内のどこかに '{optim_str}' というテキストを挿入します。これにより、使用する nanogcg ライブラリに、その場所にトリガーを挿入したいことを伝えます。
pip install nanogcg を実行しますpython -m src.attack.actions.find_narrow_trigger を実行します。このコマンドラインユーティリティのオプションとフラグは次のとおりです。-h, --help show this help message and exit
--json JSON File and path for the JSON file to find a trigger for.
--target TARGET The desired output when triggered.
--device DEVICE Device to run the model on.
--trigger_length TRIGGER_LENGTH
--include_target, --no-include_target
--loss_fn {cw,mm,ce}
--search_width SEARCH_WIDTH
--top_k TOP_K
--model {mistral-7B,mistral-24B,llama2,llama3}
The model to use for generation.
--dtype DTYPE Data type to use for the model.
私たちの環境で攻撃を機能させるには、最適化のターゲットが Browser Gym のWebナビゲーションアクションスペース内の関数である必要があります。action_space.txt ファイルを参照してください。
最適化されたトリガーは、対応するWebサイトデータJSONと同じファイル名で、triggers/ フォルダ内のJSONファイルに保存されます。適切なフラグを指定して python -m src.attack.actions.run_demo ユーティリティを使用すると、このトリガーを使って独自のデモを実行できます。