翻译自5 Best Practices for the Perfect Secure Code Review,其中对人工审计和自动化代码审计的优劣势分析比较清晰,同时提出的几个最佳实践个人觉得还是很有道理,符合我们的实践经验。
想象一下,你一直在努力将安全工具和流程集成到整个开发过程中,而现在距离应用程序发布或更新只有几天或几个小时的时间。 你的应用程序都准备好了吗?
错了!在安全流程中,你还有一个步骤,然后才能在安全环节开放绿灯:安全代码审查。 在包括医疗保健和支付垂直领域的很多行业,安全代码审查是合规性需求的一个强制部分,它们在发布应用程序之前提供了附加的安全保障。 无论是否强制要求,安全代码审查都为应用程序和整个组织的安全性提供了附加价值。
安全代码审查是流程组织在开发流程的后期识别和修复潜在风险安全漏洞的过程。 作为应用程序发布前的最后一个安全阀,安全代码审查是安全过程中不可或缺的一部分。 它们作为一种最终检查,以检查你的代码是否安全可靠,以及应用程序的所有依赖项和控件是否安全并具备应用功能。
由Jeff Williams撰写的OWASP代码审查指南说得很好:“代码是你相对于黑客的唯一优势。 不要放弃这种优势,而只依靠外部渗透测试。请使用代码吧。”
如果你在整个开发过程中集成了安全性测试,你可能会认为你的发布是安全的。 但是,在通过自动化和/或手动检查确保应用程序正确地实现了安全机制之前,你不能确保在最后一刻出现安全工具无法检测到的问题或漏洞。
这就是安全性代码检查的作用所在。 就像我们在发送一个重要的文档之前再检查一次一样,应用程序需要“最后一次检查”,以确保应用程序及其组件没有安全缺陷。 安全代码审查用于检测在其他类型的安全测试中没有发现的所有不一致性,并确保应用程序的逻辑和业务代码是可靠的。 评审可以通过手动和自动方法来完成——稍后我们将讨论每种技术的优缺点。
通过安全代码审查来验证代码的安全性,还可以减少在发布后检测到漏洞所需的时间和资源。 在安全代码审查过程中发现的安全漏洞导致了无数次的违规行为,导致数十亿美元的收入损失、罚款和客户流失。
安全代码检查的重点是发现以下每个领域中的缺陷:身份验证、授权、安全配置、会话管理、日志记录、数据验证、错误处理和加密。 代码评审人员应该精通他们正在测试的应用程序的开发语言,以及他们需要注意的安全编码实践和安全控制方面的知识。
审查人员的另一个重要需求是了解应用程序的完整上下文,包括它的目标受众和用例,以便能够成功地审查代码。 如果没有上下文,代码审查人员将无法保护代码的某些部分,这些部分乍一看可能是安全的,但实际上有可能很容易受到攻击。 了解应用程序将被使用的上下文以及它将如何工作,是确保充分保护你所使用的应用程序的唯一方法。
在选择用于进行安全代码评审的工具和流程时,你可能会遇到这样的问题:应该使用哪些工具,应该使用自动化工具还是人工检查。 哪个更好? 与SDLC的其他领域一样,最好的方法是混合使用的方法,结合使用强大的静态代码分析工具进行手工评审和检查。 以下是两种审查方法的优缺点:
• 检测容易出现的漏洞和数百个其他漏洞,包括SQL注入和跨站点脚本
• 在敏捷和持续集成环境中,快速和大量代码测试的能力是至关重要的
• 能够按需调度和运行
• 能够添加包括业务逻辑在内的非安全性检查
• 能够根据组织的需要扩展自动化测试
• 根据工具的选择,可以根据组织的需要,特别是特定的合规性规范和高价值的应用程序,定制自动化的源代码评审工具
• 可以帮助提高开发人员的安全意识,并提供一种更好地培训使用该工具的开发人员的方法
• 不允许进行微调和自定义的工具可能会产生误报和误报
• 覆盖范围和广度实际上取决于你选择的工具以及它所涵盖的语言、框架和标准
• 为那些不熟悉静态代码检查器的人提供了一个学习曲线
• 尽管有强大的通用开发语言自动审查开源工具,但它们并不总是符合预算计划的
• 能够深入研究代码路径,检查设计和体系结构中的逻辑错误和缺陷,大多数自动化工具都无法找到这些错误和缺陷
• 与一些自动化工具相比,手动检测授权、身份验证和数据验证等安全问题的效果更好
• 对于高价值的应用程序,总是有额外的利用空间(需要经过专业培训的)
• 查看其他人的代码是共享安全代码和AppSec知识的好方法
• 要求精通应用程序中使用的语言和框架,并需要对安全性有深入的理解
• 不同的评审人员将生成不同的报告,从而导致评审人员之间的结果不一致——尽管同行评审可以是一个修复方法
• 测试和编写报告是及时的,并且经常需要开发人员参加有时很长时间的访谈会议,以便为审查人员提供上下文,这消耗了开发人员的时间和资源
• 对代码行数超过10-15k的应用程序的手动审查仅限于针对高风险功能
应用程序有成千上万行代码,而且我们发布新应用程序和版本的周期一直在缩短。 尽管如此,我们却不能比10到15年前更快地评审代码。 另一方面,没有工具或人是完美的。
此外,维基百科上关于应用程序安全的条目表示,“人类的大脑更适应通过编译代码库来跟踪每一个可能的路径,以便找到漏洞的根本原因的自动化商业源代码分析工具,它们往往可以更多的过滤、中断和输出报告。“在许多方面,手工和自动的源代码评审是相辅相成的,它们都涵盖了彼此通常薄弱的部分。
随着应用程序安全工具的成熟,你将发现手动和自动代码评审都应该在其中占有一席之地。 因此,如果你的预算既考虑了工具的成本,也考虑了内部审查人员或外包审查人员的成本,那么在你的正常安全活动中最好混合使用自动化和手动审查人员。
在进行手工代码检查时,确保所有检查人员都使用相同的全面检查表。 正如编写代码的开发人员是人,可能会忽略安全编码实践一样,如果不使用设计良好的检查表,审查人员可能会忘记某些检查。
此外,对手工代码审查人员强制执行时间限制和强制中断。 记住,就像我们在写完电子邮件,甚至连续几个小时阅读后都会感到疲惫一样,审稿人也会感到疲劳。 确保审查人员处于最佳状态非常重要,尤其是在查看高价值的应用程序时。 与此同时,将特定的时间花在源代码评审上也可以激励评审人员在适当的时间内完成工作。
2. 通过不直接指出开发人员来确保积极的安全文化
指出开发人员经常犯同样的错误这是很容易的,特别是通过一些可以比较结果的工具。 在构建安全文化时,避免与开发人员玩指责游戏是很重要的,否则这只会加深安全与开发人员之间的分歧。 使用你的发现来帮助指导你的安全意识培训,将这些常见错误作为起点,并使用开发人员应该注意的相关示例。
同样,如果开发人员感觉到有人在监视他们,随时准备对所犯的每个错误进行纠正,那么他们也不会提高安全性。 以更积极的方式提高他们的安全意识,那么你与开发团队的关系,更重要的是与整个组织的关系,将从中受益。
3. 每次引入代码中有意义的更改时都要检查代码
如果你有一个安全的SDLC,你就会理解定期测试代码的价值。 安全代码评审不必等到发布之前才进行。 对于主要应用程序,我们建议在引入新更改时执行手工代码评审,通过将应用程序分成块进行评审来节省时间和人力。
4. 人工检查和工具使用的结合是检测所有缺陷的最佳方法
工具(尚未)具备人类的思维能力,因此无法检测代码逻辑中的问题,而且如果在一段代码中不修复这样的缺陷,就很难正确地估计组织的风险。 因此,正如我们上面所讨论的,混合使用静态分析测试和手工评审是避免代码中遗漏盲点的最佳组合。 使用你团队的专业知识来检查更复杂的代码和应用程序的有价值的领域,并依赖自动化工具来覆盖其余部分。
5. 持续监控和跟踪不安全代码的模式
通过跟踪你在漏洞报告和应用程序之间看到的重复问题,你可以通过修改你的安全代码审查checklist以及应用安全意识培训来帮助推广未来的审查。 监控你的代码可以深入了解可能导致某些缺陷的模式,并在你更新评审指南时提供帮助。