这是我最后一次抄ppt了(认真脸)
0x01 安全
信息安全基本功,(完整性、保密性、可用性)...
首先讨论一个基本问题,什么是安全:
Achieving some goals in the presence of adversaries
在有敌人的情况下仍要达到某个特殊目标
在cyber世界, 我们的坏人不言而喻, 我们的目标保护我们的计算机系统在有坏人的情况下还能正常运行,而且数据不会泄露。
我们来关注注入问题和信息泄露问题,为啥呢? 因为他们属于一大类问题: 信息流的问题。
0x02 信息流安全
在一个wechat登录界面中, 密码是一个敏感信息, 合法的信息流动是将密码从客户端流到服务器(可信赖一方)。
如果敏感信息流到了怀仁手上,是我们不想要的。
如何保护保护信息呢?
最常用的手段是访问控制(Access Control), 应用程序需要有授权才能访问一个信息, 它关心的是信息任何被访问。 但是信息一旦被访问, 如何操作就不在其管辖范围。
而信息流安全(Information Flow Security), 会追踪信息的流动, 保证程序以安全的方式处理这些信息。 关注的是信息是如何传播的, 在端到端之间的信息流动中保证数据的安全。
所以说一个实际的信息系统,想要保护信息安全,就既要有访问控制机制,又要有信息流安全检查[1]。
什么是信息流
Information flow: if the information in variable x is transferred to variable y, then there is information flow x->y [2]
信息载体(变量x),传入了y, 这就是系统中的一个信息流动。
信息流和Security结合
要考虑信息流和安全结合起来, 需要考虑两点, 第一我们就要给信息流的载体,变量进行一个安全分级, 第二点我们需要在安全等级的基础上制定信息流动的策略。
Security Levels
最简单说是将变量分为两级:
H, meaning
high
security, secret information (秘密信息)L, meaning
low
security, public observable information (系统以外可已观测到的)
以上代码 broadcast(l)就是可以被广播出去的信息, h就是不能被信息系统之外不允许被观测到的。
这种安全等级可以抽象为格来表述的[3]。
格可以很复杂, 而且它可能不是线性上升的。
现在有了安全等级分类, 下一步就是制定策略
Information Flow Policy
信息流安全策略是限制这个信息流如何在不同安全等级中进行流动的。这里介绍一种不干涉策略(Noninterreference policy)[4], 他的思想是:
高安全等级的变量不能影响到信息流中地安全等级的变量。就是说你不能够在信息可观测的底安全等级变量中,观测到高安全等级信息。
嗯...
看这些例子, 总之,高密集变量不能赋值给地密级遍历中。
就是保证格上始终是按照边上升的
0x03 Confidentiality(保密性) and Integrity(完整性)
从信息泄露的角度讲,需要阻止的信息流是从高到低, 但是完整性与保密性正好相反, 他要阻止的是从低安全流向高安全从而破坏高安全信息的完整性[5]。
完整性涵盖了一大类漏洞,如注入漏洞, 注入漏洞...还是注入漏洞。
从而可见, 保密性和完整性是信息流安全中的一体两面。 如此, 我们可以用一种手段解决这两种问题。
扩展安全性概念
完整性要保证数据在信息系统中的准确性(accuracy)、完全性(completeness)、一致性(consistency)
Accuracy
可信的关键数据应该不被污染(操作才能正常, 如信息流安全中的各种注入)
Completeness
数据库应该存储所有完整的数据
Consistency
文件传输系统发送方和接收方内容必须一致。
完整性需要保证整个系统运行是正确的。
0x04 显式流(Explicit Flows)和隐藏信道(Covert Channels)
该部分讨论了信息流中,信息的传播方式,所有的流都是显示传播的吗(沿数据流图传播)。 当然还有侧信道(隐藏信道)或者隐式流。
控制流可以被敏感信息影响, 通过控制流的方式去泄漏信息。
以上例子是一些隐藏信道[6]。
Implicit flows: 隐式流, 不是为了传递信息,仍然能够利用控制信息传递出敏感信息。
Termination channels: 终止信息, 通过程序是否终止传递敏感信息
Timing channels: 时间通道,根据运行时间的区别,获得隐藏信息
Exceptions: 通过异常泄露数据
...
虽然隐式流比较难以发现, 但是隐藏信道泄露出的数据往往是有限的。
0x05 Taint Analysis
污点分析是目前大量使用的信息流安全问题的分析方法。
思路:将数据分为两类, 其中将关注的一类数据打上标记,关注这些数据的传播。
source
污点数据的源头, 污点数据的来源往往是某些特定方法的返回值。
sink
污点分析关心的是,从source打上标记的污点数据,是否会流向特殊的sink。
两个例子:
Taint and Pointer Analysis, Together
2017年的P/Taint论文正式提出要将指针分析和污点分析结合起来[7]。
污点分析本质上是追踪程序中的污点数据, 而指针分析的本质上是跟踪程序中的抽象对象如何在程序中流动。
那么我们就可以看作一类问题:
- Treat tainted data as (artificial) objects ---> 将污点数据看作一类特殊的object
- Treats source as allocation sites(of tainted data) ---> 将source看作是敏感数据的allocation site
- Leverages pointer analysis to propagate tainted data. ----> 借助指针分析追踪污点数据
那么通过上下文不敏感指针分析为例,来改造成一个污点分析。
Define
Domain:
在指针分析的Domain(varibales, Fields, Objects)的基础上加入一类Tainted data。 (ti表示来自于程序中call site i中的数据)
(可以右边图中看到原先指针分析中的All objects(堆上的object), 现在分为两类,tainted data也看作一个T字头的objects。。。)
Inputs:
Source: 一类方法关注他的return
Sink: 另一类方法, 关注他的参数中是否传入了taint
Outputs:
- TaintFlows: 输出一个集合, 元素是<ti, m>这个pairs, 表示在call site i处会有一个污点数据t,将流到sink方法m当中。
Rules
污点分析借助指针分析做的,
0x06 使用Datalog实现污点分析操作
Datalog
简单说一下Datalog是一门逻辑声明式编程语言,他的操作元素是一系列的谓词(predicate),为此中是一个一个的fact。最初输入的谓词叫做EDB, 而推出来的是IDB。而对于谓词逻辑推导叫做Rules,Rules左边是头部,通过一个一个的原子操作(包含relational和arithmetic)复合逻辑运算(逗号是与,还有或非)得到头部(头部可以是多个谓词)。
1 | // symbol declare |
上文就是使用souffle实现的图示的datalog关系,可以看到灰常的直观,那么他的输出IDB为:
以为datalog支持谓词推出自己的facts(递归), 因此支持很多复杂的操作, 如指针分析:
如上是一个简单的过程内指针分析, 它的推导出的内容:
看和表中是一毛一样。
然后再演示一个过程间的:
目标代码中,为了处理第五行里的call, 需要4个东西:
Dispatch:
EDB需要增加
- VCall(l:S, x:V, k:M) 记录l点的call方法k, x接收
- Dispatch(o:O, k:M, m:M) 记录Dispatch到的方法
- ThisVar(m:M, this:V) 记录方法中的this
IDB需要增加
- CallGraph(l:S, m:M), l点的call
- Reachable(m:M), 记录可达方法
传参数
EDB增加:
- Argument(l:S, i:N, a:V), l点的调用的实参列表
- Parameter(m:M, i:N, p:V), 形参列表
传返回值
EDB增加:
MethodReturn(m:M, ret:V), 方法的return
CallReturn(l:S, r:V), 接受返回值
污点分析还需要改点。
reference
[1] A practical system needs both access and flow control to satisfy all security requirements. -- D.Denning, 1976
[2] Dorothy E.Denning and Peter J.Denning, "Certification of Programs for Secure Information Flow". CACM 1977
[3] Dorothy E.Denning, "A Lattice Model of Secure Information Flow". CACM 1976
[4] J.A. Goguen and J.Meseguer, "Security policies and security models". S&P 1982
[5] Ken Biba, “Integrity Considerations for Secure Computer Systems”. Technical Report, ESD-TR-76-372, USAF Electronic Systems Division, Bed-ford, MA, 1977.
[6] Butler W. Lampson, “A Note on the Confinement Problem*”. CACM 1973.
[7] Neville Grech and Yannis Smaragdakis, “P/Taint: Unified Points-to and Taint Analysis*”. OOPSLA 2017.