智能合约审计是区块链安全专家进行的一项审查,旨在确保用户不会因故障或安全漏洞而损失资金。此外,审计试图在合约部署之前预测意外和不良的智能合约行为。
探索这一领域非常棘手。这里有几十家审计公司,从几家公司获取报价需要时间,而且很难知道你是否获得了公平的价格。
本文将作为探索获取智能合约审计任务的起点。
本文对审计公司的提及不应被视为背书。
智能合约审计没有官方标准
而且鉴于该行业发展迅速,在可预见的未来可能也不会有。
“智能合约审计”一词是行业行话的演变,它没有严格的定义,对不同的人可能意味着不同的事情。
对于那些来自以 ISO standards 为常态的行业的人来说,智能合约审计看起来就像狂野的西部(坦率地说,这是一个准确的评估)。
尽管一些 smart contract vulnerabilities 是众所周知的,但其他漏洞是复杂系统的涌现属性,很难系统地检测到。
标准是成熟市场的特征,而整个 web3 并不是一个成熟的市场。
将智能合约审计称为“审计”有点混淆概念。在会计领域,“审计”有一个非常严格的定义;而在区块链工程中情况并非如此。在区块链中被称为“审计”的,实际上是由专家团队进行的安全审查。
让人更加困惑的是,对于什么样的人才能成为智能合约的审计师或安全专家,并没有正式的定义或认证。是的,有些公司在出售认证,但这些认证在行业内没有任何分量。
正如你所预料的那样,由于没有衡量专业知识的既定方法,一些有进取心的个人利用这种混乱来推销他们并不具备的专业知识。
买者自负。
尽管如此,业内普遍认为,“这个智能合约已经过审计”意味着“已经付费让一组安全专家审查这个代码库并寻找问题”。由于没有对专业知识的正式定义,行业声誉通常被用作代理指标。
三种主要的审计师
智能合约审计公司
这些是专门从事安全研究的公司。有些只审计智能合约,而另一些则同时审计智能合约和传统计算机应用程序。你可以把这看作是由安全研究员组成的机构。直到最近,这还是获得智能合约审计的标准方式。如果你在 Google 上搜索智能合约审计公司,你通常会得到这类结果。
独立安全研究员
有些安全研究员不加入公司,而是自己单干。他们相对难找一些,因为与机构相比,他们的营销预算要少得多,但由于他们的管理费用较低,通常能提供更好的价格。
一个缺点是,一家公司能够让几位审计师审查你的代码,而独立审计师只有一位审查员。但对于规模较小或不太复杂的代码库,这可能更具成本效益。
竞争性审计
最近,出现了几个平台(Code4rena、Sherlock DeFi),在这些平台上,要求审计的公司发布他们的源代码并提供一笔奖金池,然后独立的参赛者试图寻找 bug 和漏洞。
参赛者找到的 bug 越多,他们赚的钱就越多,但如果另一个参赛者找到了相同的 bug,那么奖金就会在两人之间平摊。对于众所周知的 bug,奖金可能会被大幅稀释。
在这种形式下,审计师的收入相当不理想。尽管投入了大量精力,参赛者很少能指望从每场比赛中赚取远超 $1,000 的收入。参与者的主要动机是证明自己的能力,以便能在传统的审计公司找到工作,或作为独立审计师(独立研究员)吸引业务。此外,由于任何人都可以参与,因此无法保证参与者的质量。
然而,这些平台对新审计师来说非常具有教育意义。因为这种形式鼓励人们高度专注于寻找 bug,并反馈哪些 bug 被遗漏了,所以它们可以提供一个相对紧密的反馈循环,有助于加速学习。事实上,我们指导我们 solidity bootcamp 的一些学员参与这些比赛以达到教育目的。
最好的审计师不会在比赛中花费大量时间,因为他们为自己或为公司工作赚取的钱要多得多。因此请记住,在审计比赛中表现出色的人可能仅仅意味着他们在所参与的比赛中没有面临激烈的竞争。这也存在运气的成分,即单场比赛的奖金占了某位审计师公开总收入的很大一部分。然而,这种形式让代码获得了比其他审计形式多得多的关注,并且审计比赛确实捕获过其他审计师遗漏的 bug。它们还可以作为公司向开发者和审计师社区巧妙营销其协议的渠道,因此它们对生态系统是有价值的贡献。
附加:非正式的代码吐槽 (Informal code roasting)
一些开发者 Discord 群组会免费审查你的代码(出于乐于助人的意愿,所以请不要滥用他人的慷慨)。如果你有一个小而简单的代码库,有时候让几位专家无偿贡献他们的时间可能是对你来说最具成本效益的途径。如果将这样的审查称为“审计”将是非常虚伪的,但如果它是唯一可用的选择,那肯定比完全没有审查要好。
智能合约审计的注意事项
查看该公司过往的审计
一些审计师使用一份僵化的智能合约漏洞检查表,检查该问题是否存在。这作为初步筛选是不错的,但许多 bug 是特定于应用程序的(正如我们在该文章中指出的)。你需要确保审计师会考虑你的应用程序的细微差别和业务需求。通过查看他们过往的审计,你可以看出他们是机械地对照清单检查,还是深入研究了你应用程序的具体细节。不提供过往审计报告的审计师通常是一个危险信号。
审计师的专业领域
如果你的项目使用了奇特的 DeFi 代币经济学或 Zero Knowledge Proofs,那么你会希望确保你选择的审计师有相关经验。同样,如果你正在一个非 EVM 兼容的链(如 Solana)上构建 dapp,那么你需要一位对该区块链有经验的审计师。
最低成本
一些审计公司不会理会像 ERC20 代币或基础 NFT 这样的小型代码库,因为他们赚的钱不足以支付销售电话和客户管理的成本。
橡皮图章审计师
因为对审计没有正式或公认的定义,所以涌现了一些提供被戏称为“橡皮图章审计(rubber stamp audits)”的公司。这些公司提供审计报告仅仅是因为买方需要一份审计,以便他们能对客户说:“看,我们已经经过审计了!”
并非每个协议都故意获取橡皮图章审计;他们可能只是在不知情的情况下选择了此类审计师。
智能合约审计有多可靠?
即使智能合约经过了审计,之后仍然可能被黑客攻击;这并非罕见现象。
Rekt.news 有一个 leaderboard,根据损失金额跟踪智能合约的黑客攻击事件。很容易看出,大多数被黑客攻击的协议根本没有接受过审计。
然而,其中一些协议确实进行过审计,有些还不止一次,但审计师依然遗漏了问题。在某些情况下,这可能是因为审计师不够称职或不够努力,但总体而言,不可能保证一个代码库完全没有 bug。
好消息是,有些漏洞不仅被审计师遗漏了,也被黑客遗漏了。有些智能合约在被修补之前,已经带着实时存在的漏洞运行了几个月。一次像样的审计将确保为黑客消除那些“唾手可得的果实(low-hanging fruit)”。
我应该进行多次审计吗?
这是资金充足、打算持有大量资金的 DeFi 协议的标准做法;让三家或更多的审计公司审查代码是非常正常的。
一位审计师遗漏的,另一位可能会发现,反之亦然。同样,一位审计师可能会注意到一个漏洞,而开发者在修补该漏洞时可能会引入另一个不同的漏洞。
获取审计的典型工作流程
1. 获取报价
你将联系各个公司寻求报价,并根据他们的可用档期和你的发布日期进行协调。
2. 审计开始
在进行审计时,你的代码应该处于冻结状态(code freeze)。如果审计师审查的代码库与你将在生产环境发布的版本不同,你可能就是在浪费钱!
3. 审计报告
大多数(不遵循固定检查表的)审计报告会返回一份分为 Critical、High、Medium、Low、Informational 和 Gas Optimization 的发现清单。这些将在下一节中进行解释。审计时间可以短至几天,长至几个月,具体取决于项目的范围。
4. 审查修复
根据协议,审计师将审查开发者所做的更改,并确保修复确实解决了该 bug。被认为可接受的修改审查次数取决于审计师。
5. 发布报告
如果客户允许,审计师通常会发布他们的报告(而客户通常也希望审计公开,以表明他们已接受过审计)。
审计发现的严重程度
大多数审计报告将安全发现按严重程度分类:
- Critical
- High
- Medium
- Low
- Informational
- Gas Optimization
并非所有公司都使用相同的标签。如前所述,由于缺乏通用标准,对于什么算作“High”或“Medium”漏洞并没有统一的定义。一些审计师在为同一个 bug 分配适当的评级时存在分歧,但以下是审计师用于分配严重程度的一些因素:
- 最坏情况的结果。所有资金被盗是灾难性的。黑客无法窃取资金但用户未得到充分保护从而带来自我伤害风险的 bug,将被标记为 Low 严重程度。
- 受影响的用户数量。整个协议受损比单个用户受损更为严重。
- 实施攻击的动机。如果攻击者实施攻击所花费的资金超过了他们获得的收益,那么严重程度就会降低。这仍然是一个漏洞,因为攻击者可能有非经济动机来实施攻击(炫耀、个人恩怨等)。
- 攻击的隐蔽性。如果漏洞是类似于缺少访问控制的问题,那么不复杂的攻击者就可以实施攻击。如果弱点取决于对使用高等数学的复杂代币经济学机制的深刻理解,那么攻击者发现该问题的可能性就较小。
一些审计师将最后两个因素合并为一个:攻击的可能性。在这个模型下,他们使用下表来分配严重程度:
| 高破坏性 | 中等破坏性 | 低破坏性 | |
|---|---|---|---|
| 高可能性 | High/Critical | High | Medium |
| 中等可能性 | High | Medium | Low |
| 低可能性 | Medium | Low | Low |
Critical vs High vs Medium
一些审计师对 Critical 漏洞和 High 漏洞进行了区分,而其他审计师将 Critical 漏洞与 High 漏洞归为一类。无论哪种情况,这些都被认为是非常严重的 bug!对于进行区分的人来说,Critical 可能意味着整个协议受到严重影响,而 High 意味着单个用户可能受到严重影响。
Medium 严重程度的问题通常意味着可能造成破坏但发生概率较低的问题。
Informational
一些审计师会指出一些问题,比如不遵守 Solidity 风格指南,或者变量名和函数名拼写错误或具有误导性。这些不是安全漏洞,但可能会在将来引起混乱。并非所有的审计师都会指出 Informational 问题。
Gas Optimization
一些审计师会建议改进智能合约 optimize the gas cost(优化 Gas 成本)的方法。这些虽然与安全无关,但肯定会改善用户体验。
审计一个智能合约需要多少钱?
基于公开信息的估计
如果你在 Fiverr 上查看,你会发现一些以低价审计智能合约的服务,但对于如此关键的事情,你真的愿意依赖那种服务吗?由于合约通常包含保密协议,费率可能很难确定,但这里有一些公开信息。
1. 竞争性审计的奖金池
竞争性审计平台会公布奖金池,当然,这些钱来自支付审计费用的客户。在这里,你可以看到奖金池低至 5 千美元,有时对于非常大的项目可高达几十万美元。在极端情况下,甚至有过超过 100 万美元的奖金池。当然,运营比赛的平台期望获得一笔费用,因此实际成本会更高。
2. 承包商薪水
审计公司 Spearbit 公布了他们支付给审计师的 rates(这些审计师是承包商,而不是全职员工),因此人们可以据此推断出审计将花费多少钱(不包括运营和利润率)。根据资历的不同,每位审计师的薪酬为每周 3k-20k 美元。请记住,这不是一份全职工作,而是按项目计算的。
3. 独立审计师
我们的另一个数据点是公开收入的独立审计师。其中一位声称在行情好的月份能赚取 $40k per month,每月大约接手四次审计;另一位声称通过五次审计在 $50,000 in one month 内赚了五万美元。这是一名独立审计师所能期望达到的收入上限,但这并非天方夜谭;顶尖硅谷公司的资深工程师(Staff engineers)挣得比这还多。
审计师如何生成报价
没有标准的定价模型,但以下是审计师用来确定报价的一些做法。
按代码行数计费
最常见的定价模型是 美元/代码行。这可能花费每行几美元到几十美元不等。
规模与复杂度
其他审计师结合使用了规模和复杂度。一个 1,000 行的 NFT 代码明显比一个 1,000 行的数学库要简单得多。审计公司会根据这些因素的组合做出主观判断。
与现有协议的相似度
如果要审计的项目是分叉了成熟项目或是与其非常相似,一些审计师会提供折扣,因为他们可以利用过去的审计来确定你的项目是否吸取了过去的教训。此外,尚未经过审查的代码总行数仅占项目的一小部分。不同的审计师对于什么构成“相似”成熟项目的门槛会有所不同。
按漏洞数量计费
这种模式在独立审计师中很常见。安全研究员收到一笔小额首付款,并针对发现的每一个 bug 获得一笔报酬,严重程度越高的发现价格越高。这样做的好处是能够激励审计师更努力地寻找,但它也可能刺激夸大 bug 的严重性。
为什么审计如此昂贵?
与律师等其他高度专业化的知识工作者相比(其中最优秀的律师可以每月进账超过 one million dollars per month),智能合约审计并没有贵得离谱,但对于小公司来说可能是一个沉重的负担。
成为一名智能合约审计师并不容易。一般来说,所需的技能水平可以与试图在硅谷获得一份极具竞争力的工作相媲美,这意味着起薪轻轻松松就在六位数范围。审计公司需要在这些薪水之上收取可观的利润率以保持盈利,因此审计需要花费几万美元甚至几十万美元也就不足为奇了。
先测试你的代码!
令人震惊的是,有大量的智能合约在 unit testing(单元测试)不足的情况下被送去审计。愚蠢的 bug 会消耗审计师寻找更严重漏洞的时间,因此请使用你可获得的所有测试和智能合约安全工具,以确保你的合约没有 bug。
需要 RareSkills 的帮助吗?
RareSkills 不是一家审计公司,但我们的许多 instructors 都是专业的审计师,而且我们也从事安全研究。对于哪些公司信誉良好,哪些不是,我们拥有内部人员的视角。随时欢迎 contact us 告诉我们你的需求,我们将根据你的情况推荐合适的资源。
如果你希望培训你的工程师如何开发安全的智能合约,那么我们针对专业工程师开设的业界领先的 smart contract bootcamp 可能会让你感兴趣。
最初发布于 2023 年 6 月 24 日