CounterProof

独立的对抗性代码审查

本页由 AI 从英文翻译,尚未经过母语人士审校;如有出入,以英文原文为准。 阅读英文原文

你的 AI 写了代码。谁检查过它?

代码可以运行得完美无缺,却仍然让人得以窃取资金、读取私密数据或夺取控制权。

CounterProof 是一个独立团队,在别人之前尝试攻破你的代码。对于我们报告的每一个问题,我们都给出证据:它在代码中的位置,我们如何检查它,以及还有哪些不确定之处。你会得到一份签名报告,可以与客户、保险公司、投资者和监管机构分享。

一个模型检查自己的工作,不是独立审查。

获取独立审查 →
01

你为什么会来到这里

没有人购买代码审查。人们购买的是它能为你打开的东西。

你读到这里,并不是因为你一觉醒来就想要一份安全评估。是有什么东西在要求你提供证据。

监管机构
欧盟《网络弹性法案》要求你“对产品的安全性进行有效且定期的测试和审查”(附件一第二部分第 3 点,参考译文),而你的技术文档必须包含“为验证带有数字元素的产品以及漏洞处理流程符合附件一第一部分和第二部分所列适用基本网络安全要求而开展的测试的报告”(附件七第 6 点,参考译文),并在产品投放市场后至少十年内,或在支持期内(以较长者为准),供市场监督管理机构随时调阅(第 13 条第 13 款)。第 14 条关于被主动利用的漏洞和严重事件的通报义务,已自 2026 年 9 月 11 日起适用;该条例自 2027 年 12 月 11 日起全面适用。大多数产品可以自我评估,但这不是减负,而是风险敞口:提供经得起检验的记录的责任,完全落在你身上。
收购方或投资者
如今,AI 辅助编写的代码库正是在技术尽职调查环节被压价。桌面上有一份独立评估,会在这场谈话开始之前就改变它的走向。
网络保险公司
核保人越来越多地为“我们内部测试过”与“一个独立方测试过并签了名”之间的差距定价。
企业客户
他们的安全问卷里,没有“我们的模型审查了它自己的输出”这个选项。

这四方中有三方从不接受你对自己代码的自述;他们购买的正是独立性,而这恰恰是任何团队都无法为自己的工作提供的属性。第四方,即监管机构,往往会接受你的自我评估,然后要你为其背后的每一份记录负责。无论哪种情况,证据都必须站得住。这正是我们产出的东西。

审查在你的漏洞管理中逐阶段处于什么位置(英文) →

02

你得到什么

发现变得廉价,证明变得艰难。

每次委托都会在一个持久的委托标识符(CPR-YYYY-NNN)下产出一份 CounterProof 评估,你的维护者、你的收购方或你的修复提交都可以引用它。每个发现项要么对照你的源代码得到确认(确切的文件和行号、复现路径、影响分级),要么被明确定级为“仅看似成立”。没有凑数的内容,没有扫描器生成的内容,没有你无法据以行动的内容。记录还会写明我们检查了什么而没有发现问题:在这里,已记录的阴性结果是一项交付成果,而不是一次失败的委托。

每个发现项都会写明它实际达到的证据梯级:源码追踪、编译证明(按发现项的预测,使构建先失败、再通过)、测试或实际复现;对于任何概率性主张,则是一个附有区间的比率,并保留每次试验的日志;并且从不暗示更高的梯级。每一处 path:line 引用,在报告离开我们之前,都会由机器对照我们审查的确切版本加以解析。你可以核查我们的工作。这是有意为之。

我们所处的位置,是一个发现项变成一项日后需要有人为之辩护的决定的地方:裁定、关闭和签名记录;而不是扫描器争抢候选发现项的竞赛。发现问题是委托的副产品;记录才是产品。

当一个发现项经不起审视(无论是你的、你的维护者的,还是我们自己复查的审视),我们会在同一委托标识符下以书面形式撤回它,并附上理由。我们主动这样做,对方无需开口要求。撤回记录不是认错;它是一种机制。

样例:一个发现项的形态
CPR-2026-0NN · F-07 · duplicate credit on settlement retry severity: High (reachable in default build) evidence rung: test · failing test, 2/2 runs, 3 clean negative controls source: gateway/src/settle.rs:412 @ rev a1b2c3d fix verified: rev e5f6a7b · finding closed in writing

示意样例,并非来自客户委托;标识符均为占位符。报告以英文出具。

“见证者如今是免费的,校勘本却不是。”

对监管机构
其结构便于作为附件七第 6 点所述的测试报告纳入你的技术文档,作为履行第二部分第 3 点测试义务的证明。它支持你汇编的档案;它不是档案本身,也不验证你对附件一整体的符合性。
对尽职调查团队
按证据分级、可复现、范围明确,并由我们为风险署名。
对你自己的工程师
短到读得完,准到改得了。我们可以陪你走完修补过程,并针对每项修复所针对的发现项独立验证它,记录我们验证了什么、在哪个版本上验证,因此你最终得到的是一份关于检查了什么的记录,而不是一份笔记清单。

市场已经开始比拼一个工具能生成多少发现项,但一个发现项是一位见证者,而不是一个裁决。一处 file:line 引用,是读者一分钟内就能打开并核查的东西;一个光秃秃的“Critical(严重)”则不是。在我们的记录中,严重程度是证据等级的产物,从来不是营销的素材。见证者如今是免费的,校勘本却不是。 发现项不是裁决(英文) →


委托是这样进行的

四个步骤。付款之前你就知道范围,结束之后记录由你保存。

1. 范围
与审查团队,也就是实际做这项工作的人,通一次电话。我们商定哪些在范围之内、哪些在范围之外,锁定接受审查的确切版本,并在任何资金往来之前,以书面形式把集团披露放在你面前。如果工作超出我们的领域,我们会直说并婉拒。
2. 审查
审查团队针对锁定版本开展工作。每个候选发现项都对照源代码加以裁定(确认、定级为“仅看似成立”或舍弃),结果干净的检查,与结果不干净的检查一并记录。
3. 报告
你会在委托标识符下收到评估,并有一次面向你的工程师的讲解。发现项、证据梯级、复现路径、已记录的阴性结果:短到读得完,准到能据以行动。
4. 记录
我们可以陪你走完补丁过程,并在关闭每个发现项的版本上,针对该发现项验证每项修复。标识符、撤回记录和关闭轨迹,按委托协议中规定的保存条款,始终可供引用(向你客户的安全团队、你的收购方或你的监管机构)。

第一次委托不必涵盖你交付的全部内容。一个小而精选的范围(一个模块、一条信任边界),能以一个你可以评估的规模,产出同样站得住的记录,而且它可以成为制造商提交的第一份第二部分第 3 点证据。

03

真正出问题的是什么

流畅不是质量的标志。它恰恰是失败的方式。

当一个人写下一行代码时,会对它心存怀疑。写的人知道自己是在猜,而这种怀疑是一种安全机制,因为正是它促使人去测试这段代码。

模型写同一行代码时很流畅,用的恰恰是它写正确代码时的同一种口吻。在阅读者看来,流畅读起来就像能力。一位初级工程师交给你一份明显粗糙的东西,你会检查它。一个模型交给你两百行打磨光滑的代码,每一行都附有一个自信的理由,你就不会检查了。

陷阱不在于模型比人更常出错。而在于它们错误的答案,和正确的答案以同样的口吻出现,从外部无法区分,因为从内部也无法区分。

然后,同一个过程编写了为这段代码作证的测试,以及解释它的注释。三者彼此一致,因为三者出自同一处。这种一致读起来像三次独立的确认。其实只有一次。

“它们错误的答案,和正确的答案以同样的口吻出现。”

所以,有用的问题不是模型能否写出好代码;它能,只要有方法围绕着它。有用的问题是:当你的审查过程所检查的一切都出自同一个来源时(代码、测试、解释,以及越来越多地,你为检查它们而构建的工具),它实际在测量什么。做得好,产出是好的。做得不好,读起来一模一样。


而攻击者并不受限于你的审查者

一次审查只能找到它的审查者能找到的东西。

用一个模型检查一遍代码库,一份简短的报告告诉你的东西很窄:那个模型,用那些提示词和工具,在那一天,找出了这些。它没有找出的东西不在报告里,而且从构造上说也不可能在。

用同一个模型对同一段代码再检查一次,预计会得到另一组结果。LLM 代码审查的表现更像模糊测试,而不像静态分析器:完全相同的重跑、提示词的微小改动、新一代模型,都预计会带来不同的发现项;而且和模糊测试一样,它永远没有完成的时候。(Thomas Dullien,《实验的时代》[英文],BlueHat Asia 2026。)

这有多重要,取决于不同审查者的盲点重合到什么程度;对于代码审查,没有人测量过。关于相关性错误的研究,在包括不同供应商的模型群体中,在多项选择基准测试和一项简历筛选任务上发现了大量重合;这是否适用于发现漏洞,尚未得到确立。它确实表明的是,不同的供应商并不会自动彼此独立。

有几样东西可以给单次审查遗漏的范围划定界限:一项证明、一套测试、一个模糊测试工具、一位专家、预先植入的缺陷,或者一位与第一位不同的审查者。不能划定这一界限的,是更自信地阅读同一次审查的结果。

我们没有证明多审查者审查能发现更多真实缺陷;为检验这一点而设计的实验在开展之前即已撤销,我们公开说明了这一点。我们坚持的是一个更窄的观点: 一位审查者给出的干净结果是一个有范围的结果,把它当作代码干净的证书来读,是这个结果无法支持的推论。 完整的论证(英文) →

我们已经把详细的论证写了下来,包括我们自己方法的局限在哪里、我们尚未证明什么:一篇通俗介绍(英文),以及其背后的完整论文,已作为预印本发表, doi:10.5281/zenodo.22030516(CC BY 4.0)。它未经同行评审,论文本身也这样说明。

04

为什么这不能在内部完成

你可以运行同样的模型。你无法做到独立。

在你自己的代码上运行多个 AI 模型,复制了我们的工具,却失去了关键的属性。你的团队选择审查者看到什么、设定问题、评判答案,而每一个选择都把你的假设直接带回审查之中。这不是纪律上的失败;这是结构性的。一个系统的作者,不能做它自己的裁定者。

所以,即便是一次完美无瑕的内部审查,仍然是你自己关于你自己代码的说法。他们购买的,是一个愿意签名的第三方。我们不是公告机构,也不认证符合性;我们产出的是独立证据,它支持你的评估,其结构便于任何其他人重新审查。

这种方法不在乎是谁(或什么)编写了你的代码。人类编写的代码同样常常缺乏独立性。机器编写的代码只是让这个缺口变得无法忽视。

05

随之而来的披露

你反正也会发现。最好由我们告诉你。

CounterProof 隶属于一个开发支付和数字资产托管基础设施的集团。这套方法正是在那里锤炼出来的,这意味着,如果你在这些市场中开展业务,我们的关联方可能与你相邻,或与你竞争。

所以:在任何委托开始之前,我们会以书面形式确切地告诉你集团开发什么、在哪里运营。由你决定这是否可以接受,而且你在付给我们任何费用之前就作出决定。如果不能接受,这是一个正当的回答,我们宁愿在一开始就听到它。

我们的独立性主张确切地涵盖什么、不涵盖什么:对于由 CounterProof 或我们集团内任何公司编写的代码,我们不出具任何评估。这条界限是结构性的。它是关于我们审查谁的代码的陈述,而不是声称我们在你所在行业附近没有任何商业利益。我们的商业利益已在上文列明,由你在付给我们任何费用之前决定是否可以接受。

我们拒绝代表你作出的主张,单独列在: 我们不会主张的内容 →

06

我们是谁

三个人,具名,有据可查。

一份签名评估意味着上面有某个人的名字。下面就是这些人,以及每个名字承担什么。

Vincent Soons,首席执行官
在 CounterProof Research 负责安全研究,专注于比特币基础设施:L2 协议、托管系统,以及转移真实资金的代码。他的工作以可运行的测试工具为支撑。每项主张均注明证据等级,凡他报告为已复现的,都已针对未经修改的代码确定性地复现过。背景:Fedimint(联邦式比特币托管协议)的上游贡献者;公开贡献,任何人都可以查证。
Luuk Soons,首席战略官
自 2013 年起活跃于比特币和稳健货币基础设施领域。负责方法、监管立场以及每一项披露决定,包括上面那一项。
Elenora Soons,客户经理
客户经理,也是你提出信息请求时的联系人:你写信给我们时由她回复,由她确定沟通范围,并推进委托的各项文书工作。她不撰写也不签署评估;那由上面两位负责。 info@counterproof.io · +356 7741 7951

我们是一家家族经营的机构(父亲、儿子和女儿),审查团队由两个人组成。这两点都是尽职调查团队自己会查到的事实,所以我们宁愿在这里说出来:一个两人的审查团队,承接的委托比一家公司少,会拒绝其领域之外的一切工作,也无法把一次薄弱的审查藏在品牌后面。这就是其中的取舍,也正因如此,这套方法被写了下来并实现了机械化,而不是只存在于某个人的脑子里。

07

笔记

我们在读什么,以及我们在核查什么。

全部笔记 →

08

在截止期限逼近之前,与我们谈谈。

请发邮件告诉我们需要审查什么、这份评估必须支持什么决定,以及你何时需要它。我们的客户经理 Elenora Soons 会安排你与审查团队通话。

info@counterproof.io

+356 7741 7951

在 LinkedIn 上关注我们 在 X 上关注我们