如何准备安全审查
您刚刚批准了对代码库的安全审查。您会选择:
- 发送代码库副本后等待报告,还是
- 付出额外努力为项目成功做好准备?
到审查结束时,这两种选择将导致截然不同的结果。前者会浪费资金、时间并遗漏安全问题;后者则会降低风险、节省时间并获得更有价值的安全指导。
这是个简单的选择,对吧?很高兴您认同。
现在,以下是让安全审查对所有相关人员更有效、更有价值和更满意的方法。
设定审查目标
这是安全审查中最重要的步骤,但矛盾的是,它也是最常被忽略的。您应该明确希望回答的问题类型,例如:
- 产品的整体安全水平如何?
- 所有客户端数据交易是否安全处理?
- 用户能否泄露其他用户的信息?
了解您最关注的领域将帮助评估团队调整方法以满足您的需求。
解决简单问题
将代码交给评估团队很像发布产品:代码越干净,一切进行得越顺利。为此:
- 启用并处理编译器警告。首先处理简单问题:启用所有能找到的编译器警告,理解每个警告,然后修复代码直到所有警告消失。升级编译器到最新版本,然后修复所有新的警告和错误。即使看似无害的警告也可能预示潜在问题。
- 增加单元和功能测试覆盖率。理想情况下,这应是开发过程的一部分,但每个人都会疏忽,测试未更新,或新功能与旧集成测试不匹配。现在是更新测试并全部运行的时候。
- 移除死代码、陈旧分支、未使用的库和其他无关内容。您可能知道哪个分支是活动的,哪个是死的,但顾问不知道,会浪费时间调查潜在问题。同样适用于数月无进展的新功能或不再使用的第三方库。
一些问题是会持续存在的——尚未准备好的补丁,或尚未集成的重构。尽可能详细地记录任何未完成的更改,以免顾问浪费一周时间研究两个月后就会消失的代码。
文档,文档,文档
将评估团队视为新雇佣的完全远程开发人员;他们技能娴熟,但不熟悉您的产品和代码库。文档越多,他们上手越快,越早开始分析。
- 描述产品的功能、用户和使用方式。最重要的文档是高层级的:您的产品做什么?用户从中期望什么?它如何实现这一目标?使用清晰的语言描述系统如何交互以及开发过程中设计决策的理由。
- 在代码中添加行内注释。函数应有注释,包含其预期行为的高层描述。复杂代码段应有注释描述正在发生的事情以及选择特定方法的原因。
- 标记和描述测试。更复杂的测试应描述它们测试的确切行为。测试的预期结果,无论是正面还是负面,都应记录在案。
- 包括过去的安全审查和错误。先前的报告可以为新的评估团队提供指导。同样,关于过去安全相关错误的文档可以给评估团队提供线索,告诉他们应该最仔细地查看哪里。
交付包含电池的代码
就像新的完全远程开发人员一样,评估团队需要代码副本以及关于如何构建和部署应用程序的明确指导。
- 准备构建环境。记录在完全与内部网络断开连接的计算机上从头创建构建环境的步骤。在相关处,具体说明软件版本。自己走一遍这个过程以确保其完整性。如果您有不可公开获取的外部依赖项,请将其与代码一起提供。完全配置的虚拟机镜像是交付工作构建环境的绝佳方式。
- 记录构建过程。包括调试和发布构建过程,以及如何构建和运行测试的步骤。如果测试环境与构建环境不同,包括如何创建测试环境的步骤。良好记录的构建过程使顾问能够更高效地运行静态分析工具。
- 记录部署过程。这包括如何构建部署环境。列出此过程中所有外部工具和库的具体版本非常重要,因为部署环境是评估产品安全性的重要因素。良好记录的部署过程使顾问能够在真实环境中运行动态分析工具。
回报
此时,您已将代码、文档和构建环境交给评估团队。所有准备工作都将得到回报。评估团队可以立即开始集成高级分析工具、编写自定义模糊测试工具或应用自定义内部工具,而不是困惑于如何构建您的代码或它的功能。了解您的具体目标将帮助他们专注于您希望他们关注的地方。
安全审查可以产生大量关于产品安全性的见解。拥有明确的审查目标、干净的代码库和完整的文档不仅有助于审查,还会让您对结果质量更有信心。
有兴趣进行安全审查吗?联系我们,了解我们可以为您做什么。
清单
解决简单问题
- 启用并处理每一个编译器警告。
- 增加单元和功能测试覆盖率。
- 移除死代码、陈旧分支、未使用的库和其他无关内容。
文档
- 描述产品的功能、用户、原因以及交付方式。
- 在代码中添加关于预期行为的行内注释。
- 标记和描述测试及其结果,包括正面和负面。
- 包括过去的审查和错误。
交付包含电池的代码
- 记录在完全与内部网络断开连接的计算机上从头创建构建环境的步骤。包括外部依赖项。
- 记录构建过程,包括调试和测试环境。
- 记录部署过程和环境,包括此过程中所有外部工具和库的具体版本。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News