软件分析笔记7 Security

下面几节课都比较轻松,内容偏科普性质

Security

Achieving some goals in the presence of adversaries

这个概括可以说是很简练了

统计意义下最常见的两类漏洞:

  1. Injection Errors
  2. Information leaks

这两者本质上都是信息流的错误流动,因此就自然引出信息流安全的问题和分析

Information Flow

字面意思....前面指针分析本质上是对数据流的分析,而数据流正是信息流的一种

IF的安全问题在于出现了unwanted infowmation flow,即本应该流向x处的信息流向了y处,举个例子就是本来应该发给plmm的情书一不小心塞进了好基友的书包里....
那么想要保持安全,我们的目标就是阻止非法信息流

Access Control

即对信息上锁,每次获取信息的时候要求通行权限
AC主要关心信息是否被获取,而不关心后续对信息操作的流程。可以认为是点上的安全措施

同样用情书举例,AC就是基友在任何东西进包之前都要检查这东西能不能进包,以此来阻止上述情况

而信息流安全则关注的是不同节点之间的联系以及互动,因此又被叫做端到端的安全措施

Information Flow Security

IFS会(1)把变量分成若干安全等级,并(2)规定流动法则。最简单的分级就是分成高、低安全等级

Security Level

举例中国保密的四级:绝密>机密>秘密>公开
同时等级并不一定是全序的,比如公司内两个部门可以不互通内部信息,但是最高决策者应当看到所有的信息

这意味着我们可以用lattice对等级进行建模

Flow Policy

经典方法是Noninterference policy,它要求"高等级的信息不应该影响(流向)低级信息"
这句话比较抽象,这里的“影响”或许要从信息论的角度来理解。例如a=b+c,若a、b均为低级,则c不能为高级(否则可以通过获取a和b来计算出c的值)

同时还提到了两个概念

Confidentiality

就是要防止机密信息泄露

Integrity

保证Integrity的广义要求是保证数据的准确性(不应被低等级信息污染)、完整性(不应该丢失)、一致性(在传输过程中不应该变化)
狭义地讲,就是要防止危险信息的流入(例如各种注入攻击)

这两种保护可以看成是分别对读/写的保护

泄露的情况又分为两种

Implicit Flow

考虑如果H信息对程序的控制流产生了影响,且这段受影响的控制流有着对L信息的不同的副作用,那么显然可以通过监听L信息的变化来判断控制流的流向,并间接推断出H信息

例如这样一段代码

switch (high) {
	case 1: case 2: {
		low = 0;
		break;
	}
	case 3: {
		low = 1;
		break;
	}
	case 4: {
		low = 2;
		break;
	}
	default: {
		low = 3;
	}
}

只需观测low即可得到high的信息

Convert/Hidden Channels

在计算机系统中传输信息的组件被称为信道(channels)
如果某段代码本来目的并不是传输信息,但最终它传递了某种信息,则称为这是一个隐藏信道

PPT给了四个例子

Implicit Flows

通过控制流泄露信息

if (high < 0) low = 1;
else low = 2;

Termination Channels

通过是否结束(运行状态)泄露信息

while (high<0) {...}

Timing Channels

通过运行时间泄露信息

if(high>0) SPEND_A_LONG_TIME();

Exceptions

通过异常泄露信息

if (high>0) throw new Exception("exception");

此外还有很多,一些听起来就很牛逼的比如观察缓存命中率来推断一些关键信息(这个要怎么做啊好想知道啊看起来好好玩啊洗礼太洗礼太)

通过对比explicit flow和implicit flow我们可以发现

  1. explicit flow泄露的信息不会更少(毕竟全露了)。举例就是在if的控制流泄露中,implicit只泄露了1bit的信息量
  2. implicit flow很难实现数据的更改,往往只能获得信息
    因此目前的主要研究对象就是显式流的规避

Taint Analysis

污点分析首先对数据分类:感兴趣的数据则打上标记,否则没有标记
然后将一些函数/方法标记为source,表示污点数据会以函数的返回值进入程序
将一些方法标记为sink,表示这些是我们关注的关键部分
那么这个分析要回答的问题就是:是否有污点数据从source流向了sink?

可以类比一下动物学中的标志法求群体迁徙路线...

posted @ 2021-08-08 22:42  jjppp  阅读(72)  评论(0编辑  收藏  举报