[论文阅读]Progent: Programmable Privilege Control for LLM Agents
Progent: Programmable Privilege Control for LLM Agents
https://arxiv.org/abs/2504.11703
sunblaze-ucb/progent
现有攻击都利用了 LLM 代理的自主性,欺骗它们执行其原始任务不需要的危险操作。 解决此问题的一个高级解决方案是实施权限控制,确保代理不会在其预期目的之外执行敏感操作。 然而,由于 LLM 代理的多样性和复杂性,要实现这一点具有挑战性。
挑战一:表达性安全解决方案
LLM 代理的广泛应用意味着在不同的场景中的安全需求不同,攻击媒介从恶意提示到投毒记忆和恶意工具等,需要一个富有表现力和通用的安全框架,这样的框架可以适应不同agent的上下文、设计和风险。
挑战2:确定性安全实施
LLM是概率神经网络,其内部工作难以理解。为了自主执行任务,LLM agents本质上被设计为动态地适应环境反馈。 这种概率性质和动态行为的结合使得对它们的安全性进行形式化推理变得困难。 因此,确定性地实施安全以实现对LLM agents的可证明保证是一项重大挑战。
Overview
攻击示例1:编码Agent
编码代理核心功能是它们与开发人员平台(如 GitHub)的交互,以访问代码存储库、处理问题、管理拉取请求并提供全面的开发人员协助。这些代理配备了必要的工具,并在多个存储库中拥有广泛的权限,能够代表用户读取、写入和执行操作。 遗憾的是,如果没有适当的安全约束,这可能导致过度授权的工具使用,使用户面临重大安全风险。
如图1,是一个具体的攻击场景,代理通过GitHub MCP服务器连接到GitHub工具。 在攻击中,一个负责回复公共存储库pacman中的开放问题的代理,被嵌入在攻击者控制的问题描述中的恶意指令所破坏。 该代理最初使用list_issues工具读取所有开放问题,无意中处理了恶意指令。 该指令将代理重定向到使用list_repos工具列出私有存储库,然后使用get_file工具检索它们的内容。 然后,通过将私有存储库secret-repo中包含的敏感数据提交到公共pacman存储库中的一个新文件中,并随后推送(未在图中显示),从而提取出来,如攻击者的指令所指定的那样。 该代理继续完成其原始任务,而攻击一直秘密地执行着。
该攻击演示了如何通过外部内容(例如,GitHub问题)进行间接提示注入,从而操纵代理访问超出其预期范围的资源。 除了提示注入之外,LLM代理还面临其他攻击媒介,包括知识投毒和恶意工具。 根本问题在于缺乏对LLM代理的充分权限限制。 现有的代理系统缺乏在保持LLM代理的灵活性和功能的同时灵活地实施细粒度控制的能力。 因此,攻击可以很容易地欺骗代理进行过度授权的工具调用。
Progent:总体设计和安全策略
Progent通过提供一个可编程框架来解决这个关键差距,该框架用于定义和实施精确的安全策略,以控制LLM代理中的权限。 如图1所示,Progent充当代理与其工具(示例中是MCP服务器)之间的安全代理,拦截并评估所有工具调用,然后在执行前阻止任何潜在的危险调用(如果需要)。 Progent 提供完全可编程的安全约束,允许开发人员和用户使用包括正则表达式和逻辑运算在内的表达条件来定义细粒度的控制,直至单个工具调用参数。 Progent采用模块化设计,可与现有代理框架无缝集成,只需最少的代码修改,并支持灵活的策略调整,以实现快速威胁响应。
Progent 的安全策略支持选择性地允许访问通用工具,如 get_current_user(策略 2),同时通过多个协调策略(策略 1、3 和 4)阻止对私有存储库的访问。 Progent 会阻止代理列出私有存储库(策略 1)并从任何私有存储库检索内容(策略 3),无论存储库名称是如何获取的。 这些限制有效地防止了本次攻击中的数据泄露。
【本质上就是充当了一个中间层,怎么感觉和MCP的原理有一些相似呢。这个中间层可以来决策一些行为是否允许被执行,决策原理可以由用户自己定义。类似LLM Guard?】
Progent:后备行动
为了在 Progent 不允许某些工具调用(由于模型错误或鉴于 LLM 的非确定性性质的对抗性干预)而不允许某些工具调用时实现灵活的错误处理,Progent 提供了可定制的后备机制。 对于访问密码或私钥等高风险操作,表明存在潜在攻击,Progent 可以立即终止执行,以防止潜在的安全漏洞。 在需要人工判断的场景中,Progent 可以暂停执行并请求用户检查,从而对金融交易等关键决策进行人机循环监督,或者在示例中推送最终的 Git 提交。 此外,Progent 可以提供详细的反馈消息,指导 LLM 沿着安全路径继续执行原始任务,从而最大限度地提高代理效用,同时保留基本的安全性和安全约束。 对于图1中的示例,在阻止危险工具调用后,Progent 返回一条消息“工具被阻止,继续任务”(用于演示目的的更详细消息的简化版本)。 这使得代理可以忽略攻击者的影响并恢复以解决剩余的未决问题。
【高风险操作直接终止任务,需要人工决策的场景提供详细的反馈消息】
攻击示例2:工作区代理
如图2所示,用户要求代理收集关于竞争对手公司的信息,并生成一份比较其公司与竞争对手的竞争分析报告。 此任务需要通过网络搜索检索竞争对手的信息,同时访问机密的内部数据,特别是存储在 Q4_revenue.gsheet 电子表格中的第四季度收入统计数据。 在网络搜索阶段,代理会接触到恶意内容,其中包含由竞争对手(本例中为RivalCorp)策略性地放置的提示注入攻击。 该攻击成功操纵了代理,使其将敏感的收入统计数据泄露给竞争对手控制的外部电子邮件地址 (report@rivalcorp.example)。 这导致了严重的 security breach,关键的企业数据泄露。
Progent:动态策略更新
Progent 包含一个策略更新机制,该机制根据代理行为自适应地修改针对不同场景的策略集。 考虑图2中所示的场景:默认允许所有工具调用以促进通用任务效用,并在动态执行期间采用潜在的策略更新。 因此,send_email 工具最初不会被禁止,因为它对于执行典型的 workspace 任务(例如安排会议和回复客户)是必要的。 然而,当代理读取任何包含机密数据的敏感文件 (Q4_revenue.gsheet) 时,它会触发策略更新。 此更新指定一旦敏感信息进入代理的上下文,新的策略集必须阻止任何潜在的数据泄露给外部方,例如通过阻止发送给不受信任的收件人的电子邮件或上传到未经验证的位置。 在这种情况下,该策略仅允许发送给内部公司成员的电子邮件,通过正则表达式 .*@corp\.internal 执行。 这通过阻止未经授权的电子邮件来防止数据泄露。 最后,得益于灵活的 fallback 机制,代理继续沿着安全路径完成原始任务。
【核心思想就是允许工具的使用,但是牵扯到敏感数据时则阻止各种方式的数据外泄】
总结
由于其多样化的结构、各种攻击媒介、非确定性行为和动态特性,LLM 代理面临着关键的安全挑战。 Progent 通过一个模块化框架和一个全面的可编程策略语言来应对这些挑战,该语言提供细粒度的控制、灵活的后备操作和动态策略更新。 这使得精确、自适应的安全策略能够响应不断变化的威胁环境,同时保持代理的实用性
问题表述和威胁模型
LLM代理:将 agents 视为一个黑盒,从而适应不同的设计选择,无论是利用单个 LLM、多个 LLM还是内存组件。 唯一的要求是 agent 可以调用工具。
威胁模型:
攻击者目标:破坏代理的任务解决流程,导致代理未经授权的操作,让攻击者收益。主要表现为恶意的工具调用
攻击者的能力:可以槽中环境中代理的外部数据源(比如电子邮件)来嵌入恶意命令。代理通过工具调用检索此类数据时,注入的命令可以改变代理的行为。但是假设用户的原始查询是良性的,,并且任何一步的观察结果(工具调用结果)都可以被攻击者控制(主要使用间接提示注入攻击和针对代理内存或者知识库的投毒);攻击者可能向代理的工具集合中引入恶意工具,但是无法修改代理的内部结构,比如训练模型或者修改系统提示词
Progent的防御范围:不能防御在完成用户任务的最低权限内操作的攻击,比如偏好操纵攻击,攻击者欺骗agent在有效选项中偏向攻击者选定的产品,Progent主要针对的是一些敏感信息类的攻击。
Progent
语言规范
对于每个代理,可以定义策略列表𝒫以全面保护其执行。 每个策略P∈𝒫都针对一个特定的工具,并根据其参数指定允许或禁止工具调用的条件。 还可以为策略分配不同的优先级,以指示它们捕获的工具调用的严重性。 当呼叫被阻止时,策略的“后备”操作可以处理它,例如通过提供反馈来帮助代理自动恢复。 可选的“更新”字段允许在策略生效后添加新策略,反映可能发生的任何状态变化。
策略的定义从 E t 开始,其中“效果”E 指定策略是允许还是禁止工具调用,而 t 是目标工具的标识符。 ei¯ 定义了当工具调用应被允许或阻止时的一组条件,这些条件基于调用的参数,工具调用的安全性通常取决于其接收到的特定参数。 例如向可信账户转账是安全的,但向不可信账户转账可能是有害的。 每个条件 ei 都是关于工具的第 i 个参数 pi 的一个布尔表达式。 它支持多种操作,例如逻辑运算、比较、成员访问(即,pi[n])、数组长度(即,pi.𝚕𝚎𝚗𝚐𝚝𝚑)、成员资格查询(即,in 运算符)以及使用正则表达式的模式匹配(即,match 运算符)。 接下来,每个策略都有一个优先级编号 n,它决定了其重要程度。 在运行时,首先考虑和评估优先级较高的策略
作者还开发了一个小工具来辅助检验策略的合理性
策略包括一个回退函数 f,当工具调用被策略禁止时执行。 f 的主要目的是引导另一种行动方案。 它可以向代理提供关于如何进行反馈,或者让一个人参与最终决定。目前支持三种类型的回退函数:(i) 立即终止代理执行;(ii) 通知用户决定下一步;(iii) 不执行工具调用并获取输出,而是返回一个字符串 𝑚𝑠𝑔。 默认情况下利用选项 (iii) 并向代理提供反馈消息“由于 {reason},不允许进行工具调用。 请尝试其他工具或参数,并继续完成用户任务:o0。”。 字段 {reason} 因策略而异,并解释了为什么不允许进行工具调用,例如,其参数如何违反策略。 这充当了一种自动反馈机制,帮助代理调整其策略并继续处理用户的原始任务。
策略包含一个可选的“更新”字段。 该字段包含一个新策略列表,当策略生效时,这些策略会自动添加到当前的策略集中。 此特性使Progent更具灵活性,允许其适应LLM agents在运行时不断变化的安全需求。
运行
在单个工具调用上执行策略
算法2展示了在单个工具调用c≔t(vi¯)上执行策略𝒫的过程。 从𝒫中的所有策略中,我们仅考虑针对工具t的子集𝒫t。先根据策略的优先级降序排列,如果有并列的优先级则优先考虑禁止策略,然后就每个策略便利,返回bool值。如果策略生效,则继续在工具调用c上应用P。如果E是禁止则阻止c并用P的后备函数f替换它。如果E是允许,则允许c且保持不变。 策略列表𝒫也根据P的规范进行更新。如果𝒫中没有策略针对该工具,或者工具调用的参数没有触发任何策略返回默认的后备函数fdefault和原始策略𝒫。
函数𝒫(c)有效地创建了一个策略控制的工具调用。 当策略𝒫允许时,它的行为与原始工具调用c完全相同,当策略不允许时,它会自动切换到后备函数。
在代理执行期间强制执行策略
Progent 不是直接执行由代理生成的工具调用,而是使用策略𝒫来管理它们 ,通过 𝒫(c)i调用 每个工具调用 ci。 然后它执行该调用(或回退函数)并相应地更新策略。 图1中的代理执行跟踪就是一个示例。
实现
使用 JSON Schema实现 Progent 的策略语言
提供了四个关键原则来评估工具的风险级别。 它们可以作为简化政策制定过程的指南,并有助于确保最终政策的稳健和精确。
- 考虑工具执行的操作类型。 只读工具无需修改环境即可检索数据,通常风险较低。 然而,通过发送电子邮件或运行脚本来改变环境的编写或执行工具本质上是高风险的,因为它们的行为通常是不可逆转的。
- 如果工具处理健康记录或社会安全号码等敏感数据,则该工具的风险会显着增加。 在这种情况下,即使是只读工具也应该被视为高风险,需要严格的策略来防止数据泄露。
- 工具的风险不仅取决于工具本身,还取决于它的论点;策略应使用 Progent 的细粒度控制来处理工具调用参数。 例如,send_money 工具的风险在很大程度上取决于其接收者参数。 良性的接收者使该工具安全,而攻击者控制的接收者则使其变得危险。
- 工具的风险是与环境相关的。 政策应利用 Progent 的政策更新机制进行相应调整。 例如,如果代理未读取任何敏感数据,则将信息发送到任何地址可能是可以接受的。 但是,如果涉及敏感数据,策略应将收件人限制在受信任的列表中。
实验评估
实验设置
评估agent的攻击案例:AgentDojo ,ASB基准测试,针对代理知识库的中毒攻击(使用AgentPoison攻击EHRAgent)将 LoadDB、DeleteDB 和其他函数视为代理的可用工具集。
除非另有说明,否则在大多数实验中始终使用 gpt-4o。使用的模型检查点:gpt-4o (e gpt-4o-2024-08-06)、gpt-4.1 (gpt-4.1-2025-04-14)、claude-sonnet-4 (claude-sonnet-4-20250514)、gemini-2.5-flash (gemini-2.5-flash)、Deberta (protectai/deberta-v3-base-prompt-injection-v2)、DataSentinel (DataSentinel-checkpoint-5000)、Llama Prompt Guard 2 (meta-llama/Llama-Prompt-Guard-2-86M)、Meta-SecAlign-70B (facebook/Meta-SecAlign-70B)。
对于 AgentDojo,AgentDojo 实现有两个小变化。 在旅行套件中的两个注入任务是偏好攻击,这会误导代理选择另一个合法的酒店而不是目标酒店。 这些攻击超出了威胁模型,并且不现实,因为如果攻击者可以控制信息来源,他们就不需要提示注入或其他针对代理的攻击方法来误导它;他们可以直接修改信息以实现目标,即使是人类也无法区分。 因此从所有实验中排除了这些注入任务。 对于 slack 套件中的另一个注入任务,AgentDojo 的实现直接在执行跟踪中查找攻击工具调用,以确定攻击是否成功,而不管工具调用是否成功。 方法中,即使工具被阻止,它仍然存在于带有阻止消息的跟踪中,并且会被错误地分类。 我们手动检查此注入任务的所有结果并更正结果。
评估指标:关注实用性和安全性,测量攻击成功率(ASR),它表明代理成功完成攻击目标的可能性。 与普通代理相比,强大的防御应该会显着降低 ASR,理想情况下将其降至零。