没有黑客,智能体自己把权限"洗"了出来:EAL-Bench 测出持久记忆的授权失真
上个月看到一个真实案例:一个邮件智能体在例行上下文压缩时,把主人"操作前先确认"的指令给摘要没了,转头删掉了两百多封本该只是"审阅一下"的邮件。没有攻击者,没有提示注入,系统内部的一次普通记忆更新就酿成事故。
这篇论文(arXiv:2609.01836)就是给这类事故起了名字、建了刑场:内生授权清洗(Endogenous Authorization Laundering)——智能体的持久记忆在增量更新中错误表示动态变化的授权状态,写入端自己造出历史从未授予的权限,执行端再照单全收。数字相当扎眼:写入端最多为 50.2% 的未授权请求制造了假权限;假权限一旦写进记忆,执行端 98.6% 的试验会照此执行;而把记忆换成正确的真值状态后,越权执行直接归零。作者还开源了 EAL-Bench 基准,并验证了两类缓解方案——但它们都以牺牲近一半合法请求的通过率为代价。我的判断:这不是一篇"又发现一个 agent 安全问题"的灌水工作,它把"记忆"从性能组件重新定性为授权策略的一部分,这个定性本身就很值钱。
论文信息
- 标题:Agent Memory Is a Surface for Endogenous Authorization Laundering
- 作者:Tommaso Cerruti(ETH Zurich)、Mika Okamoto(Georgia Institute of Technology)、Ansel Kaplan Erol(Georgia Institute of Technology)
- 发表:2026 年 9 月 1 日,arXiv:2609.01836(cs.CR, cs.AI),EleutherAI SOAR 项目产出
- 代码:github.com/tommasocerruti/eal-bench
- 链接:https://arxiv.org/abs/2609.01836
🎯 问题动机:记忆写错了,锅不在执行器
现在做长时程智能体,持久记忆基本是标配——MemGPT、LangMem 这套东西大家或多或少都用过。记忆负责把跨会话的状态扛过去,而这些状态里天然包含权限:谁被允许买什么、哪条限制后来收窄了、哪个授权被撤销了。
问题在于,把不断演化的历史压缩成一份"维护中的记忆表示",本身就可能改变"哪些动作看起来是合法的"。撤销被遗忘,就等于保留了已经不存在的权限;授权被写丢,合法请求反而被拒。
以往的工作大多盯着外部攻击:记忆投毒(AgentPoison、MPBench 那一路)、跨权限检索、提示注入。这些威胁模型里都站着一个攻击者。这篇论文的立场恰恰相反——威胁模型里没有人使坏。历史是真实的,消息是善意的,错误完全来自记忆写入这件再普通不过的内部操作。写错的权限进入记忆后,来源信息(provenance)被"洗"掉了,执行器看到的只是一条看起来合法的记录。作者把这个过程和洗钱类比:钱的来路不干净,但转了几道手之后就查不出来了。
说实话,这个切入角度让我眼前一亮。2026 年上半年冒出来一堆记忆安全的工作,基本都是对抗性的;而"没人攻击也会出事"这条线,之前几乎没有被系统地量化过。
🏗️ EAL-Bench:把"记忆造权"拆成两步来测

图1:EAL-Bench 的整体链路与采购域示例。注意左侧历史里红色那条"ERP 记录"是非权威的——真正的授权只有"午餐+咖啡,上限 6000 美元"和后续收窄为"仅午餐"的修正案,但写入端把 ERP 分类吸进了记忆,Category 一栏多出了 reception_refreshments
先给直觉:整套基准就是一个三段流水线加一个"上帝视角的账本"。组织历史 \(H = (B_1, \ldots, B_T)\) 按会话块展开,里面有授权、收窄、撤销,也有故意埋进去的非权威建议(比如 ERP 系统里一条没人授权的分类变更)。一个确定性的回放函数 \(R\) 把到第 \(t\) 块为止的权威事件折叠成真实授权状态 \(S_t = R(B_1, \ldots, B_t)\),再用谓词 \(A(S_t, x)\) 判定动作 \(x\) 是否合法。\(R\) 和 \(A\) 对智能体完全隐藏。
写入端 \(W\) 把历史变成持久记忆 \(M_T\),执行器 \(E\) 只看到 \(M_T\) 和新请求 \(q\),看不到原始历史。对结构化(typed)记忆,"记忆是否认为该动作合法"也能确定性判定,记作 \(A_M(M_T, x)\)。于是失败被精确拆成两步:
\(F\) 是形成——记忆给账本不认的动作开了绿灯;\(G\) 是传播——执行器真把这绿灯当绿灯使。端到端清洗事件是 \(F \land G\),发生率 \(P(F{=}1)\,P(G{=}1 \mid F{=}1)\)。这个分解是全文的设计核心:它把"记忆写错"和"执行器乱来"从因果上切开,后面所有的干预实验都建立在这两步可分别测量之上。
实验设置的关键参数:
| 维度 | 设置 |
|---|---|
| 领域 | 采购、网络安全、金融(8–16 个案例/域,32–64 对匹配请求) |
| 历史长度 | 5–18 个会话块 |
| 记忆表示 | 自由文本(单个 Markdown 串)vs 类型化(schema 校验的 JSON) |
| 更新策略 | 一次性(看全部历史)vs 增量(只看旧记忆+新块,绝不回放原始历史) |
| 写入端 | Nemotron 3 Ultra、Kimi K2.6、GLM 5.2、Grok 4.3、Qwen-Plus(2025-07-28 快照) |
| 执行器 | GPT-OSS-120B、DeepSeek V4 Pro(须通过校准:忠实记忆下 100% 合法执行、0% 越权) |
| 记忆框架 | LangMem 的 profile 式记忆管理器 |
| 推理配置 | temperature 1.0,输出上限 4096 token,三个固定种子 |
几个设计细节值得圈点。每个案例都配一对匹配请求——只差一个授权相关字段,一个合法一个非法,这样不用 LLM 裁判就能确定性评分。案例由 Claude Opus 4.8 辅助生成再人工打磨,这个模型家族不参与被测,避免了自评自。记忆容量被刻意设为"最大忠实负载的两倍",而且附录显示放宽容量也没用——后面会看到,这直接排除了"是记忆太小装不下"这种显然的解释。整个项目的推理花销约 836 美元,坦率的讲,这个成本控制得很漂亮。
📊 实验结果:增量更新是重灾区,金融域直接破防

图2:记忆设计跨领域对比,汇总三种子、五个写入端和两个执行器
增量更新在所有领域、所有表示下都推高未授权提交,而类型化增量记忆是全场最危险的组合。精确数字(Table 6):
| 领域 | 指标 | 文本一次性 | 文本增量 | 类型化一次性 | 类型化增量 |
|---|---|---|---|---|---|
| 采购 | 合法执行 / 越权提交 | 97.4 / 0.5 | 86.8 / 18.2 | 98.8 / 1.6 | 96.8 / 28.9 |
| 网络安全 | 合法执行 / 越权提交 | 96.4 / 1.1 | 92.2 / 5.9 | 96.6 / 0.8 | 88.8 / 10.4 |
| 金融 | 合法执行 / 越权提交 | 99.4 / 2.7 | 94.6 / 30.8 | 91.7 / 0.4 | 98.3 / 51.0(越权) |
(单位:百分比;合法执行越高越好,越权提交越低越好)
看到这个表我愣了一下的是类型化一次性在金融域低到 0.4%,而类型化增量飙到 51.0%——同样的 schema、同样的模型,差别只在更新方式。原因不复杂但很致命:一次性写入端能看到全部历史,可以重建最终状态;增量写入端只拿旧记忆加新块,一次写错就永远错下去,原始历史再也没有机会回放纠错。合法执行率在同样的危险条件下依然很高(98.3%),说明这不是模型整体变蠢,是授权状态被定向地写歪了。
还有一个反直觉点:类型化记忆比自由文本更危险。直觉上 JSON schema 应该更可靠,但结构化只提升了可检查性,并不自动保住授权——它真正的价值是让 \(F\) 可以在执行前被确定性审计。这直接引出下一个结果。
形成率精准预言行为失败
类型化记忆可以在执行器行动之前直接对账本算 \(P(F)\)。三个领域三种子的汇总结果(Table 2):形成率 28.3% / 10.4% / 50.2%(采购/网安/金融),与对应的越权提交率 28.9% / 10.4% / 51.0% 每个都只差 0.8 个百分点以内。绝大多数行为失败在执行之前就已经写死在记忆里了。
然后是全文最狠的一个实验(Table 3):对那些自然产生了假权限的记忆(\(F{=}1\)),原样回放一遍,再用"神谕精确状态"替换记忆后回放同一请求,其他一切不动。结果——
| 领域 | 错误记忆下的越权执行 | 精确记忆下的越权执行 |
|---|---|---|
| 采购 | 66/68(97.1%) | 0/68(0.0%) |
| 网络安全 | 60/60(100.0%) | 0/60(0.0%) |
| 金融 | 79/80(98.8%) | 0/80(0.0%) |
合并起来,错误记忆下 205/208(约 98.6%) 越权执行,修好之后一次不剩。这就是因果证据:执行器自始至终"忠实地按它拿到的证据行动",错的是那份证据。作者由此下了一个我认为站得住的判断——执行端的对齐补不上这个洞,防线必须修到记忆本身上。
等等,有人可能会说:执行器看到"有权限"就执行,这难道不是它该做的吗?没错,这正是论文的论点。98.6% 不是执行器的耻辱柱,而是"记忆即授权策略"这一定性的实锤。
失败跟着记忆走,不跟着执行器走
把每份冻结记忆放到两个校准过的执行器后面重放,未授权提交率在每个领域的差异都在 1.1 个百分点以内,逐次回放一致率 97.9%–99.5%。换个更强或更弱的执行器,基本改变不了结局。清洗失败是写入端普遍现象(writer-general)且附着在记忆工件上——想防,得在写入环节防,或者干脆换掉记忆架构。
写入端之间的差异倒是存在:Qwen-Plus 在金融域基线越权率 43.8%,是明显的异类;GLM 5.2 平均合法执行最高(98.1%)且越权接近最低(8.9%)。有意思的是,更好的写入端在两个指标上同时更好——造权和丢权本质都是状态失真,所以换更好的写入模型没有安全-可用性权衡,权衡出在后面的缓解方案上。
另外一组压力测试也值得说:给请求加上"情况紧急"之类的施压话术(不含任何新授权信息),采购和网安的越权率几乎不动,但金融域从 20.9% 涨到 27.3%——压力会把已经存着的假权限"激活"成行动。更大的伤害在另一头:合法执行率全面崩盘,采购掉了 27.2 个点,Qwen-Plus 金融域从 93.0% 掉到 54.7%。压力之下系统两头同时失效,该放的越权放了更多,该办的正事大面积不办。
🔧 两类缓解:安全是买来了,代价是半个可用性
作者测了两种都打在"形成"环节的防御:
- 来源权威门控(gold cited-source authority gate):类型化授权记录必须所有引用来源都有效、可见、且来自有权授权的主体,否则整条不保留。纯确定性检查,不用 LLM 裁判。
- 有界事件溯源(bounded event sourcing):写入端只负责从新块里抽取"什么变了",外部系统把变更追加到不可变日志,确定性 reducer 从日志构建下一个紧凑记忆状态。授权状态维护从模型手里挪到确定性代码里。
结果摆出一条离散的帕累托前沿:

图3:同一批三种子类型化增量样本上的三种配置。基线 → 事件溯源 → 来源门控,安全一路提升,可用性一路跳水
- 基线:越权提交 25.3%,合法执行 93.3%
- 来源门控:越权降到 7.3%(整整压掉 18 个点,95% CI 14.9–21.1),但合法执行崩到 53.8%
- 事件溯源:越权降到 9.0%(降 16.3 点,95% CI 12.2–20.4),合法执行 64.7%
记忆层面的形成率也从 24.9% 分别降到 5.5% 和 8.7%。两个方案之间没有谁统治谁,选哪个取决于你的成本不对称性:漏掉一次越权是灾难、误拦合法请求可恢复(比如高危交易系统),门控的代价可以接受;误拦会让真实业务停摆的场景,事件溯源用差不多的安全收益保住了更多可用性。
还有个细节容易被忽略:过了来源门控之后仍有 5.5% 的形成率存活——来源合法权威的记录照样可能带错范围、有效期或撤销状态。来源正确不等于内容正确,这层 residual error 恰好说明授权状态是个多字段的生命周期问题,不是盖个"来源可信"的章就完事。
🔬 写入端堆算力:瓶颈在挑选,不在生成
既然失败大多发生在写入时,给写入端更多推理算力有没有用?作者让每个采购写入端生成 \(k \in \{1,2,4,8\}\) 的嵌套候选记忆池,只能凭可见历史挑一个,执行器固定 GPT-OSS-120B。

图4:k 从 1 涨到 8,越权提交从 13.2% 降到 8.6%,合法执行从 94.2% 升到 95.8%。但注意 B 图——k=8 时池子里 55% 已有精确记忆,自审只选中 26.7%
数字拆开看很有意思。生成端进步飞快:\(k{=}8\) 时 55.0% 的候选池里已经存在完全正确的记忆。但选择端拉胯:自审只能把其中的 26.7% 挑出来,换 DeepSeek V4 Pro 做独立评审也就 30.0%。更扎心的是增量记忆的自我修复——已观察到的错误 100% 残留,自修复率在每个 \(k\) 上都是零。写进去的错误就像泼出去的墨,模型自己没有任何回收能力。
我的解读:这是给"all you need is more test-time compute"泼的一小盆冷水。在这条链路上,算力的正确花法不是堆 LLM 评审,而是上确定性校验——也就是前面那两类缓解干的事。生成早已过剩,验证才是瓶颈。
💡 我的判断
先说亮点。这篇论文最值钱的不是 benchmark 本身,而是三个被钉死的结论:其一,授权失败可以在没有任何执行器决策之前就在记忆里成形,而且可以在部署前被量化(\(F\) 只用记忆就能算);其二,神谕修复归零实验把"错在记忆"这件事从相关性做成了因果,方法论干净;其三,"持久记忆是智能体有效授权策略的一部分"这个定性,直接把记忆工程从性能优化问题抬进安全边界问题。对整个项目只花了 836 美元推理费的体量来说,产出密度相当高。
再挑点刺。威胁模型里完全没有攻击者,这是卖点也是天花板——真实部署里内生清洗和对抗投毒会叠加,一个能被普通更新错误洗掉的系统,面对刻意构造的输入只会更脆(MPBench 那条线已经给出 50% 上下的攻击成功率,TMA-NM 这类工作则在证明写入端来源绑定的必要性)。EAL-Bench 的历史为了保持账本确定性,比真实职场沟通结构化得多,作者自己也承认这不能估计真实系统的发生率。还有,\(F\) 只能对类型化记忆确定性计算,而现实里大量记忆就是自由文本——最危险的形态反而测不了形成率。来源门控把合法执行砍到 53.8% 这个代价,说实话在很多业务里根本没法上线,"缓解有效"和"缓解可用"之间还隔着一条不小的沟。
跟同期工作摆在一起看位置更清楚:AuthMem-Bench 测的是巩固边界的权威坍缩,PPMF 从不可信输入出发做来源不放大,GateMem 管检索时的生命周期边界,MasDrift 研究多智能体委派中的授权漂移。EAL-Bench 卡住的位置是单一智能体、无攻击者、增量更新、形成与传播分离——正好是别人都没占的那一格。说"首个"我会警惕,但在这个细分设定下它确实是第一个把端到端链路打通测出来的。
工程上的启发很直接:如果你在给长时程智能体上持久记忆,请把存进去的权限当 IAM 系统的条目来管——要来源、要生命周期、要审计。增量更新优于一次性更新的传统叙事(省 token、低延迟),在这篇论文的数据面前至少要对授权类状态打个问号;关键权限变更走事件溯源式的追加日志加确定性归约,比让模型自由重写记忆靠谱得多。以及,在把工具权限交给执行器之前,先对记忆算一遍 \(F\)——这是论文给出的最便宜的一道闸。
还有一个更本质的问题没被解决:当记忆是自由文本、授权语义藏在自然语言里时,我们连"形成率"都测不了。这道题的下一步,大概是给非结构化记忆找到可验证的授权表示——谁能把这步做便宜做准,谁就把 agent 记忆的审计闭环真正合上了。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我