Newtank

个人站

欢迎来到我的个人站~


安全分析

目录

信息流安全

静态分析中的信息流安全主要考虑的是机密性和完整性

机密性

机密性的主要目的是阻止秘密信息被泄漏。

非推理规则

禁止高密级的信息影响到低密级的信息。

我们为每个变量设置密级,密级是具有偏序关系的格。

当低密级的变量被高密级的变量赋值时,则违反了非推理规则,就会影响到机密性

完整性

机密性主要目的是组织不受信任的信息对系统造成破坏

我们为每个变量设置完整性等级,完整性等级同样是具有偏序关系的格。

低完整性的变量向高完整性的变量进行写入是禁止的。

隐藏信道

在计算系统中标识信息的机制叫做信道,而在传输信息目的以外的信道则是隐藏信道。

隐式流

通过程序控制价格来标识信息特征

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\]

其他语句

由于污点数据是堆对象的子集,因而对其他语句的规则和指针分析一模一样。