代码审查策略

信息安全 应用安全 代码审查 人工审核
2021-09-09 01:12:07

根据我的信息,进行安全代码审查没有硬性规定,但我们都为此制定了自己的策略。我想知道我们是否都可以分享安全代码审查中涉及或使用的不同策略。

4个回答

正如@sonofaaa 所提到的,在“软件安全评估的艺术”一书中,作者在第 4 章(第一部分结束)中讨论了代码审计策略。

特别是,讨论了外部流敏感性(数据流和控制流)和跟踪方向(向前或向后切片)以及许多中立的审查方法。其他主题进行了非常详细的讨论。这是关于安全代码审查的最佳书面材料。

我还应该提到“使用静态分析进行安全编程”——Fortify Software 的 Brian Chess 和 Jacob West 合着的一本书。它们涵盖了以安全为中心的静态分析工具的内部结构和使用,并将它们与安全代码审查领域中的其他形式/工具进行了比较。

如果您想查看现代以安全为中心的静态分析器,我建议您首先使用一些开源或免费工具,例如 CAT.NET for .NET(通常是 C#、VB.NET 和/或 ASP.NET )、用于 Java Enterprise 和 JSP 的find-sec-bugs (或较旧的 LAPSE+),以及用于 PHP 的 RIPS 扫描器。您通常不会找到支持动态语言的以安全为中心的静态分析器,因为它们不依赖于类型系统,但如果您对支持 Python、Ruby 或其他动态语言(或任何其他动态语言)感兴趣,请告诉我语言),我会尽力为您指明正确的方向。对于初学者,请尝试 Bandit(用于 Python 代码的 OpenStack 项目)和用于 Ruby 的 Brakeman Pro。

以商业安全为重点的静态分析器适用于训练有素的专业应用程序安全开发人员。他们的成本假设有人将作为一项全职工作,全年每天都在运行和分析这些工具。如果您有兴趣看到快速的结果——查看HPFOD——但如果你有兴趣将这些工具集成到一个长期的、有风险的应用程序组合中以进行大型安装——查看Cigital ESP. 还有许多应用程序安全精品店和咨询店为他们的客户运行和调整这些工具。根据您的地区和战略方向,我会选择与其中一个合作伙伴,不管我提到的任何其他内容,因为它们对于 appsec 计划的成功非常宝贵。如果您不知道下一步该去哪里,在 LinkedIn 上搜索“应用程序安全咨询”应该会起作用。

与您的说法相反,我认为(安全)代码审查不应该是一项主要的临时活动。有一些非常强大的方法可以进行有效的代码审查。为了获得最佳结果,这应该以增量和迭代的方式完成。

以下是此类方法的高级大纲示例,其中包含一些指导原则:

  • 了解您的系统(架构、设计……)。使用准备好的问题列表...
  • 确定明确的目标
    • 范围
    • 约束
    • 目标
    • 非目标!
    • 安全问题的类型
    • 时限
  • 分析威胁(例如使用威胁建模)以帮助关注高风险领域
  • 使用自动化工具进行初步扫描
  • 查看复杂/脆弱的部分
    • 复杂代码(例如圈复杂度)
    • 历史漏洞较多的区域
    • 甚至来自自动扫描的许多“误报”
  • 识别所有输入的数据验证
    • 解决信任问题
  • 网页中的数据输出
  • 专门深入审查所有安全机制(例如身份验证、加密等)
  • “有趣”的关口,例如
    • 创建流程
    • 线程和同步(尤其是在静态方法和构造函数中)
    • 资源访问(例如数据访问、文件系统等)
    • 默认代码
    • 提升特权
    • 未经身份验证的访问
    • 联网
  • 语言特定问题,
    • 例如对于 C/C++:缓冲区溢出(堆栈/堆)、整数溢出、格式字符串、动态 LoadLibrary()、“禁止”API 等。
    • 或对于 .NET:InterOp、反射、动态 Assembly.Load()、CAS/完全/部分信任、不安全代码等。

我通常从一个清单开始。说 OWASP 前 10 名或 CERT C 编码指南(或我自己书中的部分!)。我让团队根据清单评估代码,并进行无方向的测试和审查。公开审查中的“热门”问题被添加到清单中,取代了最初存在的非问题。

此外,在可用的情况下使用静态分析工具。

这种方法的好处也是它最大的缺点。清单中的问题很容易被发现,但通常是唯一发现的问题,因为创造性的寻找错误并不容易。

TAOSSA 第 I 部分涵盖了几种方法和混合场景,Brandon Edwards 在此处的视频 (http://pentest.cryptocity.net/code-audits/) 中出色地介绍了与技术无关的审查策略和大型审查的常见缺陷