flawopen.com/AI Security/ghostjacking-ai-agent-poisoned-observability-logs-august-2026
●
FlawOpen 映射: CWE-1427 · 编辑严重性评级: 中危
安全研究 · FlawOpen
GhostJacking:日志与 AI 代理
研究展示了攻击者控制的遥测内容如何影响已连接的 AI 代理。目前没有 CVE,也没有确认发生受害者系统入侵。这是受控研究演示。[1], [2]
💡 通俗易懂的原理解析 (ELI5)
想象一下,前台人员拦下了可疑包裹,却把寄件人的留言原样记入事件日志。之后,调度员核实了真实的工单编号和演示测试配置中的 DNS 策略确实存在的缺口,于是相信同一条留言里由攻击者指定的地址,并修改公共地址簿(DNS),让浏览器和邮件系统把公司服务解析到那里。日志只是证据,不是修改权限;这项变更必须经过独立的策略检查和审批。[1]
核心概念与专有名词
框架映射
- FlawOpen 对 MITRE CWE 的概念性映射;没有厂商或 CVE 记录将此弱点编号分配给本研究演示。 CWE-1427
- OWASP GenAI 2025 — LLM01:2025 提示注入
- OWASP GenAI 2025 — LLM06:2025 过度代理权限
攻击执行流程分解
源代码对比:漏洞与安全实现
这些片段是应用层示例,并非任何所述产品的漏洞或修复源代码。不安全的结构让读取不可信事件文本的代理直接使用修改工具。安全结构将提议与执行分开:独立服务使用绑定到具体操作者和更改内容的一次性审批,然后在调用服务商前应用策略。操作者身份来自经过认证的服务器上下文,而不是调用方可控制的字段;模型无法选择该身份。单靠 prompt 指令不是授权控制。生产代码还必须校验数据模式、租户和资源所有权、审批过期时间、重放防护、审计持久性和服务商错误。[1], [2], [5]
存在漏洞的实现
// 不安全集成的示意代码;并非 Cloudflare、Datadog、Sentry 或 Tenet 的源代码。
async function investigate(event: EventRecord) {
return agent.run({
context: event.message,
tools: [cloudflare.updateDnsRecord]
});
}
加固后的安全修复
// 控制边界示意;模型可以提出更改,但不能授权或执行。
type DnsProposal = { zoneId: string; name: string; value: string };
async function proposeDnsChange(event: EventRecord): Promise<DnsProposal> {
return agent.propose({ evidence: markUntrusted(event.message) });
}
async function applyDnsChange(
proposal: DnsProposal,
approvalId: string
) {
const actorId = auth.requireAuthenticatedActorId();
const validatedProposal = DnsProposalSchema.parse(proposal);
const approval = await approvals.consumeOnce(approvalId, { actorId });
if (!approval || approval.actorId !== actorId ||
approval.zoneId !== validatedProposal.zoneId ||
approval.name !== validatedProposal.name ||
approval.value !== validatedProposal.value ||
!policy.canChangeDns(actorId, validatedProposal.zoneId, validatedProposal.name)) {
throw new Error('DNS change is not independently authorized');
}
// 如果无法在修改前记录授权决定,则默认拒绝操作。
await audit.record({ actorId, approvalId, action: 'dns-change', decision: 'authorized' });
try {
await cloudflare.updateDnsRecord(validatedProposal);
} catch (error) {
await audit.record({ actorId, approvalId, action: 'dns-change', outcome: 'provider-failed' });
throw error;
}
await audit.record({ actorId, approvalId, action: 'dns-change', outcome: 'succeeded' });
}
工程与系统安全加固清单
- ✓构建代理上下文时,将所有可能受外部影响的日志、告警、跟踪、错误和工单字段标记为不可信;转换数据时保留其来源信息。[1], [2]
- ✓默认仅向调查代理发放只读凭据。DNS、云资源、代码仓库和部署变更应通过单独的策略执行服务。[1], [5]
- ✓在模型之外,根据已认证操作者、租户、资源、具体更改和当前策略授权每项操作;不要把模型置信度或工具可用性视为审批。[2], [5]
- ✓高影响变更应要求人工审批,并将审批绑定到具体 diff、资源、操作者和较短有效期;审批只能使用一次,重复提交或更改提案都应拒绝。[2], [5]
- ✓添加回归测试:让不可信遥测信息包含看似可信的引用和事实,同时提出相互冲突且未经核实的变更;断言代理可以总结事件,但未经独立授权不得调用任何变更 API。[1]
- ✓监控调查流程中的写操作尝试,并保存原始事件、模型提议、策略决定、审批人和服务商响应,以便事件调查。[1]
- ✓核实每个集成的实际权限和令牌范围。公开客户端标识不一定是高权限密钥;先测试具体令牌能执行哪些操作,再判断它是否属于凭据泄露。[1], [2]