名称不是对象:面向被攻陷编码 Agent 的对象绑定隔离机制
Names Are Not Objects: Object-Bound Confinement for Compromised AI Coding Agents
作者提出编码智能体限制架构ZTAC,在74项攻击中阻断58项、升级14项审查,作者称其遏制了全部10项披露事件复现。
攻击者完全控制Cell内的模型、智能体运行时及编写运行的代码;可在会话前在工作区植入符号链接、硬链接和.git内容等任意文件;知晓策略和所有Cell公钥;无其他Cell私钥,只能通过代理展示的摘要和自由文本意图接触审查者。
- AI编码智能体受提示词注入攻破后拥有开发者本地权限。现有基于名称(命令字符串、路径等)的检查容易因路径别名、参数解析、环境与仓库配置隐式加载等造成检查与使用时的对象脱节,导致逃逸与越权。
- 作者提出零信任智能体单元(ZTAC),在内核沙箱内运行智能体并通过套接字由受信任Broker中介所有操作;Broker在决策前将请求解析为具象对象,通过openat逐级遍历避免竞态,并将相同策略编译入衍生程序沙箱。
- 在74项攻击测试中,ZTAC阻断58项并升级14项审查,仅漏掉2项允许通道内编码外发攻击,遏制了全部10项公开披露事件复现;良性负载中完成43/46项操作与4/7个工作流,无操作请求中位数延迟为4.0 ms。
- ZTAC无法防范在策略允许通道内编码泄露机密;禁止进程创建导致依赖子进程的构建工作流失败;交接规则依赖已知工具特征枚举;评测基于脚本请求与单项目,未测试真实智能体运行时与沙箱逃逸。
- 基准
- 74-attack evaluation suite46 checked operations workload7 workflows suite52 path/access agreement cases
- 指标
- Attacks succeededAttacks escalated for reviewAttacks blockedOperation completion rateWorkflow completion rateLatency
Daniel Commey 提出 Zero-Trust Agent Cells(ZTAC),一种假定编码 Agent 已被提示注入完全攻陷的隔离架构:Agent 运行在内核沙箱中,只能通过 Unix socket 向 broker 发送签名请求,broker 先把请求解析为具体对象(按工作区路径与 inode 识别的文件、程序与参数向量、端点)再作决定,并把同一套路径策略编译进每个被启动程序的 Seatbelt 沙箱。在 74 项带真值判定的攻击中,工具允许列表放过 66 项,允许列表加部署 Agent 常用的命令沙箱放过 56 项,ZTAC 仅 2 项成功、14 项转入人工审核,并拦截全部 10 起公开披露事件的重放;作者称其 macOS 原型含 3,164 行可信 Rust 代码,46 项正常操作完成 43 项、出现 8 次审批提示,7 个工作流完成 4 个。
推荐理由论文把编码 Agent 的多类逃逸归因于名称与对象错配,并用 74 项攻击对比允许列表与命令沙箱的拦截差异。
深度解读
这篇论文试图解决什么问题?
作者称编码智能体防御失效根源在于检查名称与实际生效对象的分离,并提出基于对象绑定的限制架构。
这篇论文试图解决被攻破(Compromised)的 AI 编码智能体在宿主机器上越权操作与逃逸沙箱的问题。
- 场景与重要性:编码智能体在开发者机器上读取未受信任的仓库、议题与文档,并以用户权限调用本地工具。作者指出,提示词注入防御无法完全阻止模型被恶意诱导,系统外围必须具备在智能体已受侵害前提下的经典限制(Confinement)能力。
- 现有机制的不足:现有的命令白名单、权限确认弹窗及命令沙箱无法有效约束。作者分析 2025 至 2026 年公开披露的漏洞指出,白名单会放行带代码执行或写文件选项的命令;弹窗仅展示符号链接名称;工作区内植入的恶意配置或虚拟环境会在会话结束后被沙箱外部的宿主工具加载执行。
- 核心观察:作者指出,攻击成功的根源在于名称检查与生效对象的脱节(Name/Object Gap)。防护机制检查的是路径字符串、命令参数或目录名,而底层内核或后续解析工具实际作用的是符号链接目标、隐式解析的裸仓库或编辑器加载的解释器,构成了智能体工具链中的检查到使用(TOCTOU)漏洞。
- 解决方案:论文提出了零信任智能体单元(Zero-Trust Agent Cells, ZTAC)架构,遵循“授权将被使用的具体对象,且仅使用已被授权对象”的原则,通过独立 Broker 解析并绑定对象,并将统一策略同时编译至衍生程序的沙箱中。
- 威胁模型:
- 攻击者目标:读取工作区外部、其他单元或未经批准的敏感文件;破坏外部文件、仓库元数据或未经批准的敏感文件;执行策略外的代码(如 Shell、仓库配置命令或宿主工具后续执行的文件);将数据外传至未授权端点;伪造其他单元身份、重放请求或滥用审批。
- 攻击者知识:知晓系统安全策略以及所有单元的公钥。
- 攻击者能力:完全控制单元内部的模型、智能体运行时及所编写运行的任何代码;可在会话启动前在工作区植入符号链接、硬链接与 .git 目录等任意文件(投毒仓库)。
- 受害系统与信任假设:受害系统为开发者本地机器;系统信任内核及其沙箱、Broker 及其配置、策略制定者与审批人类审查者,Broker 衍生的程序不受信任。
有哪些相关研究?
作者将相关研究梳理为引用监视器、系统级智能体防御、审批文件系统及实践沙箱,并定位在底层对象执行边界。
论文在相关研究中梳理了五个方向的工作,将自身定位在工具调用策略之下的具体底层对象执行边界。
- 限制与引用监视器:
- Janus(1996)通过系统调用拦截实现限制,但在内核重新读取名称时面临 TOCTOU 漏洞;Ostia(2004)改用向可信代理委托敏感系统调用,ZTAC 的 Broker 沿用了该模式。
- Capsicum(2010)探讨了通过权能消除环境权限;STING(2012)分析了路径名解析攻击的防护,包括受信任目录遍历、禁用跟随符号链接与身份校验。
- 系统级智能体防御:
- CaMeL(2025)将规划与不受信数据分离并在工具调用前检查权能;FIDES(2025)跟踪信息流标签;Progent(2025)、AgentSpec(2026)和 Conseca(2025)通过策略约束工具调用。
- IsolateGPT(2025)隔离应用;ACE(2026)分离规划与执行;SEAgent(2026)引入强制访问控制;AC4A(2026)管理资源权限;AuthGraph(2026)实现基于溯源的授权;GAAP(2026)实施信息流控制;Agent libOS(2026)控制类型化权能;PORTICO(2026)在子目标完成时撤销权能。
- 审批与文件系统:
- Approval Laundering(2026)绑定调用字段以阻止委托不匹配,作者设计了其对照变体,测试参数固定但符号链接指向或暂存状态改变时的脱节。
- YoloFS(2026)暂存变更以供审查、检查与撤销;Rashidi(2026)报告了隔离碎片化与 TOCTOU 问题。
- 实践中的智能体沙箱:
- 商业系统如 Claude Code(2025)与 Codex(2026)结合了命令沙箱与提示词;Sandlock(2026)在 Linux 上通过 Landlock 与 seccomp 限制代码,并将依赖运行时状态的决策移至监督器,但其信任智能体运行时本身。
- 公开逃逸案例表明工作区文件可在命令沙箱外执行;ZTAC 将智能体运行时本身视为已被攻破并进行内核沙箱限制。
- 基线方法与基准:
- 基线设置:B0(直接工具访问)、B1(命令与路径白名单)、B2(B1 加上类似部署系统的命令执行沙箱)、Zbroker(无单元沙箱的 ZTAC Broker)以及 14 种消融变体。
- 评估套件:作者构建的包含 74 项攻击的评估套件(涵盖 10 项公开漏洞复现)、46 项单操作良性工作负载、7 个端到端开发工作流、52 项路径访问一致性用例。
- 本文定位:作者指出,现有智能体安全工作主要关注高级工具调用策略语言,而 ZTAC 提供了策略之下的具体执行边界,通过解析、基于描述符的文件访问、统一编译的衍生程序沙箱,以及将审批绑定到底层具象对象状态。
- 限制与引用监视器:
论文如何解决这个问题?
ZTAC通过单元沙箱隔绝直接访问,由Broker在决议前解析对象、无竞态执行,并将相同策略编译至衍生程序。
ZTAC 遵循“授权将被使用的具体对象,且仅使用已被授权对象”的单一规则,通过单元内核隔离、集中式受信任 Broker、双重执行点统一编译与对象绑定审批构建防御。
整体架构与单元隔离
- 单会话独立单元:每个智能体部署一个受信任 Broker 与一个不可信单元(Cell)。单元是 launcher 在默认拒绝(deny-by-default)的 Seatbelt 内核沙箱配置文件下启动的进程树。
- 严格最小权限:单元仅被允许读取加载运行时的系统库与框架、读取自身私钥、执行自身二进制文件,并通过单个 Unix 套接字与 Broker 通信。
- 禁止直接访问:单元禁止直接读取工作区文件、禁止打开网络套接字、禁止向其他进程发信号、禁止创建其他进程。所有文件读写与网络调用均转化为向 Broker 发送的请求。
- 请求认证:每个请求携带 JSON 参数、自由文本意图、时间戳、128 位 nonce 与 Ed25519 签名。Broker 在处理前校验签名并同步追加至重放日志,意图仅用于展示给审查者,不用于授权。
决议前解析与无竞态执行
- 决议前解析(Resolve before deciding):Broker 在评估策略前将输入参数转换为具象对象。路径通过 realpath 规范化解析(macOS 下还原真实大小写),检查是否位于工作区内;若目标为硬链接数大于 1 的常规文件,因其存在未知别名,一律要求审批;同时记录 device 和 inode。
- 基于描述符的无竞态访问:为防止检查与使用之间的目录置换竞态,适配器不直接打开路径字符串,而是打开工作区根目录并使用 openat(O_NOFOLLOW) 逐级遍历相对路径,对比最终到达的 inode 与解析时的 inode,若不一致则终止。
- 安全原子写入:写文件时在目标目录下创建临时文件,并通过 renameat 原子覆盖目标路径,从而直接替换目标处的符号链接而非跟随它。
- 来源追踪(Provenance):Broker 记录各单元写入内容的 SHA-256 哈希。单元可免审批重新读取自身写入且未被篡改的敏感文件。
策略定义与双重执行点统一编译
- 路径策略:默认包含 26 条规则,按首个匹配原则执行。读取或写入潜在凭据(如 .env、.pem 等)与交接文件(如 shell 脚本、CI 配置、.vscode/、/HEAD、/pyvenv.cfg 等)要求审批;对 .git/ 的写入直接拒绝。
- 衍生程序统一沙箱:Broker 将同一套路径规则反向编译为 Seatbelt profile,应用于所有衍生的子程序(如 git、python3)。
- 沙箱更严格设计:衍生程序沙箱禁止网络、禁止连接 Broker 套接字、禁止创建新进程(杜绝后台常驻进程);限制读的规则在沙箱中同时禁止写(防止通过 link/rename 创建别名);沙箱直接拒绝需要人工审批的操作;若工作区存在多硬链接文件则拒绝启动程序。
- Git 严格加固:固定 GIT_DIR 与 GIT_WORK_TREE 至工作区,禁止全局配置;通过命令行强制锁定 14 项配置(禁用 hooks、fsmonitor、pager、外部 diff 等);要求子命令作为第一个参数以阻止 -c 等全局选项。
对象绑定审批与防篡改审计
- 对象绑定审批:当策略要求审批时,挂起记录向审查者展示解析后的具象操作(如将读取 config.txt 显示为读取 .env)。审批严格绑定到单元、工具、规范化参数与解析出的具体对象(Git 包含 HEAD、当前分支、packed refs 与 index 哈希)。
- 单次使用与过期:审批在 10 分钟后过期,首次使用后立即标记销毁;使用审批时重新计算对象解析绑定,若文件被替换、符号链接重定向或暂存区改变,则拒绝执行。
- 签名哈希链审计:每个合法请求在执行前记录授权,执行后记录结果状态。记录包含前驱哈希并由 Broker 签名,向单元返回收据以保证防篡改与完整性。
论文做了哪些实验?
评测显示ZTAC在74项攻击中阻断58项、升级14项审查,良性负载完成43/46项操作,中位数延迟增加4.0ms。
论文围绕遏制能力(RQ1)、各机制贡献(RQ2)、良性可用性(RQ3)与系统开销(RQ4)开展了实验。
实验设置
- 测试环境:运行在配置 Apple M6 芯片与 24 GiB 内存的 Mac18,5 机器上,操作系统为 macOS 27.0.1,工具版本为 git 2.54.0 与 Python 3.9.6。
- 被测系统配置:B0(直接工具访问)、B1(工具白名单)、B2(带常规命令沙箱的 B1)、Zbroker(无单元沙箱的 ZTAC Broker)与完整 ZTAC。
- 测试套件与样本量:攻击套件包含 74 项攻击(15 项文件系统、21 项程序执行、8 项交接、9 项网络、5 项协议、6 项审批、10 项直接绕过);良性负载包含 46 项单操作与 7 个端到端工作流;52 项路径一致性用例;10 次竞态测试。
- 模型与驱动方式:实验未运行 LLM 模型;攻击与良性请求由评测框架通过脚本生成,作者称以此将防护执行机制与提示词注入的不确定性解耦。
- 指标与预言机判定:采用真实环境预言机(Ground-truth oracles)检查金丝雀泄漏、外部文件修改、仓库历史提交或标记文件创建;指标分为成功(Succeeded)、升级审查(Escalated)与阻断(Blocked)。
主结果
论文在 74 项攻击套件各分类上的测试结果如下表所示(据 Table 2):
表格较宽,可左右滑动
攻击类别 用例数 n B1 成功 B2 成功 Zbroker 成功/升级 ZTAC 成功/升级 File system 15 11 7 0 / 5 0 / 5 Program execution 21 18 12 0 / 2 0 / 2 Handoff 8 8 8 0 / 5 0 / 5 Network 9 8 8 2 / 1 2 / 1 Protocol 5 5 5 0 / 0 0 / 0 Approval 6 6 6 0 / 0 0 / 0 Direct 10 10 10 10 / 0 0 / 1 - 基线防线表现:据 Table 2,无防护的 B0 在全部 74 项攻击中均失守;B1 仅阻断 8 项,失守 66 项;B2 阻断 18 项,失守 56 项,其在交接、协议、审批及直接攻击中全部失守。
- 单元沙箱必要性:Zbroker 在没有单元沙箱时失守全部 10 项直接攻击(如直接读取 SSH 密钥、篡改审批存储等),作者称引用监视器不可被绕过。
- ZTAC 遏制表现:完整 ZTAC 成功拦截 58 项攻击并升级 14 项审查,仅有 2 项网络外发攻击成功;这两项均通过已授权的端点利用 Base64 编码或分块发送外传凭证,作者称模式匹配无法拦截此类外传。
公开披露漏洞复现评测
- 评测对象:复现了 2025 至 2026 年公开披露的 10 项智能体安全漏洞机制(据 Table 3),涵盖 Claude Code、Codex CLI、Copilot CLI、Cursor 与 Antigravity 等。
- 对比结果:B1 漏掉全部 10 项;B2 阻断了 4 项需在衍生程序中对工作区外执行操作的漏洞,但漏掉了 6 项涉及工作区文件或符号链接写入的漏洞;ZTAC 阻断 7 项并升级 3 项审查(编辑器任务、智能体钩子与嵌套 HEAD 文件写入),无一成功逃逸。
机制贡献与消融实验
- 消融结果分析(据 Table 4):审批层贡献最大,移除后导致 18 项攻击成功;移除解析分类导致 5 项攻击成功(符号链接与硬链接别名);移除衍生程序沙箱规则导致 7 项攻击成功;移除严格出站策略导致 3 项攻击成功。
- 对象绑定与竞态防御:移除对象绑定使审批重定向与陈旧暂存状态攻击成功;目录交换竞态实验(据 Table 7)显示,同时移除描述符遍历与禁止 fork 时竞态在 10 次测试中全部成功(10/10),而保留任一机制时成功数均为 0/10。
良性效用与工作流表现
- 单操作与工作流(据 Table 5 与 Table 8):46 项单操作中 ZTAC 完成 43 项,需 8 次审批,失败 3 项(均因禁止进程创建或保护虚拟环境);7 个端到端工作流中完成 4 个,失败 3 个(virtual-environment、subprocess-build、tracked-edit-commit-all)。
- 失败机制:工作流失败由于禁止创建子进程、保护虚拟环境元数据,以及故意不支持带工作区扫描的 commit -a 导致。
运行开销评测
- 延迟测试(据 Table 6):无操作请求(ping)中位数延迟为 4.0 ms(p99 为 4.6 ms),其中认证与重放日志同步刷盘耗时 3590 µs;4 KiB 读为 4.0 ms,4 KiB 写为 7.1 ms;echo 增加 8.5 ms,git status 增加 9.5 ms,python3 增加 18.4 ms(达到 26.4 ms)。
- 吞吐与校验:单客户端每秒完成约 200 次 4 KiB 读取,多客户端(最多 16 个)达到约 300 次/秒;审计日志验证速度约 44,000 条记录/秒。
其他消融与分析
- 移除签名认证使伪造身份、未注册客户端与报文篡改 3 项攻击成功(Table 4)。
- 移除时间戳与 nonce 新鲜度使请求重放与重启后重放 2 项攻击成功(Table 4)。
- 移除出站全请求扫描使 URL 或请求头携带密钥的 2 项攻击成功(Table 4)。
- 移除版本控制保护使通过 git show 覆写配置的 1 项攻击成功(Table 4)。
- 移除版本控制保护与执行沙箱组合使 5 项 Git 相关攻击成功(Table 4)。
有什么可以进一步探索的点?
作者指出合法通道编码泄露、工具枚举不全及进程创建限制等局限,评测未覆盖离架智能体与沙箱自身逃逸。
论文在第 7 节讨论了架构局限与后续方向,并在实验设计中明确了评测覆盖范围。
作者指出的局限与后续方向
- 允许通道中的机密外传(出自第 7 节):ZTAC 仅控制数据流向而非编码内容。若单元同时拥有敏感读取权限与出站网络权限,可通过任意编码(如 Base64)外传数据,正则扫描无法防范;作者指出彻底解决需依赖动态信息流追踪或隔离数据与出口的策略。
- 交接规则依赖已知工具特征枚举(出自第 7 节):防范外部工具后续执行的规则仅收录了已知工具(如编辑器任务、Git HEAD、虚拟环境等),未被规则收录的工具无法防范;同时 Makefile 或测试脚本等常规构建文件无法仅凭规则拦截,必须依赖人工审查。
- 并发工作区修改与对象绑定前提(出自第 7 节):写操作通过 fstatat 与 renameat 进行,依赖单锁串行化与禁止并发子进程保证原子性;若工作区存在外部并发修改进程(如开发者的本地编辑器),该保证失效;程序与工作目录目前按路径绑定而非描述符。
- Git 审批状态覆盖范围(出自第 7 节):Git 状态绑定当前仅哈希了 HEAD、当前分支、packed refs 与 index,未包含其他松散分支引用和全部工作区状态;对 merge、reset、checkout 或 rebase 的审批尚无法保证已审查版本的一致性。
- 人类审查者的误导与疲劳(出自第 7 节):系统将高危操作交由人工审批,但无法判断代码本身是否有害;审查者可能被意图描述说服或因高频弹窗疲劳;论文未测试审查者的准确率与疲劳度。
- 沙箱粗暴限制与平台移植(出自第 7 节与第 5 节):沙箱允许全局读取文件元数据以判断外部路径存在性;粗暴禁止进程创建会导致合法构建工具失败;Linux 移植中 Landlock 无法直接表达目录内排除文件的否定规则。
实验覆盖范围
- 被测系统环境:实验在单台配置 Apple M6 芯片与 macOS 27.0.1 的机器上运行,被测单元包含两个(攻击者单元 A 与受害者单元 B)。
- 工作负载规模:评测基于 1 个小型 Python 项目,包含 74 项攻击用例、46 项单操作负载与 7 个端到端工作流。
- 模型与智能体集成:攻击与操作测试均采用脚本化请求驱动,论文未测试离架(off-the-shelf)商用智能体运行时。
- 沙箱对比实现:基线 B2 采用模拟编写的 Seatbelt profile 近似代表已部署沙箱,未直接运行商业产品自身的沙箱环境。
- 网络与并发处理:网络端点仅按主机名匹配,论文未报告域名解析重绑定的防御;Broker 请求处理采用单锁串行化。
总结一下论文的主要内容
论文指出了智能体安全机制中名称与对象的脱节,提出了ZTAC架构并在74项攻击中实现有效限制。
这篇论文针对被攻破的 AI 编码智能体,提出了基于对象绑定的零信任智能体限制架构 ZTAC。
- 问题定位:编码智能体面临提示词注入风险,现有的命令白名单、权限弹窗和命令沙箱之所以频繁失守,核心在于防御机制检验的是用户或模型输入的“名称”,而系统底层与后续宿主工具执行的是具体的“对象”,造成了跨层级的名称解析脱节与检查到使用(TOCTOU)漏洞。
- 方法架构:ZTAC 遵循“授权将被使用的具体对象,且仅使用已被授权对象”的原则。它将智能体运行在严格限制的内核沙箱单元内,所有工具操作均由受信任 Broker 中介;Broker 在决策前将请求解析为具象对象,通过 openat 描述符遍历消除路径竞态,并将同一安全策略反向编译至衍生程序的 Seatbelt 沙箱中;审批操作与已解析对象及仓库状态严格绑定且仅限单次使用。
- 安全验证:在 74 项攻击测试中,无防护的 B0 漏掉全部攻击,常规白名单 B1 漏掉 66 项,带命令沙箱的 B2 漏掉 56 项;ZTAC 阻断 58 项并升级 14 项审查,仅因允许通道外发漏掉 2 项编码泄露攻击;同时包含全部 10 项公开披露漏洞的复现(阻断 7 项、升级 3 项)。
- 效用与开销:在 46 项单操作良性负载中,ZTAC 完成 43 项并产生 8 次审查提示;在 7 个开发工作流中成功执行 4 个;无操作请求中位数延迟为 4.0 ms,运行 Python 增加 18.4 ms 中位数延迟。
- 作者结论:作者认为被攻破的编码智能体应被视为本地恶意攻击者,必须剥夺其环境权限;通过将授权与底层对象严格绑定并在所有衍生程序中强制执行统一策略,能够在付出可测性能与部分多进程工作流代价的前提下,收敛已攻破智能体的危害边界。