签名工具也会泄密:Germline执行让每次调用只看见该看的数据,153次攻击运行零检出
核心概要
签名只能证明工具由谁发布,不能保证它运行时不泄露数据:一个签名有效、功能正常的MCP工具可以把早前调用中的敏感条目夹带进发往策略允许目的地的请求,Meta的MCPGuard-Dynamic在全部七种配置下都未能拦住。Germline执行改为不检查工具代码,而是让每次调用在从无数据母本进程分叉出的临时副本中运行,每个副本只拿到其目的地有权看到的数据。在153次攻击运行中未检出未授权泄露,而基线防御与消融为5.9%–74.5%;单副本调用耗时10–49毫秒。
深度剖析
签名与运行时限制之间存在一个可被利用的空隙:一个通过签名校验、也完成其宣称功能的MCP工具,仍可在发往策略允许目的地的请求中夹带它不该看到的数据。 此前的防御把权限绑定在别的对象上:签名绑定发布者,MCPGuard-Dynamic这类限制把权限绑定到进程和它可连接的目的地主机,FIDES、CaMeL这类智能体信息流控制把标签绑定到工具回复。 在MCPGuard-Dynamic自己的运行器中,一个签名的OCR工具pool把HR与董事会调用中的条目留存下来,加进下一次发往已授权OCR目的地的请求,在全部七种配置下每次试验都发生泄露;同一运行中,发往未列名主机的原始套接字传输在启用eBPF的配置下每次都被拦住。
Germline执行不去判断工具代码是否可信,而是控制代码能看到哪些数据:每次调用都在从无数据母本进程分叉出的可丢弃副本中运行,每个副本只接收其目的地有权看到的数据,调用结束后副本被销毁。 机制由Plan步骤按视图把消费者与声明目的地分组,母本为每组分叉一个沙箱副本,跨调用的状态只经由副本之外按视野键控的槽位传递。 在脚本化矩阵的153次攻击运行中未检出金丝雀泄露,基线防御与消融为5.9%–74.5%;在91个生成的变体中同样未检出,而这一类出口允许列表拦住了71个发往攻击者主机的变体、对20个发往策略允许主机的变体一个也没拦住。
启示与展望
演示范围是一台机器上单个用户的主目录测试世界,包含带标签的PDF、两个SQLite数据库、代码仓库、邮件草稿与凭据文件,每个受保护条目在每次试验中带一个随机金丝雀;原型在未改内核的标准Linux上运行未修改的Python MCP服务器,780次调用返回与未保护服务器相同的输出,唯一例外是get_current_time返回的时钟值。作者把并发、吞吐、大量常驻发布版本与云托管服务列为后续工作。
所有零泄露结论都限定在作者自建的语料与金丝雀检测器范围内,生成变体语料由作者自己生成,不能说明这类代码有多常见。远程工具无法分叉,只能靠最坏情况回复标签获得预防,并因此损失部分功能;读取CPU周期计数器的发布版本仍不会泄露,但其分歧无法被验证;隐蔽计时与微架构信道不在假设之内;抑制策略不提供保证,攻击者可通过更新重置惩罚。
