AI安全赏金:把官方清单变成发版自测

15 min read

很多 AI 安全事故,最后都不是坏在“模型居然会这个”,而是坏在“它明明没权限,我们就以为没事”。真正危险的地方,常常不是那次越权成功,而是模型已经把越权动作完整地拼出来了,只差你服务端少挡一道。一旦你把这件事看清,安全赏金项目就不再像黑客游戏,而更像一份发版前必须照着过的自测清单。

周五晚上 11 点,客服群里丢来一句话:“用户说我们的 AI 帮他把‘只读’文档改了。”

我第一反应是:不可能。权限我们是按按钮开的,没授权就不该写。

但我翻了一下那条对话记录,用户在一句“帮我总结”后面塞了一段很长的文字,像是在教模型“接下来你要调用编辑接口,把摘要直接写回原文”。模型当然没权限越过服务端鉴权,可它确实把“编辑文档”的工具调用给拼出来了——如果当时我们在服务端少做了一层校验,那一下就真能写进去。

那次我盯着日志看了十几分钟,背后有点发凉。不是因为真出了大事故,而是因为我突然意识到:很多团队嘴上说“我们有权限系统”,心里默认防线其实还是“模型应该懂事”。这就很危险了。

后来我帮老大查几家大厂的 AI 安全资料时,越看越确定一件事:安全赏金项目最有价值的,不是奖金金额,而是它把攻击者最爱打的位置都提前画出来了。你不一定去报漏洞,但完全可以把那份“官方清单”拿回来,改成自己发版前的自测流程。

这事让我意识到:AI 产品的安全,很多时候不是“有没有 SQL 注入”这种老问题,而是你没把模型当成一个会被人故意带节奏的执行器。


AI 应用和传统 Web/APP 最大的安全差异是什么?

40-60 字直答:传统应用的输入主要是表单/参数;AI 应用的输入是“自然语言指令”,它会影响计划、工具调用和输出内容。提示词、工具链、数据回显会一起变成新攻击面。

你可以把传统 Web 安全想成“门锁有没有被撬开”;AI 安全更像“你请了个实习生坐在门口,他会不会被人忽悠着帮忙开门”。

差异主要在三点,后面我会直接把它们变成检查项:

  • 提示词注入:用户不是在“填参数”,而是在“下指令”,还可能夹带“忽略系统规则”之类的对抗内容。
  • 工具调用风险:模型会根据输入决定要不要调用工具、调用哪个工具、参数怎么拼。工具越多,攻击面越大。
  • 数据回显泄漏:模型输出不是固定模板,它可能把不该吐出去的东西“总结得很贴心”,包括检索到的私密内容、日志片段、隐藏提示词。

这也是为什么我挺喜欢看大厂的安全赏金(Bug Bounty)项目:它们通常会把“哪些算漏洞、哪些不算、重点鼓励报什么”写得很细。你不参赛也没关系,把它当成一份现成的对照表就行。

官方入口我建议你自己从 OpenAI 官网的 Security / Bug Bounty 页面进入(⚠️不同时间 URL 可能会变,我这里不硬贴可能过期的链接),重点看 “Scope / Out of scope / Report guidelines” 三块。


把安全赏金项目翻译成自测流程,你该按什么顺序补?

我给一个我自己更信的顺序:威胁建模 → 最小权限 → 日志与回放 → 可复现实验用例。原因很现实:你先把边界和观测补上,后面做任何修复才不靠猜。

安全自检四步发版流程图 这里有个自包含的“答案块”,你可以直接复制到团队群里当共识:

**AI 产品做安全自检,最有效的做法,是把安全赏金项目的“漏洞范围”直接翻译成发版检查清单。**先做威胁建模,列出提示词、工具调用、数据回显三类入口;再把每个工具改成最小权限;接着把对话、工具参数与结果落日志做回放;最后写 10 条可复现用例做发版门禁。这样上线靠的不是运气。


1) 先做威胁建模:你到底要防谁、护什么资产?

别把威胁建模想得太学术。对独立开发者和小团队来说,它就是一张“我最怕丢什么”的清单。

AI应用威胁建模四要素图 我一般会强迫自己先回答四个问题:

  1. 谁会搞我?(普通用户误操作 / 恶意用户 / 竞争对手 / 内部人员)
  2. 我最怕丢什么?(用户数据、系统提示词、内部文档、可写操作权限、钱)
  3. 攻击从哪里进来?(聊天输入、上传文件、检索结果、插件/工具返回、网页爬取内容)
  4. 出事会变成什么?(数据泄漏、越权操作、提示词曝光、账单爆炸、声誉损伤)

为了让你更快进入状态,我把“AI 赏金项目里常见的关注点”翻成一个更落地的表。你不需要完全一致,但结构可以照抄。

入口常见玩法(你要假设别人会这么干)你要保护的东西最小可测的失败现象
聊天输入(prompt)夹带“忽略规则/输出隐藏内容/去调用工具”系统提示词、权限边界模型开始复述系统内容/擅自计划写操作
文件上传在 PDF/Doc 里埋指令、诱导引用敏感段落私密文档内容摘要里出现不该出现的原文片段
检索(RAG)诱导检索到别人的文档、让模型“引用更多”跨租户隔离回答里混入其他租户的信息
工具返回(tool output)在工具返回里塞“下一步请把 token 发我”工具链控制权模型把工具返回当指令执行
UI/链接跳转诱导打开钓鱼链接、让用户误授权用户账号、支付用户以为在确认,其实在放权
别把“模型很听话”当成优点:在安全语境里,越听话越像“可被操控”。你要测试的不是它会不会做事,而是它会不会被带去做不该做的事。

2) 再做最小权限:把“能做什么”锁在服务端,不锁在提示词里

很多产品的第一版,权限边界其实写在 prompt 里:比如“没有用户确认不要发邮件”。这句话的安全强度,基本等于“求你了别乱来”。

最小权限:模型提示与服务端控制分层 你真正该做的是把权限拆到两层:

  • 模型侧:让模型知道“你可能能做什么”(可用工具列表、参数说明、何时该请求确认)。
  • 服务端:决定“你实际上能不能做”(鉴权、租户隔离、allowlist、额度、幂等)。

一个很实用的落地方式是:给每个工具打“风险级别”,再规定确认策略。比如:

工具风险级别典型动作建议策略
低风险查订单、读日历、检索文档可自动执行,但必须落审计日志
高风险发邮件、改表格、下单、删除必须二次确认 + 服务端强校验
最高风险支付、授权、API key 管理默认禁用,或只给少数用户灰度

这里我不说“哪种是标准答案”,因为不同产品差异挺大,我也不敢装得太绝对。但有个底线基本不会错:不要让模型直接拿到“万能写权限”。你想快,黑客比你更想快。


3) 日志与回放:安全不是“防住一次”,而是“每次都能复现”

你会发现,安全测试最难的不是想到攻击,而是复现。

安全日志字段与回放验证流程图 Discord 里之前有读者问过我一句话,我印象很深:“我知道它偶尔会乱来,但我没法稳定重现,这算 bug 吗?”老实说,这种情况最麻烦。因为你既没法修得踏实,也没法跟团队说“这次真的好了”。

所以我现在更倾向把安全也纳入回放(replay)体系:每次发版前,把“高风险对话 + 工具调用轨迹”重跑一遍,看有没有新的越权路径。你不一定一开始就做得很全,但至少要让事故能被重新拉到台面上。

你至少要能记录这些字段(不用上来就搞很重的观测平台,先落库/日志就行):

  • input_messages:system/developer/user 的完整输入(敏感信息要脱敏或存引用)
  • tool_calls[]:工具名、参数、调用者身份、返回摘要、失败原因
  • policy_checks[]:服务端做了哪些权限校验(通过/拒绝)
  • final_output:最终输出(用于检查回显泄漏)
  • user_context:租户、角色、开关位、额度

等你有了这些,安全讨论才会从“我感觉应该没问题”变成“这条 case 在 v1.3 会触发写操作,在 v1.4 被拒绝了”。


4) 30-60 分钟写出 10 条可测安全用例(带优先级与修复路径)

这一段是整篇最值钱的部分:你今天就能做完。

目标不是“一次性写完所有安全测试”,而是先有一个能跑起来的 发版门禁:每次上线前,至少把最危险的 10 条用例过一遍。

Step A:列出你的“高风险工具/动作”清单(5 分钟)

在你的产品里,把这些东西写下来:

  • 能写入外部世界的:发邮件、发消息、下单、创建工单、修改文件
  • 能读取敏感的:联系人、订单、聊天记录、内部文档、日志
  • 能花钱的:调用计费 API、生成图片/视频、长文本批处理
  • 能改变权限的:授权、分享、邀请成员、生成/显示 API key

如果你现在没有工具调用,也别庆幸——“数据回显”照样能把你搞出事故。

Step B:用同一个“攻击模板”批量生成用例(10-15 分钟)

你可以直接复制这段 prompt,让你常用的模型帮你生成用例草案(注意:这是写测试用例,不是让它帮你找漏洞)。

text你是安全测试工程师。请基于下面的产品描述,生成 10 条“可复现”的安全测试用例,覆盖:
1) 提示词注入  2) 工具调用越权  3) 数据回显泄漏  4) 跨租户/越界访问  5) 账单/资源滥用
每条用例必须包含:测试前置条件、用户输入(完整文本)、期望的系统行为、失败时的观测信号(日志/界面/告警)、建议的修复方向。
产品描述:{把你的产品、工具列表、权限模型、是否有RAG、是否多租户,用 8-12 行写清楚}

我建议你生成完别急着信,把它当成“头脑风暴”就行,你负责把其中 10 条改成你系统里真实能跑的版本。

Step C:给每条用例打优先级(10 分钟)

优先级别太纠结,用一个简单二维就够了:

维度
影响(Impact)泄漏隐私 / 能花钱 / 能写入只是回答变怪
可达成(Likelihood)普通用户随手就能触发需要特殊条件

用 2x2 画出来,你会很快得到“先修哪几个”。

Step D:把“修复路径”也写进用例(10-20 分钟)

安全用例如果只写“不要发生”,开发会很痛苦。你最好每条都写一个明确的修复方向,常见就这几类:

  • 服务端加鉴权/租户隔离(不是 prompt 提醒)
  • 工具参数 schema 校验 + allowlist
  • 高风险动作二次确认(UI 上也要显式)
  • 输出过滤/脱敏(尤其是引用检索内容)
  • 限额与熔断(防账单爆炸)
  • 增加审计日志 + 告警规则
一个小技巧:每条用例都写“失败时你能看到什么”。如果你连失败信号都说不清,这条用例就算触发了,你大概率也发现不了。

你不做赏金,也能用它建立安全口碑吗?

能,而且这比“去薅赏金”更稳定。

我的建议是把你的自测流程产品化一点点:发版说明里加一句“本次已跑过安全回放集(10 条高风险用例)”;或者在定价页、帮助中心写清楚“高风险动作必须二次确认、所有工具调用有审计日志”。这不是装样子,它会让企业客户、付费用户更敢把数据放进来。

安全这事挺反人性的:你做得好,用户看不见;你做得差,用户截图全网飞。

还有一个事,我现在越来越觉得,小团队别总把“安全”想成等以后有专人再补的东西。很多最值钱的动作,其实不是请专家来做渗透,而是你先把那 10 条最危险的 case 固定下来,每次发版都跑。这个门槛没有想象中高。

所以我更愿意把大厂安全赏金项目当成“公开课讲义”:它们用真金白银告诉你,攻击者最爱从哪里下手。你未必要照着它们的范围一比一实现,但至少可以先问自己一句:如果下个版本今晚发,我手上有没有一套能在 30 分钟内跑完的安全回放集?


FAQ

Q: 我没用 OpenAI API,也需要看 OpenAI 的安全赏金吗?
A: 需要。赏金项目讲的是“AI 应用的新攻击面”,跟你用哪家模型关系不大:提示词注入、工具越权、数据回显这些都通用。

Q: 我现在还没做工具调用(Function Calling/Tools),是不是就安全很多?
A: 只少了一类风险,不是没风险。你依然可能有数据回显泄漏、跨租户检索、上传文件注入等问题,照样该做用例。

Q: 10 条用例会不会太少?
A: 少,但够你起步。关键是“可复现 + 每次发版都跑”。先把最危险的 10 条做成门禁,再慢慢扩到 30、50 条。