# 漏洞总结:GoClaw 心跳执行流中的未认证日志订阅与命令注入 ## 漏洞概述 **标题**:Critical: Unauthenticated log subscription and command injection in heartbeat execution flow #866 **严重等级**:Critical (CVSS 3.1 Score: 10.0) **类型**:未认证远程命令执行 (RCE) **核心逻辑**: GoClaw 的 Gateway 在身份验证逻辑中存在缺陷。当客户端连接时,如果提供的 Bearer Token 无效、过期或缺失,服务器不会拒绝连接,而是静默降级为“未认证上下文”。同时,RBAC 权限引擎对未分类的 RPC 方法采用默认允许策略。这导致攻击者无需凭证即可访问特定接口,进而通过心跳执行流注入恶意命令。 ## 影响范围 **受影响组件**: * Gateway/Connect (Authentication Interceptor / Middleware) * Authorization/RBAC (Permission Policy Engine) * ApiChannels/Instances (Instance Listing RPC) * ApiLogs (Log Streaming RPC) * Heartbeat/Runner (Heartbeat Execution Engine) **攻击路径**: 1. 建立“降级”视图会话(无需有效凭证)。 2. 列出所有注册代理并获取其 UUID。 3. 向 `heartbeat.checklist.set` 端点注入恶意内容以确认存活。 4. 触发 Heartbeat Runner,将攻击者控制的 `prompt/checklist` 内容注入代理的执行上下文(特别是 `HEARTBEAT.md`)。 5. 利用代理的 `exec tool` 能力(如果启用)在底层主机上实现任意命令执行。 ## 修复方案 1. **拒绝未认证连接 (Critical)**:修改 Connect Interceptor 以严格关闭连接或返回未认证状态,不要回退到默认视图上下文。 2. **强制默认拒绝 (Critical)**:更改 RBAC 策略为默认拒绝。RPC 方法必须显式标注允许访问,除非明确意图公开访问。 3. **心跳范围授权**:心跳写操作 (`heartbeat.set`) 必须仅限 `agentwrite` 或 `admin` 范围,视图角色不可访问。 4. **输入净化**:Heartbeat Runner 应将来自心跳服务的内容视为不可信数据,沙盒化执行或严格验证提示词。 5. **屏蔽敏感标识符**:`channels.instances.list` 端点应返回非敏感的 Alias 或 Fingerprint,而非内部 UUID。 ## POC 代码/利用代码 ```json { "heartbeat_prompt/checklist written by viewer": "heartbeat.list.triggered", "execution_prompt": { "index": "test-completed", "format": { "type": "event", "agent": "test-agent", "payload": { "type": "test-completed", "result": "test-agent", "payload": { "content": "echo 'test-agent' > /tmp/test-agent && echo 'test-agent' >> /tmp/test-agent", "echo_creation_tokens": 0, "echo_read_tokens": 0, "completion_tokens": 0, "group_tokens": 0, "total_tokens": 1615 }, "channel": "heartbeat", "sensitivity": "public" } } }, "cleanup_applied": "prompt/checklist cleared, webhook=false" } ```