本文作者作为一名安全工程师,分享了在过去十年中进行数百次安全评估的经验,内容涵盖安全审计的整个生命周期,包括审计前、审计中和审计后,并强调了在每个阶段应该采取的最佳实践,以提高安全审计的效率和效果,确保项目安全。
我在过去十年中进行了数百次安全审查。以下是如何让情况对你有利。
安全软件开发周期中最关键的阶段之一是安全审计:对代码或系统的独立评估,旨在标记可能的缺陷。在过去的十年里,我对各种各样的系统进行了数百次评估,包括应用程序、网络、设备、钱包和智能合约。在此期间,我观察到大多数成功的公司是如何让他们的系统接受外部审查员评估的。这些过程在很大程度上遵循了体面的供应商会告诉你要做的事情,并混合了一些可以帮助你协商更好条款的策略。
在这篇文章中,我将分享我所学到的,这些可以帮助你准备,并在整个安全审查过程中(之前、期间和之后)遵循最佳实践。

作为一个快速的入门,让我们检查一下是什么使安全审查或审计成功。首先,审查员需要成为你系统类型的专家,并具有一定程度的直接适用经验。其次,审查员需要知道在哪里以及如何查看正确的事物。第三,审查员必须有足够的时间(和精力)来梳理需要查看的事物。
除了这三个主要标准之外,还有其他因素需要考虑。这些包括支持审查员的其他团队成员的知识、审查员可用的专有工具以及审查员的方法。这些其他要素对审计的成功贡献较小,但仍然值得考虑。
首先,想想你希望从审查中得到什么。如果你的答案是一些崇高的东西,比如“找到我们系统中的所有漏洞”,那么你就不走运了。相反,设定一个更合理的目标,比如“充分了解我们密钥管理基础设施的安全状态”,或者“寻找攻击者利用我们的智能合约来窃取资金的机会”。在进入审计时,请记住这些目标,并在评估时坚持将其作为成功标准。
使用现有的框架(如STRIDE 或 PASTA)进行快速的“威胁建模”会很有帮助,可以让你了解你希望从审查中获得什么。如果你不太喜欢正式的威胁模型,你可以简单地让你的工程师考虑以下问题:“我们担心系统的哪些方面出现故障?” 这个练习可以帮助你了解你希望在审查中包含哪些领域。
一旦你记录了目标和顾虑,你就可以了解应该审查系统的哪些部分。这应包括合理要求的,用于完成目标和解决顾虑领域的所有系统。(好的审计公司通常会帮助你完成此过程,作为项目范围界定的一部分。)
“我应该选择哪个供应商?” 是我经常听到的一个问题。不幸的是,没有万无一失的方法来知道谁会表现最好。但是,口口相传的推荐可以为你指明正确的方向。四处打听并比较笔记将使选择过程容易得多。
刚开始时,一个常见的错误是假设可以按需预订评估。如果你匆忙参与其中,则可能会降低整体质量。安全供应商很忙,专业的供应商可能更是如此。如果你在最后一刻预订审计,供应商最终将选择最合适的审查员——也就是说,通常是不受欢迎的人,或者只是碰巧从事的项目被取消或延迟的人。无论哪种方式,你都在碰运气,并希望找到一个合适的。不建议使用这种策略。
尽早与尽可能多的供应商(通常为 2 或 3 个)合作,为自己做好成功的准备。这将使你有很大的机会找到适合评估的人员,而又不会在太多的会议中让你感到困惑。有了更多的准备时间,你可以等待更好的人员可用,并且有更大的选择范围。可以将其视为招聘:候选人越多越好(最好来自经过审查的来源)。
你应该提前多久参与取决于评估的类型和一年中的时间。增加所需准备时间的因素:
以密码学等主题专业知识为例。审计公司可能只有少数几个密码学博士在职,他们能够进行深入的密码学审计。如果这些专家已被预订,你将不得不等到他们的其他评估完成后才能进行。根据市场需求,你可能需要将你的时间表至少推迟 2-3 个月。
从本质上讲,这归结为以下因素:“有多少人可以做到这一点?”(专业化,挑剔)和“他们什么时候可以做到这一点?”(较长的评估会使找到时间更困难)。对于相当普通的评估(例如,Web 应用程序、网络评估、Solidity 智能合约),你可以期望需要几周的准备时间。如果你试图预订与大型公司合作的审计师,你可能需要提前几个月安排,才能在 10 月到 12 月之间进行合作。如果你处于一个特别活跃和新兴的技术领域,时间表可能会膨胀。始终考虑提前几个月安排。
在此过程中,请尽可能直接地与供应商沟通。主动分享信息、假设和文档。这将帮助他们帮助你。确保你尽最大努力回答范围界定问题。这些问题可能如下所示:“管理密码材料涉及哪些服务?” 及时回复信息请求。你越公开地沟通,你就越有可能为项目获得合适的员工。
这是那些有评估经验的公司开始发光的地方。基本上,你可以选择雇佣谁来查看你的系统。你可能是一家小公司,但你仍然可以询问可用的资源,包括有关人员的亮点以及他们所做项目的示例。
现在,这里有一些限制。如果你是一家较小的公司,你可能更难让人们回答你的问题;只要你专业且尊重,专业的组织就会与你合作。但是,不要因为过于挑剔或没有准备好雇用优秀的审查员而浪费人们的时间。目标是为双方建立最佳的匹配,以确保项目成功。很少有公司会试图让你与不合适的人合作(除非他们别无选择)。
如果你可以选择某人,请寻找过去评估过与你的项目类似的项目,并且对与你的项目相关的主题表示兴趣的人。如果你能够事先与潜在的审计师进行对话或沟通,请提出一些问题以确保你找到了合适的审计师。具体的审计师可能并不总是可以与你交谈,因为这样做会占用他们一天中的时间并带来上下文切换成本,但是如果项目很重要,那么你可能可以要求提供这种级别的服务。
请记住,经验的回报会递减,尤其是在简单系统方面。如果你的项目与许多其他系统类似,并且没有任何异常之处,那么请考虑更多地偏向兴趣而不是丰富的经验。一个例子可能是分叉现有经过充分审查的协议或一组库的系统,而几乎没有添加自定义业务逻辑。看到第 20 个类似项目的版本可能会导致审查员对项目的参与度低于只看过类似项目几次的人。
除了我们已经讨论的内容之外,获得审计师实际上就像雇用承包商一样。你可以尽最大努力确保他们很合适并且很可能会做好工作,但是仍然存在一些偶然因素会影响一切的进展。
好的,现在你已经得到了你能找到的最佳匹配,你还能做什么?不要只是希望事情会顺利进行;做好准备。
首先,让你的一切井井有条。清理任何你知道需要注意的代码或系统。确保任何测试环境或有关如何运行你的环境的说明均可用且为最新。在此过程结束时,你应该有理由确定,当审查员要测试你的系统时,他们可以与正在运行的版本进行交互。
接下来,将你的代码或系统放到你乐于让他们查看的地方。希望这不会花费太长时间,但是如果你正在努力完成最后一个用于测试的功能,那么你就是在为自己埋下痛苦的种子。花一两个星期的时间来检查你的系统、代码库和文档,以确保你已准备好一切,以便在最佳条件下开始审计。
最后,如果时间允许,请查看代码或系统并尝试自己发现问题。这不需要你自己进行完整的评估,但应该包括寻找任何奇怪的或以前可能被忽略的东西。运行一组测试甚至一些临时使用可以帮助在潜在问题发生之前解决它们。即使你在此类审查期间看到的内容不会在审计开始之前得到修复,但更早地了解问题会给你更多的时间来完全修复它们。
好的,你已经准备好了。现在,你需要确保你之前所做的所有工作都传达给正在进行评估的人员。通常,你会在评估开始之前的会议中这样做。向大家介绍自己,让他们知道你的目标和顾虑领域,告诉他们有关系统和文档的信息,并尝试让大家都达成共识。尽最大努力引导审计师完成你的团队所担心的方案,并对你的顾虑进行排名。
在此次会议中设置沟通的期望。使用对双方都有意义并且双方都可以立即采取行动的媒介。指定你团队中的某个人来支持这项工作,以回答测试人员提出的任何问题。为审计师提供一个知识渊博的联系人,因为毫无疑问,你需要在评估期间解决一些澄清问题。
除了沟通策略之外,还要建立一个更新的节奏;更频繁的更新可能看起来更好,但这可能会带来挑战。许多评估人员以结果为导向,并且他们可能会对自己正在进行的工作感到不自在。鼓励你的审查员以流程为导向,并提供有关事情进展的更新。希望你提供的目标能够清楚地表明,你不太关心具体的“结果”(或报告中的漏洞),而更关心充分执行你提供的目标。
最后,把你在此过程开始时写下的笔记(包括目标、顾虑和来自开发人员的笔记)发送给他们,以重新强调你的优先级。确保他们承认并理解这些优先级。你可能会觉得你在这里很苛刻,但在我看来,这是影响评估质量的最重要因素。
现在审计已经开始,请确保你指定的人员及时回答问题。这很重要,因此请考虑腾出该人员的时间表。你不想让你的审查员浪费时间,花几天时间在系统中低优先级的组件中徘徊,因为他们不知道它与陈述的目标无关。他们对你的系统是全新的,因此他们有时可能会迷路。
阅读并跟进你在评估开始时要求的更新。如果你不阅读它们,那么你就在浪费大家的时间。如果优先级看起来不对劲,请询问它们并确保它们符合你的期望。
所有这些都归结为确保评估不会脱轨。这种情况并不经常发生,但为最坏的情况做好准备可以帮助避免不良结果。如果你看到进度似乎已经停滞——并且审查员无法告诉你他们一直在做什么或他们还有什么要做——那么现在是开始强硬的时候了。尽你所能地升级情况,并尝试确保问题得到解决。一个好的公司会介入并迅速解决问题,尤其是当事情明显出错时。最好的升级途径往往是将你的顾虑告知项目或客户经理,然后他们会将这些顾虑转达给项目负责人或管理层。
如果升级没有结果,并且评估继续脱轨,那么就没有什么可以挽救项目的了。你可能会认为这项工作不足,并寻找通过辅助活动来支持审计或寻找另一家公司进行另一次审计的方法。
现在审计已经结束,希望你对所做的事情有了一个很好的了解,并且对你将在报告中看到的内容有一个合理的预期。收到报告后,请阅读它。确保问题有意义,在必要时做出回应,并询问任何你认为奇怪或不正确的问题。迅速这样做,以便审查员仍然了解你所询问的内容。如果你在两周后提出问题,那么他们可能已经在进行另一个项目,并且无法如此迅速地回答。
在你对报告进行整理之后,你将需要解决你最关心的问题。立即执行最紧迫的事情,以便可以更快地重新测试系统。否则,请花时间解决大部分问题,然后要求重新测试,这可能需要从一天到几周的时间,具体取决于测试的复杂性和审计师的可用性。一旦你确认你的东西已被修复,那么你就应该可以开始了。
这并不完全是过程的一部分,但这是需要记住的事情。正如前面提到的,找到系统中的所有漏洞是一项不可能完成的任务。即使是像形式验证这样的方法,也无法在合理的时间内确定系统中相对简单的方面。审计是“尽力而为”,这意味着有人查看了一下,使用了他们可以使用的最先进的工具和技术,如模糊测试、符号执行和混合执行,然后给你他们对测试结果的解释。这是你能得到的最好的“保证”,至少目前是这样。
此外,评估仅适用于进行评估的特定时间点。如果你的系统变化很快,那么审查可能会很快过时。如果你需要你的系统安全,请放慢速度。你需要停止进行如此迅速的更改,而是间隔发布(否则就征集一支审计师军队)。从技术上来讲,你可以保留一家审计公司,实施强大的安全实践,或者两者兼而有之,但你可以期望会错过一些“全局”项目。如果你正在审计增量——两个版本之间的差异——那么你通常不会查看所有内容,因此你更有可能错过副作用(就像 Euler 在他们的代码经过审计后 遭到黑客攻击时发生的情况一样)。
不幸的是,这可能会让人感到不满,尤其是考虑到其中一些评估的价格标签。(由两位审计师进行的专业的智能合约审计每周可能花费高达近 100,000 美元。)但这就是它的运作方式。请记住这一点,及时更新这些“威胁模型”,并让你自己的人——那些最熟悉系统的人——也寻找问题。
没有一个审计是完美的,你的系统可能仍然存在问题。鉴于此,请考虑引入其他机制,可以帮助你获得你想要的安心。这就是漏洞披露计划(如漏洞赏金)的用武之地。通过创建漏洞赏金,你可以确定,如果漏洞提交给你,你将立即为漏洞付费。理想情况下,这意味着你会在它们被用于漏洞利用之前收到它们。HackerOne、BugCrowd 和 ImmuneFi 等程序可以协助创建和管理这些类型的漏洞赏金。
最后,创建用于监视、检测和潜在响应的机制。设置安全措施,可以帮助你发现奇怪的行为,以便你至少有机会暂停或响应黑客攻击,而不仅仅是坐下来看着你的系统被漏洞利用到灭绝。如果你需要帮助来创建或管理这些类型的系统,请查看专门从事这些类型工作的组织,例如 Forta 为链上可见性所做的工作。此外,像安全联盟 (SEAL) 这样的组织已经创建了加密协议可以采用的安全港协议,以允许外部参与者代表他们帮助救援资金。
这就是完整的生命周期。你已经精心设计了一项评估,该评估侧重于与你的项目相关的特定目标和顾虑。你尽早与供应商合作,以便更好地找到查看你的项目的审计师,并让他们尽可能无缝地完成工作。你知道在任何时候都不能保证一个好的结果,但你已经尽了一切努力来确保成功的可能性更大。
所以你可以高枕无忧(但要时刻保持警惕)。
- 原文链接: a16zcrypto.com/posts/art...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!