当前位置:   article > 正文

[课业] | 软件安全 | 使用Find Security Bugs工具静态分析WebGoat

find security bugs

概念介绍

1. 代码静态分析

  • 代码静态分析是指在不运行代码的方式下,通过词法分析、语法分析和控制流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性和可维护性等指标的一种代码分析技术。
  • 这里的代码包括源代码和二进制代码,因此代码静态分析又可以分为元代码静态分析和二进制代码静态分析。

1.1 代码静态分析的内容

  • 代码静态分析的内容包括代码检查、静态结构分析和代码质量度量等。
  • 代码检查包括代码走查、桌面检查和代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面。
  • 可以发现违背程序编写标准的问题,发现程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和结构检查等内容。

1.2 代码静态分析采用的技术

常用的静态分析技术如下,这些技术之间是相互关联的,有些是层层递进的。

  • 词法分析:从左至右逐字符读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token)流,生成相关符号列表。
  • 语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树。
  • 抽象语法树分析:将程序组织成树形结构,树中的相关节点代表了程序中的相关代码。
  • 语义分析:对结构上正确的源程序进行上下文有关性质的审查。
  • 控制流分析:生成有向控制流图(控制流图,CFG是编译器内部用有向图表示一个程序过程的一种抽象数据结构,图中的结点表示一个程序基本块,基本块是没有任何跳转的顺序语句代码;图中的边表示代码中的跳转,它是有向边,起点和终点都是基本块),用结点表示代码基本代码块,结点间的有向边代表控制流路径,反向边代表可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
  • 数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存相关数据信息。通过静态模拟应用程序的执行路径,帮助用户找到运行时才能暴露的一些严重错误,如资源泄漏、空指针异常、SQL注入及其他的安全性漏洞等潜在的运行时错误。
  • 污点分析:“污点”是指所有来自不可靠数据源的数据,如用户输入、网络等。基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
  • 程序切片:将一个程序中用户感兴趣的代码都抽取出来组成一个新的程序,这个新的程序就是源程序的切片,根据切片规则的不同,生成的切片也各不相同。

1.3 代码静态分析的方法

代码静态分析可以由人工进行,也可以借助被称为代码检查器的程序/工具自动化进行。根据代码可以分为源代码、字节码、目标代码三类,代码静态工具可以分为以下三类:

  • 源代码分析器:用于静态源代码分析的工具。源代码分析器主要使用模式匹配的方法,根据一个已知的漏洞语法、数据流/模型列表或者已知数据样本集合来检测漏洞。
  • 字节码扫描器:用于静态分析中间字节码的工具。
  • 二进制代码分析器:用于静态分析目标代码的工具。也被称为二进制代码扫描器。功能类似于源代码分析器,但是在进行模式匹配和数据分析之前需要对可执行代码进行反汇编,将二进制代码转换为源代码再实施分析。与静态源代码分析相比,二进制代码分析器的主要优点是它可以检测编译器引入的漏洞和无效的代码,因为它是在编译过程完成之后,针对已经编译好的目标代码进行的检测,它也能检测编译过程中链接的库函数。

2. 源代码静态分析的一般过程

源代码静态分析的流程被总结为四个阶段:
请添加图片描述

2.1 确定目标

  • 该阶段主要工作主要包括确定本次审查的安全目标、审查的内容及审查前的准备工作。
  • 确定目标要与风险分析相结合,存在的哪些漏洞会对系统造成较大安全风险,那么这些就是源代码审查的重点。
  • 确定安全目标还需要关注高层领导或者最终用户的期望。
  • 由于大型程序的源代码数量巨大,需要确定被分析代码的优先级。
  • 明确审核范围并排定优先级也需要依据风险评估的结果,以单个程序为单位排定审核优先级。源代码分析人员需要了解所审查代码的功能和用途,分析人员对代码越了解,分析效果就越好。

2.2 运行工具

  • 不同的静态代码分析工具的具体实现和工作原理不同,但是核心都是在规则库的作用下识别漏洞。因此规则库是影响静态分析效果的重要因素,也是静态分析工具选取的主要考查内容之一。
  • 对于安全测试而言,误报可以使用人工检查来排除,但是漏报很难通过人工检查来发现。
  • 除了工具自带的规则库之外,常常还需要根据测试代码的特点来增加自定义规则库。
  • 如果现有的静态工具不能满足使用需求,也可以选择自行搭建自动化的静态代码分析平台。

2.3 报告结果

  • 工具运行完毕后会形成详细的结果报告,还需要分析人员对审查结果进行确认,去除其中的误报。
  • 需要注意的是,不要局限于结果报告,要发现潜在的问题,分析工具经常会在敏感操作代码的位置报告一个问题,其附近代码也可能存在问题,分析人员也应重点关注。
  • 如果发现了一个分析工具没有报告的问题,还要分析如何设定规则才能发现这个问题,将该规则补充到规则库中,并不断完善优化。
  • 源代码分析结果需要在漏洞管理系统中记录下来,通知开发人员进行修复。
  • 分析人员提交的漏洞信息应该是开发人员可以理解的,避免提交的漏洞信息过于专业,以至于开发人员无法理解,修复困难。

2.4 修复漏洞

  • 开发人员需要修复审查人员提交的漏洞,漏洞修复完成后,因进行漏洞可利用性判定,避免出现可利用的漏洞没有被修复的情况。开发人员修复后,审查人员还需要验证修复是否正确。

实验流程

1. 在IntelliJ上安装插件配置规则库

  1. 下载安全漏洞规则库Find-Sec-Bugs。
    请添加图片描述
  2. 安装SpotBugs插件并重启IDE。
    请添加图片描述
  3. 添加漏洞规则库
    请添加图片描述
  4. 设置
    请添加图片描述

2. 下载WebGoat源代码

  1. 此界面选择源代码压缩包下载。请添加图片描述
  2. 使用IntelliJ Idea打开WebGoat源代码项目,选择分析代码
    请添加图片描述

3. 分析结果展示

请添加图片描述

参考内容

  1. 博客:Find-Sec-Bugs 静态代码安全审计安装使用手册
  2. 官方文档:Find-Sec-Bugs IntelliJ Tutorial
  3. 博客:WebGoat安装运行步骤
  4. 教材:机械工业出版社《软件安全技术》
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/514661
推荐阅读
相关标签
  

闽ICP备14008679号