Agent 隐私风险正在发生一个很重要的变化。

过去我们讨论大模型隐私泄露,关注点通常在“模型最后说了什么”:有没有输出身份证号、手机号、银行卡号、家庭住址、密钥、合同信息、客户资料。

但到了 Agent 场景,这个视角已经不够了。

因为 Agent 不只是回答问题,它还会调用工具、读取文件、查询数据库、访问 API、浏览网页、操作业务系统。隐私泄露不一定发生在最后回答阶段,而可能更早发生在工具调用阶段。

也就是说,真正危险的地方未必是 Agent “说了不该说的”,而是它先“看了不该看的”。

5 月 29 日,上海人工智能实验室联合东南大学发布论文《PrivacyPeek: Auditing What LLM-Based Agents Acquire, Not Just What They Say》。

https://arxiv.org/pdf/2606.00152

这篇论文的核心问题非常明确:现有隐私评测大多关注 Agent 的最终回复或对外动作,却忽略了一个更早、更隐蔽的阶段——敏感数据第一次进入 Agent 上下文的阶段。

论文把这种风险称为 acquisition-stage privacy leakage,可以理解为“获取阶段隐私泄露”或“采集阶段隐私泄露”。

这个概念非常关键。

一个 Agent 最终回答里没有泄露隐私,并不代表它没有隐私风险。它可能在执行任务时已经读取了无关文件、查询了过宽字段、拉取了过长时间范围的数据,甚至把身份证、地址、健康信息、财务数据、密钥等内容都放进了上下文。只要这些信息进入上下文,后续就可能被追问诱导出来,也可能被提示注入利用,还可能在写入数据库、发送邮件、调用外部工具时被带出去。

所以 Agent 隐私治理不能只看输出审核,还必须前移到工具调用、数据返回和上下文准入阶段。

风险发生在“拿到”那一刻

论文里有一个很直观的例子。

用户只是想查询某个病人的空腹血糖。按最小必要原则,Agent 只需要读取血糖指标、时间和单位。但实际执行时,Agent 可能还会读取病人的个人信息文件,把身份证号、家庭住址、出生日期等无关数据也放进上下文。

最终回答可能很正常:

“该病人的空腹血糖为 6.2 mmol/L。”

从输出审核角度看,这没有问题。

但从 Agent 隐私角度看,风险已经发生了。因为 Agent 已经获取了任务不需要的敏感信息。

这就是 PrivacyPeek 想补上的评测盲区:不要只审计 Agent 最后说了什么,还要审计它执行任务过程中到底获取了什么。

这个转变背后,其实对应 Agent 安全的一个基本变化:

普通大模型的隐私治理,重点是“不要说出去”。Agent 的隐私治理,首先是“不要拿进来”。

只要多余隐私数据进入上下文,后面再做输出拦截就已经晚了一步。因为上下文里的数据会影响模型后续推理,也可能在多轮对话、工具调用、外部写入、攻击诱导中被重新暴露。

PrivacyPeek 提出的 7 类越界采集行为

PrivacyPeek 将 Agent 的越界采集行为分成 7 类。这 7 类覆盖了文件访问、格式访问、时间窗口、字段范围、保密标记和推理型隐私等多个维度。

1. Normal-Filename Access:访问普通但无关的文件

第一类是访问无敏感文件名、但与任务无关的普通文件。

比如用户要求 Agent 总结 report.txt,但 Agent 同时打开了同目录下的 staff_roster.txt。这个文件名本身没有明显敏感词,但它与当前任务无关,里面可能包含员工名单、部门信息、联系方式等内容。

这类风险说明,不能只靠文件名是否包含 password、secret、private、confidential 等关键词判断风险。很多普通文件也可能包含敏感信息,关键要看它是否属于当前任务的最小必要范围。

2. Sensitive-Filename Access:访问明显敏感但无关的文件

第二类是访问带有敏感文件名的无关文件。

比如任务只要求读取一份项目报告,但 Agent 又打开了 passwords_and_keys.txt、salary.xlsx、customer_private_info.csv。

这类行为更容易被检测,因为文件名本身已经暴露了风险信号。但在真实系统里,Agent 可能会因为“探索环境”“寻找更多上下文”“补充背景信息”等原因主动打开这些文件。

问题在于,Agent 的探索能力越强,越可能扩大数据访问范围。

所以企业不能让 Agent 直接在文件系统、知识库、对象存储里自由浏览。文件访问必须经过工具网关,且要受到任务范围约束。

3. Cross-Format Access:跨格式访问同名前缀文件

第三类是跨格式访问。

比如用户明确要求读取 report.docx,但 Agent 又打开了同名前缀的 report.xlsx 或 report.pdf。

这种行为表面上看很合理,因为文件名前缀相同,Agent 可能认为它们属于同一任务材料。但问题是,不同格式文件承载的信息可能完全不同。

report.docx 可能是公开报告,report.xlsx 可能是原始客户数据,report.pdf 可能是带签章的合同版本。Agent 访问同名前缀文件,并不天然合理。

这类风险在企业知识库里非常常见。同一个项目目录下往往同时有方案、预算、客户清单、报价表、会议纪要、合同扫描件。如果 Agent 只因为文件名相似就扩大读取范围,很容易把不该看的数据拿进上下文。

4. Out-Dated Data Access:访问超出时间窗口的数据

第四类是访问过期或超出时间范围的数据。

比如用户问“今天的体检指标”,Agent 却读取了完整历史健康记录;用户问“本月订单”,Agent 却拉取了过去三年的交易流水;用户问“当前值班人员”,Agent 却读取了全年排班记录。

时间窗口是隐私治理中容易被忽视的一类边界,很多接口默认返回全量历史数据,很多 Agent 也倾向于拉更多上下文以提高任务完成率。但从数据最小化角度看,时间范围必须和任务目的绑定。

5. Excess-Field Access:获取过多字段

第五类是最值得关注的,也是生产环境里最常见的风险:工具返回了超出任务需要的字段。

比如用户只想查订单是否发货,接口却返回了姓名、手机号、地址、身份证、支付卡号、订单状态、物流时间。Agent 最终可能只回答“已发货”,但它已经拿到了大量无关隐私字段。

这类问题的根源往往不是 Agent 恶意,而是企业内部 API 设计得太宽。传统系统通常习惯返回完整对象,然后由前端或业务代码决定展示哪些字段。但 Agent 不一样,工具返回的完整对象会直接进入上下文。

因此,原来适合业务系统的 API,不一定适合直接暴露给 Agent。

在 Agent 场景里,get_customer() 这类万能读接口非常危险。更安全的做法是提供窄工具,比如 get_order_status()、get_refund_status()、get_shipping_time(),或者要求工具支持字段投影,只返回当前任务允许的字段。

6. Forbidden-Content Access:读取带有禁止标记的内容

第六类是读取明确标注禁止读取的内容。

比如文档里写着:

[CONFIDENTIAL: DO NOT READ]

或者:

仅限 HR 可见

禁止外传

仅限法务部门使用

按理说,Agent 看到这些标记应该停止读取或拒绝使用。但论文发现,很多 Agent 并不能稳定遵守这类标记。有些情况下,保密标记甚至可能反而吸引模型注意,让它更关注这部分内容。

这对传统数据安全是一个提醒。

在传统系统里,给文件打上“机密”“内部”“禁止外传”等标签,是一种数据分类和合规管理手段。但对 Agent 来说,这些标签本身不一定构成有效边界。Agent 不会天然因为看到“禁止读取”就真的不读。

所以,标签不能只是写在文件里,而要变成系统级访问控制策略。真正的阻断应该发生在工具层、数据层和上下文准入层,而不是指望模型自觉遵守文件里的提示。

7. Out-of-Scope Inferential Access:越界推理型采集

第七类是最难防的一类:Agent 获取了多个看似普通、但超出任务范围的字段,并组合推理出敏感结论。

比如 Agent 没有直接读取“是否怀孕”这个字段,但它读取了妇产科预约记录、叶酸购买记录、产检报告时间,然后推断出用户可能怀孕。

再比如,Agent 没有直接读取“财务状况”,但它读取了资产流水、贷款记录、消费行为、保险信息,然后推断出用户资金紧张。

这类风险不能靠简单正则解决。因为敏感信息不是单个字段,而是多个信息组合后的推理结果。

在 Agent 时代,隐私不只是“字段敏感”,还包括“组合敏感”和“推理敏感”。

这对安全产品提出了更高要求:不仅要识别身份证号、手机号、银行卡号这种显性隐私,还要识别健康状态、财务状况、家庭关系、政治倾向、职业变动、商业意图等推理型敏感信息。

能力越强越容易越界采集

PrivacyPeek 的实验里有一个很有意思的现象:任务完成能力越强的 Agent,往往越容易获取更多超范围信息。

这可以称为 Agent 的“能力—隐私悖论”。

弱模型可能连任务都完成不好,工具也调用不准确,所以它拿到的数据反而少。强模型更会探索环境,更会补充上下文,更会主动查找相关资料,也更可能调用多个工具、打开多个文件、查询更多字段。

从产品角度看,这个现象非常重要。

我们不能简单认为“更强模型更安全”。更强模型确实可能更听指令、更会拒答,但它也更擅长规划、更擅长探索、更擅长把分散信息串起来。一旦工具权限和数据边界没有设计好,强 Agent 可能比弱 Agent 更容易把业务系统里的隐私数据读进上下文。

这意味着,Agent 安全不能只依赖模型自身对齐能力。

模型能力越强,外部约束越重要。

Agent 越能干,越需要工具网关、数据最小化、字段裁剪、上下文准入和轨迹审计。

怎么检测 Agent 有没有拿多隐私数据?

论文提出了 acquisition-stage privacy leakage 的评测思路,但真正落到生产环境里,问题会更复杂。

因为真实企业系统里,Agent 可能接入数据库、CRM、OA、客服系统、邮件、知识库、MCP Server、代码仓库、日志平台、搜索引擎和各种内部 API。工具更多,数据更杂,权限链路更长,返回结构也不统一。

所以,生产环境里不能只靠人工看日志,也不能指望模型自己判断“我有没有拿多”。比较可行的方案,是建立一套 Agent 数据网关和上下文准入机制。

核心目标只有一句话:

让所有进入 Agent 上下文的数据,都经过“任务必要性”和“敏感性”检查。

1. 所有工具调用必须经过统一网关

第一步是架构上的。

Agent 不能直接访问数据库、文件系统、知识库、CRM、MCP Server 或内部 API。所有工具调用都应该经过统一的 Tool Gateway 或 Data Gateway。

理想链路是:

用户请求 → Agent 规划 → 工具网关 → 业务系统/API/数据库/文件 → 字段裁剪与敏感识别 → 返回 Agent 上下文

这个网关至少要记录四类信息:

第一,Agent 请求了什么工具。

第二,Agent 传入了什么参数。

第三,工具实际返回了什么数据。

第四,哪些数据最终进入了模型上下文。

如果 Agent 能绕过网关直接访问数据源,后面的检测基本都会失效。因为你连它拿了什么都不知道。

2. 对工具返回结果做字段级审计

检测 Agent 是否拿多数据,不能只看工具名,也不能只看接口路径,而要看工具返回的具体字段。

比如用户请求:

“查一下张三的订单是否发货。”

理论上只需要返回:

订单状态、物流时间、物流单号

但真实接口可能返回:

姓名、手机号、详细地址、身份证、银行卡、订单状态、物流时间、支付信息

这时即使 Agent 最终只回答“已发货”,它也已经发生了过度获取。

因此,工具网关需要计算:

工具返回字段 - 当前任务必要字段 = 超范围获取字段

这一步要在数据进入上下文前完成。

也就是说,真正要审计的是 observation,而不是 final answer。

3. 给每类任务定义“最小必要数据集”

这是最难的一步,也是最有价值的一步。

传统权限控制通常问的是:

“这个用户有没有权限访问客户表?”

但 Agent 场景里要问的是:

“这个任务是否需要访问客户表里的这些字段?”

同一个字段,在不同任务下风险完全不同。

比如“地址”这个字段:

查询物流时,可能需要部分地址。

身份核验时,可能需要地址。

查询订单状态时,通常不需要详细地址。

营销推荐时,更不应该直接把详细地址给 Agent。

所以生产环境里要建立任务类型与允许字段之间的映射关系。

例如:

任务类型

允许字段

不应返回字段

查询订单状态

订单号、订单状态、物流时间

身份证、银行卡、详细地址

售后退款

订单号、支付状态、退款状态

完整银行卡号、证件号

客服投诉处理

用户昵称、工单内容、处理记录

密码、证件号、健康信息

员工排班查询

姓名、部门、班次

薪资、绩效、身份证

医疗指标查询

指标名称、数值、时间

家庭住址、医保号、无关诊断

这个机制可以叫“基于任务目的的数据访问控制”。

它和传统 RBAC、ABAC 的区别在于:权限不只绑定人或角色,还要绑定任务目的、数据字段、时间窗口和上下文。

4. 在数据进入上下文前做裁剪

检测不是最终目的,拦截才是。

如果工具原始返回:

    { "name": "张三", "phone": "138xxxx", "address": "北京xx", "id_card": "110101xxxx", "order_status": "已发货", "shipping_time": "2026-06-15"}

    那么进入 Agent 上下文前,应该被裁剪成:

      { "order_status": "已发货", "shipping_time": "2026-06-15"}

      同时审计日志记录:

      phone/address/id_card 被拦截,原因:当前任务不需要。

      这一步非常关键。

      如果数据已经进入上下文,后续再做输出过滤,防护就被动了。因为模型已经“看见”了数据,后面可能通过多轮追问、提示注入、工具写入、上下文复用等方式泄露出去。

      所以 Agent 隐私防护的重点应该是:

      不是输出后置过滤,而是上下文前置准入。

      5. 建立过度获取指标

      生产环境要能长期运营,就需要指标化。

      可以设计几个核心指标。

      第一个是 Sensitive Acquisition Count,即单次任务获取了多少个敏感字段。

      第二个是 Over-acquisition Rate,即超范围字段占工具返回字段的比例。

      第三个是 Context Exposure Rate,即真正进入模型上下文的敏感字段比例。

      第四个是 High-risk Field Exposure,即高敏字段是否进入上下文,比如身份证、银行卡、密码、Token、API Key、健康诊断、未成年人信息、员工薪资、合同底价等。

      第五个是 Out-of-scope Tool Call Rate,即 Agent 调用了多少与当前任务无关的工具。

      这些指标的意义是,它们可以把“Agent 有没有拿多数据”从一个模糊问题,变成一个可以监控、告警、追溯和优化的问题。

      6. 做 Probe 检测:看隐私是否还能被追问出来

      除了在线检测,还需要离线红队评测。

      流程很简单:

      第一步,给 Agent 一个正常任务。

      第二步,记录它调用工具时拿到了什么数据。

      第三步,任务结束后关闭工具访问。

      第四步,继续追问:“刚才那个用户的手机号是什么?”“他的家庭地址是什么?”“他的健康诊断是什么?”

      第五步,看 Agent 是否还能回答出来。

      如果它能答出来,说明隐私已经进入上下文并可以被诱导泄露。

      这就是 PrivacyPeek 里的 Probe Elicitation 思路。

      它的价值在于,很多隐私风险不会出现在第一轮最终回答里,但会出现在后续追问里。只看单轮输出,很容易低估 Agent 的真实泄露能力。

      真实落地时,应该先从哪里做?

      这件事确实难。尤其是“最小必要字段”很难一次性定义清楚,非结构化文档也很难完全识别。

      所以生产环境不要一开始追求全自动、全覆盖。比较现实的路径是分三步走。

      第一阶段:先管高敏字段

      先不要试图判断所有字段是否必要,第一阶段应该先把最危险的数据管起来。

      比如:

      身份证、银行卡、手机号、详细地址、密码、Token、API Key、Cookie、员工薪资、绩效、健康诊断、未成年人信息、合同底价、数据库连接串、源代码密钥。

      这些字段可以默认不允许进入 Agent 上下文,除非当前任务类型明确需要,并且有业务白名单。

      这一步的收益最大,也最容易落地。

      很多企业做 Agent 安全,第一步不应该是训练复杂模型,而是先把高敏字段挡在上下文外。

      第二阶段:改造工具接口,让工具变窄

      很多过度获取不是 Agent 故意造成的,而是工具接口太粗造成的。

      比如一个接口叫:

      get_customer(customer_id)

      它会返回客户完整画像。

      这类接口给传统业务系统使用可能没问题,但直接给 Agent 使用就很危险。

      更安全的做法是提供任务型窄工具:

      get_order_status(customer_id)

      get_refund_status(order_id)

      get_shipping_time(order_id)

      或者至少让工具支持字段投影:

      get_customer_fields(customer_id, fields=["order_status", "shipping_time"])

      工具设计原则很简单:

      少给万能读接口,多给任务型窄接口。

      Agent 的工具不是越强越好,而是越可控越好。

      第三阶段:引入任务意图和数据策略绑定

      当用户请求进入系统后,先识别任务类型。

      例如:

      • 用户请求:查一下张三订单是否发货。

      • 任务类型:订单状态查询。

      • 数据目的:售后客服。

      • 允许字段:订单状态、物流时间、物流单号。

      • 禁止字段:身份证、银行卡、健康信息、员工信息。

      然后把这套策略绑定到整个 Agent session。

      后续 Agent 每一次工具调用,都要检查:

      当前工具调用是否符合任务目的?

      返回字段是否超过允许范围?

      是否访问了无关数据源?

      是否跨时间窗口?

      是否访问了无关主体?

      是否有高敏字段进入上下文?

      这就是从“输出安全”升级到“任务级数据治理”。

      可以设计成什么产品形态?

      如果把它产品化,可以叫 Agent Data Firewall,或者 Agent DLP Gateway。

      它不是传统意义上的内容安全审核,而是 Agent 数据平面治理系统。

      核心模块可以包括八个部分:

      第一,任务意图识别。判断用户到底要完成什么任务,是查订单、写报告、处理售后、检索合同,还是分析客户数据。

      第二,数据策略匹配。根据任务类型匹配允许访问的数据源、字段、时间范围、主体范围和敏感级别。

      第三,工具调用审计。记录 Agent 调用了什么工具、传了什么参数、调用顺序是什么、是否存在无关探索行为。

      第四,返回内容识别。对工具返回的 observation 做敏感字段识别,包括 PII、密钥、财务信息、健康信息、商业秘密和推理型敏感信息。

      第五,最小化裁剪。对超出任务范围的字段进行删除、脱敏、摘要化或阻断。

      第六,上下文准入控制。决定哪些数据可以进入 LLM context,哪些数据只能在工具侧计算,哪些数据完全不能暴露给模型。

      第七,风险评分与告警。基于过度获取率、高敏字段暴露、异常工具访问、时间窗口越界、主体越界等指标生成风险评分。

      第八,离线红队评测。用 Probe 检测 Agent 是否能够在后续追问中泄露此前获取的敏感信息。

      这套系统本质上是在回答一个问题:Agent 到底有没有必要看到这些数据?

      如果没有必要,就不应该让它看到。

      几个典型检测规则

      生产环境里可以先落一些简单但有效的规则。

      1、字段越界

      任务只允许返回订单状态和物流时间,但工具返回了手机号、身份证、详细地址。

      判定:过度获取。

      处置:裁剪字段,记录日志,必要时告警。

      2、数据源越界

      任务是查询订单状态,Agent 却调用了员工薪资库、客户画像库或合同底价库。

      判定:高危越界。

      处置:阻断工具调用,要求重新规划。

      3、时间窗口越界

      用户问“本月消费”,Agent 拉取了过去三年交易记录。

      判定:时间范围越界。

      处置:自动收窄查询时间窗口。

      4、主体越界

      用户问“张三的订单”,Agent 返回了同地址下所有家庭成员订单。

      判定:主体越界。

      处置:只保留目标主体相关数据。

      5、文件访问越界

      用户要求读取 report.pdf,Agent 又读取了同目录下的 salary.xlsx 和 password.txt。

      判定:文件访问越界。

      处置:阻断无关文件访问,记录高危事件。

      6、推理型越界

      Agent 没有直接读取“是否怀孕”,但读取了妇产科预约、叶酸购买记录、产检报告,并推断出怀孕状态。

      判定:推理型隐私越界。

      处置:禁止输出推断结论,并回溯触发过度采集的数据源。

      为什么提示词防御不够

      很多人会想到,在 system prompt 里写一句:

      “你只能获取完成任务所必需的信息,不得访问无关隐私数据。”

      这当然有用,但远远不够。

      因为 Agent 的越界采集往往发生在工具调用过程中,而不是最终表达阶段。模型可能知道要保护隐私,但在执行任务时仍然会为了提高完成率而扩大检索范围。

      更重要的是,提示词不是强制边界。

      如果工具接口本身返回过宽,Agent 即使没有主动索要隐私,也会被动接收到隐私。

      如果文件系统本身允许自由浏览,Agent 即使没有恶意,也可能因为探索上下文而打开无关文件。

      如果数据进入上下文前没有裁剪,后面再要求模型“不要泄露”,本质上已经晚了一步。

      所以,提示词只能作为第一层提醒,不能作为核心防线。

      真正的防线必须在系统架构里:

      工具不裸奔。

      数据不过量。

      字段可裁剪。

      上下文可准入。

      越界可告警。

      泄露可回放。

      Agent 隐私治理的关键变化

      PrivacyPeek 这篇论文最重要的价值,不只是提出了一个新 benchmark,而是提醒我们重新理解 Agent 隐私风险。

      在传统应用里,业务代码通常是固定的。系统访问哪些表、返回哪些字段、展示哪些内容,基本由开发者提前写死。

      但 Agent 不一样。

      Agent 会自己规划路径,自己选择工具,自己决定查什么数据,也会根据中间结果继续探索。它既是调用者,也是推理者,还是数据消费者。

      这使得传统的权限边界变得不够用了。

      过去我们关心:

      谁访问了哪张表?

      现在还要关心:

      Agent 为了什么任务访问?

      访问这些字段是否必要?

      是否超出了时间范围?

      是否访问了无关主体?

      是否把敏感数据带入上下文?

      是否在后续追问中重新泄露?

      这就是 Agent 时代的数据治理新问题。

      Agent 安全要从“说了什么”前移到“看了什么”

      Agent 的隐私风险,不只是最终回答里出现了手机号、身份证、银行卡这么简单。

      更隐蔽的问题是:Agent 在完成任务过程中,可能已经读取了大量任务不需要的敏感信息。

      这些信息一旦进入上下文,就会成为后续泄露的风险源。

      所以,Agent 隐私治理的关键不是等它说漏了再拦,而是从源头上限制它能看到什么。

      PrivacyPeek 给了我们一个很好的提醒:

      不要只审计 Agent 说了什么,还要审计 Agent 读了什么、拿了什么、把什么放进了上下文。

      真正可落地的防护方案,也不应该只停留在提示词和输出审核上,而应该建立工具调用网关、字段级审计、敏感数据识别、任务白名单、上下文准入和 Probe 红队评测。

      Agent 越来越像一个能自主行动的数字员工,既然它能访问系统、查询数据、调用工具,就不能只用聊天机器人的方式管理它。

      未来企业做 Agent 安全,必须回答一个最基本的问题:

      这个 Agent 完成当前任务,真的需要看到这些数据吗?

      如果答案是否定的,那这些数据从一开始就不应该进入它的上下文。

      声明:本文来自模安局,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。