1. 软件漏洞原理和漏洞检测方法
文章目录
- 1. 软件漏洞原理和漏洞检测方法
- 1. 漏洞披露
- 2. 漏洞定义和分类
- 1. 漏洞的定义
- 2. 漏洞的分类
- 3. 漏洞检测方法
- 常见方法
- 1. 程序切片
- 2. 形式化方法
- 1. 符号执行
- 3. 污点分析
- 污点分析步骤/流程
- *污点分析流程的详细介绍
- 1. 识别source和sink点
- 2. 污点传播分析
- 显式流分析
- 隐式流分析
- 3. 无害处理
- 污点分析举例
- 4. fuzzing
1. 漏洞披露
CVE | 漏洞编号, 哪个项目?版本?函数?来个唯一的编号, 不是数据库, 就是个列表 | https://cve.mitre.org |
CWE | 是漏洞的类型, 比如缓冲区溢出?注入?提权?是一个树形的结构给漏洞分类, 想看树图在CWE网站里搜CWE-1000或者其他的view | https://cwe.mitre.org |
NVD | 美国的公开漏洞数据库, 用的是CVE编号, 但是是数据库 | https://nvd.nist.gov |
CNVD/CNNVD | 中国的公开漏洞数据库 | |
CVSS | 漏洞评分, 漏洞的危险程度 | https://www.first.org/cvss/ |
CWE我觉得可以作为很好的学习资料
注意里面对每个CWE编号进行了分类
- P: Pillar - 支柱,通常用于描述更高层次的概念,帮助组织和理解不同类别之间的关系。
- C: Class - 类别,代表一组相似的弱点。
- B: Base - 基础类型,指的是最基本的弱点分类。
- V: variant- 描述在非常低的细节水平上的弱点,通常限于特定语言或技术。
- V: View - 描述一种对CWE的视图, 比如CWE-1000是research view
2. 漏洞定义和分类
1. 漏洞的定义
由RFC2828定义
RFC2828 page 190:
$ vulnerability
(I) A flaw or weakness in a system’s design, implementation, or operation and management that could be exploited to violate the system’s security policy.
和缺陷(defect), bug的区别是, 缺陷和bug这类错误不一定和安全相关, 比如功能上不符合设计, 逻辑不符合设计, 但是漏洞是和安全相关的, 就是这种错误被利用会导致安全问题(i.e. could be exploited to violate the system’s security policy.)
2. 漏洞的分类
就对着CWE看算了
(后来补)注意有种漏洞检测任务里的漏洞叫克隆漏洞, 虽然触发的方式还是按CWE分的, 但是和一般的漏洞检测不太相同, 克隆漏洞指的是一些漏洞在其他软件中被重用了, 导致表现跟原漏洞相同或相似的行为, 很多都是用的相似性漏洞检测的方法
3. 漏洞检测方法
graph TD;
coding(软件编码阶段)
exe(软件运行测试阶段)
s(软件源代码)
b(二进制文件)
sd(
源代码漏洞检测:
1.基于中间表示- 三地址码- PDG/AST- 程序切片
2. 形式化方法- 抽象解释- 符号执行
3. 污点分析
)
bds(
二进制静态检测:
- 基于模式
- 基于二进制代码匹配
)
bdsd(
二进制动静结合:
- 灰盒测试
- 动态污点分析
)
bdd(
二进制动态检测:
- fuzzing
)
defect(软件缺陷: defect)
exception(软件异常和故障: exception / fault)
confirm(漏洞确认)
coding --> s
exe --> b
s --> sd
b --> bds
b --> bdsd
b --> bdd
sd --> defect
bds --> defect
bdsd --> exception
bdd --> exception
defect --> confirm
exception --> confirm
常见方法
1. 程序切片
静态切片: 不考虑程序具体输入, 给定变量, 与其有依赖关系的语句/谓词集合就是静态切片
动态切片? : 考虑给定输入的条件下, 执行路径上对某变量有影响的语句/谓词就是动态切片
2. 形式化方法
Abstract Interpretation | Symbolic Execution | |
---|---|---|
优点 | 快速分析, 保证能终止 | 没有False Positive/Negative (不误报也不漏报) |
缺点 | 避免不了的会有False Positive(误报) | 分析比较慢, 可能不能终止(termination) |
1. 符号执行
不考虑输入的具体值而以符号代替, 用符号进行推导, 最后得到每个路径的到达条件和值, 用约束求解器(现成工具Z3/SMT)进行求解得到可以到达路径的条件和值
举例:
3. 污点分析
污点分析步骤/流程
- 识别sink点和source点: source点(污点源)表示程序外部数据(比如来自文件, 来自网络啥的), 或者用户所关心的程序内部数据, 是需要标记分析的输入数据, sink点(污点汇聚点)是敏感操作, 表示违反数据完整性或者数据保密性的操作
- 污点传播分析, 进行标记: 计算涉及到污点的执行过程, 扩散规则?
- 无害处理: 无害处理就是有些地方污点传播会被截断, 比如数据加密
污点分析就是分析, source能不能到sink, 如果不能就是信息流安全到, 如果能说明产生了隐私数据泄露或者危险数据操作
如果信息从污点数据传播给未标记的数据, 那么需要将未标记的标记为污点数据, 如果被标记的污点数据传递到重要数据区域或者信息泄漏点, 那就意味着信息流策略被违反
*污点分析流程的详细介绍
1. 识别source和sink点
有三种方法:
- 启发式, 把来自程序外部输入的数据统称为source点, 保守的认为含有恶意攻击数据
- 根据机器学习自动标记source和sink
- 手工标注, 重要的API和数据类型标记
2. 污点传播分析
就是分析污点标记数据在程序中的传播路径, 按照分析过程中关注的程序依赖关系的不同, 分为显式流分析和隐式流分析
显式流分析
就是分析变量的数据依赖关系
隐式流分析
就是分析控制依赖传播关系
3. 无害处理
污点数据在传播路径中经过无害处理模块就可以移除污点标记, 比如数据加密, 常数赋值
或者外部输入的数据进行加密, 验证
污点分析举例
int main() {int s1 = source(); // 1 source: 来自外部的不安全数据int s2 = source(); // 2int a = s1 + s2; // 3if (s2 == 1) { // 4int b = 2; // 5}sink(a); // 6sink(b); // 7 sink: 一个敏感操作
}