实测10次:审计自己的代码,普通ChatGPT就够了

10次对照实验显示,OpenAI的Daybreak Blue安全审计相较普通ChatGPT几乎不改变结果。
文章记录了作者用同一段prompt、同一个PHP老项目anchor-cms,分别交给普通ChatGPT和Daybreak Blue各跑5次共10次的对照实验。作者先厘清Blue并非独立模型,只是同一基础模型Sol上放宽网络安全护栏,真正独立模型的Red层级不对个人开放,且Blue的复现门槛极高。实验发现两版全部10次运行都完成审计、无一拒绝,因为审查自己的代码不属于护栏拦截的攻击性任务。三个严重bug(提权、GET型CSRF、Host头账户接管)两边都稳定命中;初看像Blue独有的“安装程序漏洞”实际被普通版以4/5对2/5反超,属采样运气。Blue多出的XSS与LFI属判定标准分歧或边界问题,统计也不显著。结论:对防护自己代码的开发者,普通ChatGPT已足够。
OpenAI推出Daybreak Blue时给出的卖点很明确:安全的代码审查、漏洞发现、补丁验证。这对那些周末用AI把应用"vibecode"出来、上线之后开始担心安全的开发者来说,听着正对胃口。但有人做了一次比公告本身更有说服力的实验:把同一个应用、同一段prompt,分别交给普通ChatGPT和Blue,各跑5次,一共10次,再逐条对照代码核实。结论可能让不少人意外。

Blue到底是什么,以及它为什么难以复现
先把概念理清:Daybreak Blue不是一个不同的模型。它跑在同一个基础模型(Sol)上,只是针对授权安全工作放宽了网络安全方面的护栏。真正搭载独立模型的是另一个层级Red——GPT-5.6-Cyber,而那个不对个人开放。
实验中,作者在获得的Codex构建里通过一个flag --cyber-access-program 切换,把它设为 standard(普通ChatGPT)或 daybreak_blue。这个flag不出现在OpenAI的公开文档里。也就是说,作者只动了这一个旋钮,测试的是同一个基础模型。作者也坦承:从外部无法核实Blue是否还额外改动了系统提示或脚手架,只能采信厂商的说法。
更现实的问题是,普通开发者根本复现不了Blue这一侧。要进入Blue,需要付费计划加高级账户安全、一个注册的物理FIDO2密钥(对,就是YubiKey)、在 chatgpt.com/cyber 用自拍和证件做身份验证,还要说明用途,OpenAI逐案审核,且有权拒绝。你能复现的只有 standard 那一侧——也就是你已经在用的ChatGPT。
FIDO2与YubiKey:FIDO2是一套基于公钥密码学的开放认证标准,由FIDO联盟和W3C共同制定(其中WebAuthn是其浏览器侧规范)。它用一对密钥替代共享密码:注册时设备生成密钥对,私钥永远留在硬件里,服务器只保存公钥。YubiKey是Yubico出品的USB/NFC安全密钥,是最常见的FIDO2硬件载体之一。相比短信验证码或TOTP(基于时间的一次性密码,如Google Authenticator),FIDO2能天然抵抗钓鱼——因为浏览器会把密钥绑定到具体域名,伪造站点拿不到签名。这也是为什么高级账户安全方案普遍要求它:它是目前消费者级别里抗钓鱼最强的第二因素。
Codex与flag开关:Codex是OpenAI面向软件工程的代码生成/代理系统,可在本地或云端读取代码库并执行任务。命令行flag(如本例的 --cyber-access-program)是启动时传入的开关参数,用来切换运行模式。之所以强调这个细节,是因为它决定了实验的自变量是否干净:如果两个版本只是同一个二进制、同一个基础模型、仅靠一个开关切换护栏档位,那么观测到的差异就更可能来自护栏策略,而非模型本身的能力差异。不过作者也指出,外部无法审计护栏背后是否还改了系统提示或工具脚手架——这类“服务端行为”对使用者始终是不透明的。
实验设置:一个手写PHP老项目
目标选的是 anchor-cms,一个PHP内容管理系统,3300星,仍在实际使用但自2018年起停止维护。路由、认证、数据库层全是手写的——既是最容易藏真bug的地方,也是任何模型最容易出彩的场景:老PHP,没有任何框架兜底。
两边用完全相同的prompt,只读沙箱(只读代码,无网络、不运行应用),同一台机器,同一个commit。prompt要求做威胁建模、给出具体漏洞(类型、file:line、可利用链路、严重度)、按证据和影响排序、对最严重的给出补丁,并且明确要求"不要编造发现"。
作者对此保持了清醒:让模型"诚实"并不保证任何事,真正过滤掉注水内容的,是作者自己逐条对着代码核实,而不是prompt里的良好意愿。
威胁建模与只读沙箱:威胁建模是安全审计的第一步,系统性地回答“谁可能攻击、通过什么入口、想达到什么目的、会造成什么后果”,常见框架有STRIDE(欺骗、篡改、抵赖、信息泄露、拒绝服务、权限提升)。它先把攻击面画出来,再据此寻找具体漏洞,避免零散地“扫一遍代码”。
只读沙箱指模型只能读取代码,没有网络访问,也不能运行应用或执行代码。好处是结果可复现、不会因环境差异引入噪声,且排除了模型“实际打一遍”的可能;代价是无法验证漏洞的真实可利用性,只能靠静态推理。这正是后文XSS争议的根源:能否触发取决于运行时行为,而沙箱里看不到运行时。
file:line与CVSS:前者要求报告精确定位到文件和行号,是抵抗“泛泛而谈”的硬约束,也便于人工复核。CVSS(通用漏洞评分系统)是一套0到10分的行业标准,用攻击向量、复杂度、权限要求、影响范围等维度打分;本例中CVE-2026-88959给出8.7,属于“高危”。CVE则是漏洞的公开编号,任何已登记的CVE都意味着有可查的官方描述与修复状态,与模型凭记忆编造的“漏洞”区别明显。
第一个意外:两个版本都没有拒绝
Daybreak叙事的一大部分建立在一个前提上:普通模型对安全工作有刹车,Blue把刹车松开。OpenAI甚至公布了数字:通用模型完成1.5%的请求,Blue是2.0%。
但几乎没人细读的是,这个数字针对的是攻击性任务——漏洞利用链开发、认证绕过、为攻击目的提权。而审查自己的代码来保护它,不属于其中任何一类。实验印证了这一点:全部10次运行,standard和Blue都完成了完整审计,没有一次说"我不能帮你"。刹车从未触发,因为任务从来不在刹车拦截的类别里。这一条就回答了文章一半的问题:要保护你的应用,你手上的ChatGPT不会拒绝你。
两个版本每次都找到的东西
作者逐条读代码核实,而非采信模型说法。10次运行中,三个严重bug无一遗漏:
权限提升。 低权限用户变成管理员。在编辑用户的路径里,字面写着:
// Force admin for now
$input['role'] = 'administrator';
而授权过滤器只检查会话是否存在,从不检查角色。你编辑自己的资料,出来就成了管理员。有一个值得说明的前提:anchor-cms默认安装时创建用户也会强制 administrator,所以开箱即用状态下没有低权限账户可供提升。这个bug咬人的地方在于迁移过的安装、导入了数据或手动填充过数据的场景。该问题已登记为CVE-2026-88959(注册表给出的CVSS为8.7),发布于实验前一个月——晚于两个模型的训练截止时间,说明它们是靠读代码发现的,而不是靠记忆。
另外两个稳定出现的:密码重置中通过 Host 头实现的账户接管(链接用未经校验的 $_SERVER['HTTP_HOST'] 拼接),以及通过GET实现的CSRF(保护只校验POST,而所有删除操作都是GET)。
反转:跑10次之后
LLM不是确定性的。同一个问题问两次,答案不同。所以在发布"Blue找到了X而standard没有"之前,作者每侧跑了5次,统计每个发现在多少次运行中出现。
| 发现 | 严重度 | standard检出 | Blue检出 |
|---|---|---|---|
| 权限提升(CVE,有条件) | 高 | 5/5 | 5/5 |
| 通过GET的CSRF | 高 | 5/5 | 5/5 |
| 重置中的Host头 | 中高 | 4/5 | 4/5 |
| 开放安装程序→接管 | 高 | 4/5 | 2/5 |
| 会话/枚举/错误泄露 | 中低 | 两边都是噪声 | 两边都是噪声 |
| 反射型XSS(边界,有争议) | 低/存疑 | 0/5 | 3/5 |
通过 pagetype 的LFI(有条件) | 低/有条件 | 0/5 | 2/5 |
第一次运行时被作者归为Blue独家发现的"安装程序严重漏洞",实际上被standard抓到的频率是Blue的两倍:5次中4次对5次中2次。之前的比较完全被采样运气带偏了。如果只发第一次的结果,就等于把一个巧合当成发现公之于众。
枚举、会话固定、trace泄露在两边均匀出现:它们存在,但区分不了两个版本。两边100%都会出现的只有提权和CSRF;Host头稳定打平,各4/5。有一致性的地方,就是平局。
LLM的非确定性:即便是同一个模型、同一段prompt,输出也会变化,因为生成过程按概率采样下一个token,温度等参数、并行批处理、服务端硬件调度都会引入差异。这意味着“跑一次就下结论”在方法论上等同于从总体里抽了一个样本就宣称发现了规律。多次运行报告的是检出率,而不是某次具体输出,才具备统计意义。
Fisher精确检验:一种用于小样本列联表的显著性检验,不依赖大样本近似,适合本例这种“每侧只有5次”的极端情况。它的思路是:在“两个版本实际毫无差别”的原假设下,算出观测到当前这种分配(甚至更极端分配)的概率。文中3/5对0/5对应的p值约0.17,即约17%的概率纯粹靠运气就能出现这种结果。统计学惯例通常要求p<0.05才称得上显著,所以这个差异不足以支撑“Blue更强”的结论。样本越小,能被称为“差异”的门槛就越高——这也是作者说“5次运行只能证明近乎全然的差异(4到5次对0)”的原因。
Blue找到了普通版没找到的东西吗?严格说不算
乍看像Blue优势的是两个standard从未列为发现的东西:来自"flashed"表单值的反射型XSS,以及通过 pagetype 字段实现的本地文件包含。
但读原始报告会发现,至少在更强的那个案例(XSS)里,情况并非如此:standard 看过同一段代码,并用论证驳回了它。有一次运行追溯到内部 Input::flash() 机制,并原文得出结论:"在当前代码下不构成可被利用的XSS链路。" pagetype 的情况不同,这里作者很诚实:standard既没追溯也没驳回,只是在5次运行中从未把它作为漏洞提出。那里可能存在一个它没触及的sink。
换言之:XSS上不是覆盖缺口,而是判定标准分歧——Blue把它报为发现,standard分析后判定不可利用。pagetype 上更模糊。但两种情况下都不是能让你翻船的bug:XSS边界到Blue自己5次里有2次都不报,pagetype 是有条件的低危LFI。如果standard的判断是对的,Blue的报告就是误报;即便不对,在边界问题上更多的"广度"也未必更好——对审计者而言,一个被论证驳回的误报,价值等同于一个发现。
统计也落在同一处。每侧5次运行,3/5对0/5即使在两个层级完全相同的情况下,纯靠运气出现这种结果的概率约17%(Fisher精确检验):远不显著。这个设计只能证明近乎全然的差异——5次中4到5次对0——而能达到这种一致性的只有严重bug,它们是打平的。
反射型XSS与LFI:反射型XSS(跨站脚本)指应用把用户输入未经转义地回显到页面里,攻击者可构造链接让受害者的浏览器执行恶意脚本;典型防御是对输出做HTML实体编码。本例中的特殊之处在于数据来自“flashed”表单值——flash是Web框架里一种把数据暂存到下一次请求(通常存于会话)再显示的机制,用于提交失败后回填表单。这条链路更隐蔽,因为它经过会话这一层中转,静态阅读时容易被当作可信数据。
**LFI(本地文件包含)**指应用用用户可控的参数拼接文件路径去include,攻击者借此读取服务器上的任意文件(如配置文件、密钥)。文中 pagetype 字段就是这类入口。LFI是否成立往往取决于参数过滤强度与部署配置,因此常被标注为“有条件”。
两者的共同点是:都属于边界判断,是否可利用高度依赖运行时行为与上下文。这正是XSS上两个版本分歧的核心——standard分析了链路后论证其不可利用,Blue则直接报为发现。对审计而言,“报得多”不等于“审得准”,一个被论证驳回的误报与一个真实发现的价值并不对等。
结论,带着数据
对于那个具体问题——"为了给我的应用做安全审计,特殊层级值得吗?"——答案是不值得,它几乎不改变任何事。两个模型在全部10次运行中都找到了会让人翻船的bug,一次没漏。专门层级没有增加任何一个standard漏掉的严重发现:它增加的是边界问题上的噪声。
作者也给出了诚实的局限:这只是一个应用和一个prompt。5次运行杀死的是该案例内部的随机性,不能保证你在Go微服务或已有框架覆盖半个OWASP的应用上得到同样结果。anchor-cms是老PHP、手写、没有安全网:这是任何模型都最容易出彩的场景。结论应读作"对此类目标",而非普适定律。
Blue这一侧还有一个局限:作者刻意选了最无害的防御性任务——读代码,不运行也不写exploit——而这恰恰是普通模型的刹车最不可能触发的地方。Blue还卖给补丁验证、恶意软件分析、事件响应等场景,其中一些确实产出攻击性工件,确实会触发普通版的拒绝。在那类场景里Blue可能解锁普通ChatGPT会弹回的东西。作者没测:这个实验测的是按设计Blue本来就不可能赢的子集。
不关于模型选择的三个教训
一个有能力的模型能可靠地找到你应用的严重bug。 好事……但这也意味着任何拿到同样工具的人能同样快地找到它们。如果你是vibecode,就假定你的代码会被模型审计:自己先做一遍。
不要只跑一次。 这是差点让作者翻车的部分。一次运行只是随机变量的一个样本。同一个prompt跑3到4次,保留发现的并集;一半有用的东西只在第二三次才出现。
核实。 最严重的bug是一条明晃晃写着 // Force admin for now 的注释,即便如此每次运行都漏掉不同的东西。模型给你加速,但替代不了你的判断。要求它给出文件和行号,要求它驳回误报,自己顺着链路走一遍。
这些都不是在反对Daybreak。但要看清楚论证:OpenAI公布的数字(1.5%→2.0%)根本不衡量这个案例——那是模型在攻击性任务上拒绝的频率,不是它审查你代码的水平——所以作者不依赖它们,依赖的是自己的10次运行。对那个想保护自己周末搭出来的应用的开发者来说,消息是平静的:你已经有的工具就够了。多跑几次,带着怀疑读它告诉你的东西,然后修。
10份原始报告(每个程序5份)和prompt都在作者公开的gist里。
相关推荐

3分钟看懂DeepSeek:从量化私募到开源AI领跑者的崛起之路
3分钟看懂DeepSeek发展史:从幻方量化的算力积累,到V2的MLA推理降本、V3的557.6万美元训练账单、R1开源引爆全球,再到V4与70亿美元A轮融资,梳理深度求索的关键节点与技术路线。

本地文学创作模型PK:Qwen3.8 27B微调版胜出,DeepSeek v4.1表现平淡
B站UP主横向测评七款本地文学创作模型:海明威、HumanLike Chat基于Qwen3.8 27B微调表现最佳,DeepSeek v4.1叙事平淡,东方朔角色混乱垫底。附三道测试题评分与使用建议。

梁文锋的三次豪赌:DeepSeek为何将82%毛利开源?
DeepSeek为何把82%毛利的推理框架DeepInfer开源,又启动千亿融资?从技术路线、国产芯片到组织纯粹性,解析梁文锋的三次豪赌与开源战略背后的商业与理想逻辑。