南京大学 静态软件分析(static program analyzes)-- Static Analysis for Security 学习笔记


一、Introduction

Computer Security在信息化时代的作用会越来越重要。

二、Information Flow Security

信息流概念

信息流:x->y表示x的信息流向y(不一定是赋值,还可能是其他的复杂情况,比如x.f=y; x=foo(y); ...)。

信息流在安全领域中的应用

  • 信息等级:对不同变量进行分级,即安全等级;比如将信息分为H高级和L低级等。信息的安全等级可以用格进行抽象。可以类比Linux中的用户权限管理,如root用户和普通用户。
  • 信息流策略:限制信息如何流动。比如,一种策略(非干涉策略)是高等级的信息不能流向低等级。比如Linux中的root用户可以做一切事情,而普通用户不可能访问root用户专有的文件和文件夹。

1、Security Levels (Classes)

2、Information Flow Policy

一种常用的策略是Noninterference policy——高秘密等级的信息不应该影响到低秘密等级的信息。这能够保证攻击者无法通过观测低秘密等级的信息推测出和高秘密等级的信息。

关于最后一个行需要注意,只要攻击者知道了低秘密等级的x和y的值,就能反推出高秘密等级的z的值。因此这样的赋值不应该被允许。

访问控制和信息流安全的概念比较

  • 访问控制:关注信息的访问
  • 信息流安全:追踪信息流动

三、Confidentiality and Integrity

  • Confidentiality(在信息流安全的语境中)侧重于防止攻击者获取到机密信息,即保护关键数据不被攻击者读取。
  • Integrity(在信息流安全的语境中)侧重于防止攻击者通过恶意提权或SQL注入等手段执行了高执行权限的命令,即保护关键数据不被攻击者写入。

在信息流安全以外的语境中,Integrity有更多的含义,完整性更细致的划分:

  • 准确性:关键数据不被不可信数据破坏
  • 完整性:系统存储了所有的数据
  • 一致性:发送的数据和接收的数据是一致的

Integrity

Confidentiality and Integrity

  

四、Explicit Flows and Covert Channels

总体来看,信息在程序中流动有两种方式,

  • 显式流传播
  • 隐藏信道,也叫隐式流传播

explicit flow

显示流:直接的数值传递。

covert channels(implicit flow)

隐式信息流——侧信道(covert channels):通过不是直接的数据流的方式泄露秘密数据的相关信息,比如:

  • 逻辑隐式流传递
  • 布尔信息传递
  • 延时信息传递
  • 报错信息传递

需要注意的是,显示流泄露会泄露更多信息,隐藏信道则可能只泄露有限的信息(比如正负性)。 

五、Taint Analysis

Definition

污点分析是目前应用最广泛的信息流分析技术,将数据分为两类:

  • tainted data
  • untainted data

接着我们定义Source和Sink:

  • Sources of tainted data is called sources. In practice, tainted data usually come from the return values of some methods (regarded as sources) or some var/field.
  • Taint analysis tracks how tainted data flow through the program and observes if they can flow to locations of interest (called sinks). In practice, sinks are usually some sensitive methods.

Taint & Pointer Analysis, Together

在污点分析语境下的指针分析:

  • Treats tainted data as (artificial) objects
  • Treats sources as allocation sites (of tainted data)
  • Leverages pointer analysis to propagate tainted data 

Domains and Notations

和指针分析相比,污点分析在Domain中添加Tainted data。和之前一样,用下标的i和j标识data产生的位置。 

Taint Analysis: Inputs & Outputs 

  • 污点分析的输入:source,sink。
  • 污点分析的输出:污染流,即从source到sink可能会有数据流动(may analysis);比如表示j点的source可能会流入到m点的sink。 

Rules

Taint Analysis: An Example

假设我们这样定义Source为getPassword()方法,Sink为log(String)方法。试着分析以下代码,输出指向关系和TaintFlows集合应该是什么?

定义source和sink

处理call过程时候将Source点返回的污点指针加入指针集合中,

处理指针传递,

处理call过程时候,在Sink点检查指针集中是否包含污点指针,

污点分析结束。 

相关