taintCheck的实现
参考:http://bitblaze.cs.berkeley.edu/papers/taintcheck-full.pdf
1. 应用taint analysis需要解决三个问题
a. 哪些input需要被标记为tainted
b. 这些tainted的属性需要怎样被传播到其他的内存中
c. 这些tainted的内存什么情况下可以被视为用于attack
因此TaintCheck是由三个基本组件组成:TaintSeed, TaintTracker以及TaintAssert。
每个组件都定义了自己独立的policy,可以调整检测的力度。
2. taint数据的保存
即怎样表示一段内存是tainted的呢?
对于tainted的内存区域Memory(registers, stack, heap)中的每一个字节,都有一个4字节(DWORD)的指针指向一个Taint Data Structure的数据结构;
而对于正常的内存区域,这个4字节的指针为NULL。
可以预见,tainted的内存区域相对于正常的内存区域要小很多,因此,可以参考页表的管理方式,来管理tainted的内存区域;
而正常的内存区域,其实连NULL的4字节指针也不必保存。
TaintSeed examines the arguments and results of each system call,
and determines whether any memory written by the system call should be
marked as tainted or untainted according to the TaintSeed policy.【通过检查敏感的系统调用(比如socket, read等),根据其参数来确定是否有向内存中
写数据,那些写的数据可以根据policy确定是否标记为tainted】
When the memory is tainted, TaintSeed allocates a Taint data structure that records
the system call number, a snapshot of the current stack, and a copy of the
data that was written.【当一段内存区域被标记为tainted,一个数据结构Taint Data Structure会记录下一些重要信息:
1 系统调用号,可以标记信息的来源;
2 当时stack的备份snapshot,案发现场;
3 写的数据的一个备份】
3. Taint的传播
指令可以分为三类:
1. 数据传输类
2. 算术操作类
3. 其他类
其中,数据传输与算术操作类的指令都能够传播taint属性,前提是源操作数已经被标记为tainted。
字面值的数据,比如常数,字符串是无辜的,因为它们要么是程序的作者指定的,要么是编译器指定的,而不会是外部数据侵入的。
还有一种例外,比如xor eax, eax,指令的输出与输入无关,因此即使输入是tainted,输出也是无辜的。
可以在发现传播时,建立传播链,或者将tainted的内存区域指向同一个Taint Data Structure。
4. Taint的有害性检测
如果一段tainted的内存,被不合法地利用,就可能产生危害。
a. 被作为jump的目标,即程序的执行流被引导到tainted内存区域
b. 被作为format string传给printf族函数,这种情况可能发生format溢出
c. 被作为参数传递给关键的系统调用,比如execve
当上述情况发生时,可以通过之前记录下来的tainted内存区域的链表,找到是哪些输入导致了attack的发生。
taintCheck的实现的更多相关文章
- xsos:一个在Linux上阅读SOSReport的工具
xsos:一个在Linux上阅读SOSReport的工具 时间 2019-05-23 14:36:29 51CTO 原文 http://os.51cto.com/art/201905/596889 ...
随机推荐
- Manacher(最长镜面回文串)
I - O'My! Gym - 101350I Note: this is a harder version of Mirrored string I. The gorillas have recen ...
- seaborn教程3——数据集的分布可视化
原文转载:https://segmentfault.com/a/1190000015006667 Seaborn学习大纲 seaborn的学习内容主要包含以下几个部分: 风格管理 绘图风格设置 颜色风 ...
- Stupid cat & Doge (分形图)
[题目描述] [题目链接] http://noi.openjudge.cn/ch0204/8463/ [算法] 为求等级N下的点的坐标可由几何关系找到其与等级N-1下对应点的关系,然后递归直至所有点的 ...
- JVM(4)之 使用MAT排查堆溢出
开发十年,就只剩下这套架构体系了! >>> 接下来讲解如何设置以及当发生堆溢出的时候怎么排查问题.先看一小段代码: 代码中使用了一个无限循环来为list添加对象,如果采用 ...
- vue动态设置Iview的多个Input组件自动获取焦点
1.html,通过ref=replyBox设置焦点元素,以便后续获取 // 动态设定自动获取焦点按钮 <p class="text-right text-blue fts14 ptb1 ...
- ubuntu开发c/c++帮助文档
1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo apt-get install ...
- 重置zend studio 默认设置的方法[转]
这个方法类似于手机的“恢复出厂设置”的功能,就是将所有的使用记录全部清除,用于解决zend studio使用过程中遇到的各种莫名其妙的问题,可以说是zend studio各种问题的终极解决方法~能够解 ...
- golang指针函数
func main() { a := models.SmsVerify{} a.Id = 100 fmt.Println(a.Id) // 100 test111(a) fmt.Println(a.I ...
- MySQL语句优化方法(简单版)
基础回顾: sql语句是怎么样运行的? 一般来说,客户端发送sql语句到数据库服务器——数据库服务器进行运算并返回结果——客户端显示sql语句运行结果. 在本地运行时以workbench为例,客户端为 ...
- 洛谷P1446/BZOJ1004 Cards Burnside引理+01背包
题意:有n张牌,有R+G+B=n的3种颜色及其数量,要求用这三种颜色去染n张牌.n张牌有m中洗牌方式,问在不同洗牌方式下本质相同的染色方案数. 解法:这道题非常有意思,题解参考Hzwer学长的.我这里 ...