信息流安全
静态分析中的信息流安全主要考虑的是机密性和完整性
机密性
机密性的主要目的是阻止秘密信息被泄漏。
非推理规则
禁止高密级的信息影响到低密级的信息。
我们为每个变量设置密级,密级是具有偏序关系的格。
当低密级的变量被高密级的变量赋值时,则违反了非推理规则,就会影响到机密性
完整性
机密性主要目的是组织不受信任的信息对系统造成破坏
我们为每个变量设置完整性等级,完整性等级同样是具有偏序关系的格。
低完整性的变量向高完整性的变量进行写入是禁止的。
隐藏信道
在计算系统中标识信息的机制叫做信道,而在传输信息目的以外的信道则是隐藏信道。
隐式流
通过程序控制价格来标识信息特征
if(secret < 0 ){
...
}
终止信道
通过程序的终止与否来标识信息特征
while(secret < 0){
...
}
时间信道
通过运行时间来标识信息特征
if(secret < 0){
wait();
}
异常信道
通过异常来标识信息特征
if(secret < 0){
throw new Exception();
}
在机密性方面,由于显式信道比隐藏信道能够携带更多信息。而完整性方面,隐藏信道的攻击更为困难。因此显式流会被我们更加关注。
污点分析
污点分析是最常见的流分析,其将数据分为污点数据和非污点数据。
污点数据的产生来源被成为源。一般而言,污点数据来自方法的返回值(视为源)
污点分析追踪污点数据能否流到特定的地方(称为汇)
思路
机密性
源:秘密数据的来源
汇:输出点
其目的是避免信息泄漏
x = getPassword(); //source
y = x;
log(y); //sink
完整性
源:不信任的数据来源
汇:重要计算区域
其目的是避免注入错误
x = readInput(); //source
cmd = "..." + x;
execute(cmd); //sink
记号
和指针分析相比,污点分析添加了一种污点数据
\[t_i,t_j\in T \subset O\]$t_i$表示调用点$i$处的污点数据
输入/输出
输入
源:源方法集合(返回污点数据的方法)
汇:汇方法集合(污点数据会影响安全性的方法)
输出
一系列污点流$<t_i, m>$,表示调用点$i$产生的污点数据可能会流到汇点$m$
规则
Call
对于以下语句
l: r =x.k(a1,...,an)
如果调用的方法是源,则有以下规则:
\[l\rightarrow m\in CG\\ \underline{m\in Sources}\\ t_l\in pt(r)\]如果调用的方法为汇,则有以下规则:
\[l\rightarrow m \in CG\\ m\in Sinks\\ \underline{\exist i,1\le i\le n:t_j\in pt(a_i)}\\ <t_j,m>\in TaintFLows\]其他语句
由于污点数据是堆对象的子集,因而对其他语句的规则和指针分析一模一样。