漏洞挖掘-静态代码分析

静态代码分析

  • 软件源代码的主要安全检测技术
  • 不需要构建代码运行环境,分析效率高,资源消耗低
词法分析
  • 基于文本或标识符的匹配分析对比,以查找符合特定特征和词法规则的危险函数,API或简单语句组合。
  • 工具:Checkmarx、ITS4
数据流分析
  • 分析软件代码中变量的取值变化和语句执行情况,来分析数据处理逻辑和程序的流控制关系,从而分析软件代码的潜在安全缺陷。
  • 适合检查因控制流信息非法传播导致的安全问题,比如内存访问越界,常数传播等。
  • 对于逻辑复杂的软件代码,其数据流复杂,检测准确率较低,误报率较高。
污点传播
  • 分析代码中输入数据对程序执行的影响,以发现不可信的输入数据导致的程序异常执行。
  • 需要标记要分析的输入数据
  • 具有较高的分析准确率,然而针对大规模代码分析,由于路径数量较多,因此其分析的性能会受到较大的影响。
  • 工具:Pixy
符号执行
  • 在不执行程序的前提下,将程序的输入表示为符号,根据程序的执行流程和输入参数的赋值变化,把程序的输出表示成包含这些符号的逻辑或算式表达式的一种技术。通过符号执行技术获得了程序输入和输出之间关系的算数表达式,可通过约束求解的方法获得能得出正常输出结果得到输入值的范围。不能得到正常输入出的输入值,或者输入值范围的安全边界点,则是处罚程序输出异常结果的潜在输入点,也是进行安全监测的重要检测区域。
  • 代价小、效率高。但存在路径爆炸的问题。
模型检验
  • 模型检验技术首先将软件构造为状态机或者有向图等抽象模型,并使用模态、时序逻辑公式等形式化的表达来描述安全属性,然后对模型进行遍历以验证软件的这些安全属性是否满足。
  • 可以实现全自动化,但存在状态空间爆炸的问题。
定理证明
  • 是将待验证问题转化为数学上的定理证明问题,从而判断程序是否满足特定安全属性。
  • 准确率最高,误报率较低。需要人工干预,自动化程度不高。难以用于新漏洞检测和大型程序分析。
  • 工具:Saturn、ESC/Java

可执行代码检测

  • 对可执行代码进行反汇编后检测
  • 分析效率低下,误报率高
  • 分为基于程序结构的安全检测和基于程序语义的安全检测技术
程序结构
  • 从二进制文件的头部,符号表以及调试信息中提取安全敏感信息
  • IDA Pro、Bugscam
程序语义
  • 首先反汇编得到汇编代码,再将汇编代码转换为中间语言,在分析中间语言的基础上针对得到的部分语义信息进行缺陷和漏洞检测。
  • 目前使用最为广泛的两种中间语言是二进制插桩平台Binnavi中使用的REIL,和动态插桩平台Valgrind中使用的VEX
  • 跨平台
  • 逆向分析的三个步骤
    • (先逆向,比如用IDA)找到操作栈的关键函数,比如memcpy、strcpy等
    • 判断栈与操作参数的大小关系,以定位是否发生了溢出漏洞
    • 回溯函数的参数
程序语义

动态安全检测