随着LLM集成应用的普及,调查潜在的安全风险至关重要。这些系统中最重大的漏洞之一是它们容易受到通过间接提示注入进行的对抗性攻击。在本仓库中,我们展示了一种方法,恶意行为者可以利用该方法生成一个通用触发器,从而控制源自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导航目标的数据集。这可以通过 src/actions/mask_dataset.py 文件提供的命令来完成。你还需要创建一些API密钥并将其存储在安全的环境中。
pip install python-dotenv,然后运行 touch .envOPENAI_API_KEY=<key>
GOOGLE_API_KEY=<key>
GOOGLE_ENGINE_NAME=<name>
GOOGLE_CX=<engine ID>
python -m src.dataset.actions.make_dataset get_webs,直到你的数据文件夹中有足够数量的网站json文件。python -m src.dataset.actions.make_dataset set_goals 来过滤被屏蔽的网站json、重新平衡网站类别,并向OpenAI API提交一个批处理任务,为其余网站生成目标对象。如果你有超过1万个网站json,应添加 --n_batch_splits <int> 标志。set_goals 命令时,你的批处理ID将打印到终端。如果批处理任务已完成,运行 python -m src.dataset.actions.make_dataset get_goals --batch_ids <batch ID 1> <batch ID 2> ... 将目标对象写入对应的网站json。OpenAI完成一个批处理任务可能需要24小时,因此可能需要等待一天才能成功运行此命令。演示1展示了攻击者如何托管一个在链接中嵌入恶意软件的网站,并强制Web导航代理每次都点击该链接。网站json和控制Web代理输出的触发器分别存储在 data/ 和 triggers/ 文件夹中。
运行 python -m src.attack.actions.run_demo 将启动一个浏览器,其中包含示例网页和LLM聊天界面。LLM聊天会要求你为Web导航代理提供一个目标。在窗口中编写类似“Search for a flight to Chicago”的任务。代理将按预期在带有示例网页的标签页中完成任务。
运行 python -m src.attack.actions.run_demo --trigger_json triggers/zzz_travel_ad_demo_1_trigger_uni_secondary.json 来攻击执行该任务的Web导航代理。浏览器将照常启动,包含示例网页和LLM聊天界面,也请照常在聊天窗口中编写某个目标。过程将与对照实验完全相同,唯一区别在于 zzz_travel_ad_demo_1_trigger_uni_secondary.json 文件中的触发器会被插入到网站上的一个隐藏链接中。你应该会看到,这次Web代理忽略了你提供的指令,转而点击页脚中的广告!
要优化一个对抗性触发器,以控制Web导航代理在你所选网站上的输出,你可以使用 find_narrow_trigger.py 文件。使用数据集创建工具生成网站json后,你可以在 ax tree 中的某个位置插入文本 '{optim_str}'。这会告诉我们将要使用的 nanogcg 库,你希望在网站的该位置插入触发器。
pip install nanogcg'{optim_str}' 插入到你选择的网站数据json中的 ax_tree 对象中。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 文件。
优化后的触发器将保存在 triggers/ 文件夹中的一个json文件中,文件名与对应的网站数据json一致。你可以使用此触发器,通过 python -m src.attack.actions.run_demo 工具并配合适当的标志来运行你自己的演示。