软件静态分析
2021-10-07 20:30:33 0 举报
AI智能生成
静态分析相关知识
作者其他创作
大纲/内容
编译过程
1.Source Code源码
2.Scanner - 词法Lexical分析-Regular Expression
3.Parser- 语法Syntax分析-Context-Free Grammar
4.生成AST
5.Type Checker - 语义Semantic分析 - Attribute Grammar
6.生成 Decorated AST
7.Translator,生成IR,进行静态分析
8.Code Generator
基本概念
基本块
只有1个开头入口和1个结尾出口的最长3-地址指令序列。
控制流图
控制流边:基本块A的结尾有跳转指令跳转到基本块B;原始指令序列中,B紧跟着A,且A的结尾不是无条件跳转。
抽象语法树
高级,更接近于语法结构,依赖于语言种类,适用于快速类型检查,缺少控制流信息
3-地址码
低级,更接近于机器码,不依赖语言种类,压缩且简洁,包含控制流信息。是静态分析的基础
静态单赋值
给每一个定义变量一个新的名字,传递到接下来的使用当中,每个变量有1个定义(赋值的目标变量)。唯一的变量名可以间接体现程序流信息,简化分析过程;清楚的Define-Use信息。
IR
LLVM IR
VEX-IR
数据流分析
数据流分析的结果:最终得到,每一个程序点对应一个数据流值(data-flow value),表示该点所有可能程序状态的一个抽象。例如,只关心x、y的值,就用抽象来表示x、y所有可能的值的集合(输入/输出的值域/约束),代表了该程序点的程序状态。
基础知识
Nodes (BBs/statements)
Edges (control flows)
CFG (a program)
输入/输出状态:程序执行前/执行后的状态(本质就是抽象表达的数据的状态,如变量的状态)。
控制流约束:约束求解做的事情,推断计算输入到输出,或反向分析。
Forward Analysis前向分析:按程序执行顺序的分析。OUT[s]=fs(IN[s]),s-statement
Backward Analysis反向分析:逆向分析。IN[s]=fs(OUT[s])
may analysis
输出可能正确的信息
(需做over-approximation优化,才能成为Safe-approximation安全的近似,可以有误报-completeness完备性)
注意大多数静态分析都是may analysis;
must analysis
输出必须正确的信息
(需做under-approximation优化,才能成为Safe-approximation安全的近似,可以有漏报-soundness可靠性);
Reaching Definitions Analysis (may analysis)
Definition? D: v = x op y 类似于赋值。
给变量v一个定义d(赋值),存在一条路径使得程序点p能够到达q,且在这个过程中不能改变v的赋值。
检测未定义的变量,若v可达p且v没有被定义,则为未定义的变量。
Live Variables Analysis (may analysis)
某程序点p处的变量v,从p开始到exit块的CFG中是否有某条路径用到了v,如果用到了v,则v在p点为live,否则为dead。其中有一个隐含条件,在点p和引用点之间不能重定义v。
可用于寄存器分配,如果寄存器满了,就需要替换掉不会被用到的变量。
Available Expressions Analysis (must analysis)
程序点p处的表达式x op y可用需满足2个条件,一是从entry到p点必须经过x op y,二是最后一次使用x op y之后,没有重定义操作数x、y。(如果重定义了x 或 y,如x = a op2 b,则原来的表达式x op y中的x或y就会被替代)。
用于优化,检测全局公共子表达式。
属于forward分析。
compare
Reaching Definitions表示只要从赋值语句到点p存在1条路径,则为reaching,结果不一定正确;
Live Variables表示只要从点p到Exit存在1条路径使用了变量v,则为live,结果不一定正确;
Available Expressions表示从Entry到点p的每一条路径都经过了该表达式,则为available,结果肯定正确。
过程间分析
调用图构建
本质是调用边的集合,从调用点(call-sites)到目标函数(target methods / callees)的边。
应用:是所有过程间分析(跨函数分析)的基础,程序优化,程序理解,程序调试。
Class hierarchy analysis(CHA)
Rapid type analysis(RTA)
Variable type analysis(VTA)
Pointer analysis(k-CFA)
过程间控制流图ICFG
CFG表示的是单个方法的结构
ICFG = CFG + (Call edges + Return edges)。
Call edges:连接调用点和目标函数入口
Return edges:从return语句连到Return site(Call site后面一条语句)
过程间数据流分析
Node transfer:与过程内分析相同,对每个调用点,将等号左边部分去掉。
Call edge transfer:传参
Return edge transfer:传返回值
指针分析
指针分析:分析指针所有可能指向的对象。
别名分析:分析两个指针是否指向相同的对象,可通过指针分析来推导得到。
Heap abstraction
Allocation-Site原理:将动态对象抽象成它们的创建点(Allocation-Site),来表示在该点创建的所有动态对象。Allocation-Site个数是有限的。
Context sensitivity
Context-sensitive:根据某函数调用上下文的不同,多次分析同一函数。
Context-insensitive:每个函数只分析一次。
Flow sensitivity
问题:考虑语句顺序(控制流)的影响 vs 把程序当做无序语句的集合。
方法:流敏感会在每个程序点都保存一份指针指向关系映射,而流不敏感则对整个程序保存一份指向关系映射。
说明:目前流敏感对Java提升不大,不过在C中很有效,本课程分析的是Java,所以重点讨论流不敏感技术。
Analysis scope
Whole-program 全程序:分析全程序的指向关系。
Demand-driven 需求驱动:只分析影响特定域的指针的指向关系。
影响指针指向
Static call: C.foo()
Special call: super.foo() / x.<init>() / this.privateFoo()
Virtual call:x.foo()
PFG:用指针流图PFG来表示指针之间的关系,PFG是有向图。
Nodes:Pointer = V U (O x F) 节点n表示一个变量或抽象对象的域。
Edges:Pointer X Pointer 边x -> y 表示指针x指向的对象may会流入指针y。
Edges添加规则:根据程序语句 + 对应的规则。
污点分析
1.信息流安全
访问控制:关注信息访问。
信息流安全:关注信息传播。
信息流:x->y表示x的值流向y。
信息等级:对不同变量进行分级,即安全等级,H-高密级,L-低密级。
安全策略:非干涉策略,高密级变量H的信息不能影响(流向)低密级变量L。
2.保密性和完整性
保密性—信息泄露,读保护;
完整性—信息篡改,写保护。
完整性错误类型:命令注入、SQL注入、XSS攻击、... 。都属于注入错误。
完整性更宽泛的定义
准确性、完整性、一致性。
准确性表示关键数据不被不可信数据破坏;
完整性表示系统存储了所有的数据;
一致性表示发送的数据和接收的数据是一致的。
3.显式流和隐藏信道
显示流:直接的数值传递。由于显示流能泄露更多信息,所以本课程关注显示流的信息泄露。
隐式信息流—侧信道:程序可能会以一些意想不到的方式泄露数据。
covert channels:信道指的是传递信息的机制,原本目的不是为了传递信息的信道。
4.污点分析
Sources & Sink
Sources是污点数据的源,一般是有些函数的返回值,如read();Sink是特定的程序点,某些敏感函数。
保密性:Source是秘密数据,Sink是泄露点,信息泄露漏洞。
完整性:Source是不可信数据,Sink是关键计算,注入漏洞。
CFL可达性&IFDS
Interprocedural,Finite,Distributive,Subset Problem
Infeasible and Realizable Paths
Infeasible Paths:CFG中实际不会执行到的路径,如不匹配的调用返回边。这种路径可能会影响到程序分析的结果,但静态分析不能完全判定路径是否可达。
Realizable Paths:跨函数调用产生的返回边和对应的callsite边匹配,这样的path。
0 条评论
下一页