https://api.orcarouter.ai/v1/...;只有网关中的密钥和策略发生变化。关于
底层的攻击解剖,阅读 提示注入 和
危险的工具调用;本页是响应。
每个步骤所需的角色就地点明。读取防护栏 Matches 信息流对任何
Member 开放;防火墙 Events、Runs 和 trace 视图需要
Developer+;撤销一个密钥、应用一个自治姿态,以及编辑一条策略需要
Developer+;把一次防护栏匹配标记为误报需要 Admin。
1. AI 安全事件响应循环
三个阶段,按顺序运行。不要直接跳到加固——先遏制,这样攻击者在你调查 期间就失去访问权。遏制
撤销被攻陷的密钥,这样攻击者就不能再发出一次调用。铸造一个全新、
被严格限定范围的替代密钥。
界定
读取防火墙 Events / Runs 和防护栏 Matches 信息流,准确看到
密钥做了什么以及什么触发了。
加固
收紧自治姿态,并加入那条本会捕捉到它的规则,这样同样的攻击就不能
复发。
2. 遏制——撤销密钥
第一个动作是切断访问。一个泄露的sk-orca-... 密钥在你撤销它之前会
一直有效,因此在其他任何事之前先做这个。
在控制台中,打开 API Keys,找到被攻陷的密钥(它在显示时被掩码——
按名称、environment 或上次使用来匹配它),并删除它(Developer
角色)。删除是即时的:那个密钥上紧接着的下一个请求就在网关被拒绝。
然后铸造一个替代密钥,限定到工作负载所需的最小范围——绝不要用你账户
级别的密钥。在 API Keys → New key(Developer 角色)中:
在新密钥上封顶爆炸半径
在新密钥上封顶爆炸半径
将
credit_limit_usd 设为一个合理上限(0 = 无限),这样一次未来的
泄露就不能耗尽配额;如果调用方从一个固定服务器运行,把 allow_ips
设为你后端的出站 IP;并为任何临时的东西设置 expired_time
(-1 = 永不过期)。用 model_limits(带 model_limits_enabled)把
密钥围栏到只有它需要的模型。把你的策略附加到新密钥
把你的策略附加到新密钥
从 Guardrail 下拉框挑选你加固过的防护栏(设置
guardrail_id),
并从 Firewall policy 下拉框挑选你的防火墙策略(设置
firewall_policy_id)。两个绑定都存在于网关中的密钥上,因此新密钥
从它的第一次调用起就受到治理。明文复制一次——它在创建后处处被掩码。3. 界定——读取 Events 和 Matches 信息流
现在弄清密钥实际做了什么。网关已经记录了每一次工具调用和每一条触发的 规则——工作区限定,无需额外埋点。| 信息流 | 在哪里 | 角色 | 它回答什么 |
|---|---|---|---|
| Firewall → Events | 每次工具调用 | Developer+ | 每一次评估——判定、执行面、工具、参数,它所属的运行。 |
| Firewall → Runs | 汇总 | Developer+ | “这个智能体会话实际做了什么”——判定混合、不同的工具和模型。 |
| Guardrails → Matches | 每次规则命中 | Member | 每一条触发的防护栏规则——类型、动作、stage、细节。 |
deny 和 audit 过滤,看到
什么被拦截、什么在一个仅观察姿态下溜了过去。
对照同一个窗口交叉检查 Guardrails → Matches。如果一条
Prompt-Injection Basics 规则标记了请求——诸如*“忽略之前的指令”*或
*“揭示你的系统提示”*等短语——它连同规则类型和 stage 落在这里。
Matches 信息流仅当该防护栏的 Log raw content 开启时才记录匹配的
子串——它默认关闭(隐私保守姿态)。在它关闭时你仍能看到一条规则
触发了及其细节元字符串,只是看不到字面文本。当你需要子串来做分诊时
按防护栏打开它;该设置不可追溯。
POST /api/guardrail/match/:id/mark-fp,Admin),这样它就不再在你
调优期间扭曲你的信号。
4. 加固——堵上缺口
遏制阻止这一个攻击者;加固阻止下一个。两个动作:立即收紧工作区姿态, 然后加入那条本会捕捉到你刚看到的东西的具体规则。快速路径——提高自治级别
如果事件暴露了一个运行得太开放的智能体,在一个事务中翻动整个工作区 姿态。在 Firewall → Posture 中,应用tight
自治级别(Developer
角色)。在一个动作中,这会设置默认拒绝、拒绝破坏性 shell、拒绝 fetch
形态的 SSRF 工具名,并执行 PII Shield 和 Secrets & API-Key Blocker
防护栏。每次变更是一个事务,带从审计快照的一键撤销,因此如果它太
严格你可以直接回滚。
精确路径——加入那条本会捕捉到它的规则
专门针对提示注入,OrcaRouter 附带一个 Prompt-Injection Basics 预设 (类别 safety)——一条关键词规则,它flag 常见的注入短语以供审查 而不拦截用户。从那里开始以获得信号,然后升级。它更严格的姊妹版本, Jailbreak / Role-Play Blocker,用一个正则拦截同一类。 在 Guardrails → New guardrail(Developer 角色;Test 沙箱内联 运行候选规则——llm_judge 会做一次付费模型调用——因此它也是
Developer+)中,应用 Prompt-Injection Basics 预设,然后加一条
llm_judge 规则来捕捉一个关键词列表错过的混淆注入:
judge_fail_open: false 以在一次错过的检查不可接受时
把一个 judge 错误或超时当作一次拦截。在把它附加到一个密钥之前,先在
Test 标签页中并对照一个 Eval 语料库证明整条策略。
安全地上线新规则
不要在实时流量上盲目执行一条新规则。对于防火墙,在策略上设置shadow_mode: true——每个执行性判定都被降级为 audit,并记录为
[shadow] would …,这样你在它改变任何流量之前先在 Events 信息流上
观察它触发。对于防护栏,先把一条新规则的动作设为 flag,观察
Matches 信息流,然后把它晋级为 block 或 mask。关于完整的
observe → shadow → enforce 路径,参见
执行模式。
5. 验证修复
在你称它已解决之前,确认循环已闭合。在沙箱中重放攻击
把恶意提示粘贴进防护栏 Test 标签页的
input 阶段,并确认判定
现在是一次拦截(或 flag)。对于一个工具调用事件,在
Firewall → Test(Developer+)中 dry-run 那个冒犯的调用,并确认
判定是 deny。两个沙箱都不向上游发送任何东西,也不持久化任何东西。确认旧密钥已死
在被撤销的密钥上发送一个请求并确认它被拒绝。一个被拦截的防护栏返回
HTTP 400
guardrail_blocked;一个被拒绝的工具调用返回
HTTP 400 firewall_blocked——而一次拦截消耗无配额(输入阶段
拦截在计量之前触发;输出拦截退还预先消耗的配额)并被标记为 skip-retry。6. Runbook 一览
| 阶段 | 动作 | 在哪里 | 角色 |
|---|---|---|---|
| 遏制 | 删除泄露的密钥 | API Keys | Developer+ |
| 遏制 | 铸造一个限定范围的替代密钥 | API Keys → New key | Developer+ |
| 界定 | 读取工具调用 + 判定 | Firewall → Events / Runs | Developer+ |
| 界定 | 读取触发的规则 | Guardrails → Matches | Member |
| 加固 | 提高姿态 | Firewall → Posture(tight) | Developer+ |
| 加固 | 加入捕捉规则 | Guardrails / Firewall | Developer+ |
| 验证 | 在沙箱中重放 | Test 标签页 | Developer+ |
7. 接下来去哪里
上线清单
生产前的加固过程——在你上线之前限定密钥范围并锁定姿态。
提示注入
本 runbook 端到端响应的那个攻击。
执行模式
Observe → shadow → enforce —— 上线一条新规则而不弄坏流量。
阻止外泄
如果事件触及了网络,就锁定出站目的地。
