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 ...
随机推荐
- TCP协议分析(包结构)---转
TCP首部格式 tcp数据是被封装在IP数据包中的,和udp类似,在IP数据包的数据部分.tcp数据包的格式如下: 源端口号和目的端口号(寻址)与udp中类似,用于寻找发端和收端应用进程.这两个值加上 ...
- mybatis where 中in的使用
当我们使用mybatis时,在where中会用到 in 如: where name in ('Jana','Tom'); 我们可以在sql中直接写 name in ('Jana','Tom') 或者 ...
- js的预解析和作用域
预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...
- 基于mesos 安装 jenkins
mesos master 机子上安装 jenkins git clone https://github.com/jenkinsci/mesos-plugin.git && cd me ...
- Tesseract-OCR识别中文与训练字库
转自:https://www.cnblogs.com/lcawen/articles/7040005.html 关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试 ...
- 二、TortoiseSVN 合并、打分支、合并分支、切换分支
一.合并 点击Edit conflict来编辑冲突: 在合并后的枝干对应栏中编辑后,Save保存后关闭. 二.TortoiseSVN 打分支.合并分支.切换分支 1.SVN打分支 方式一:先检出,再打 ...
- 一、RabbitMQ安装与测试连接
一.下载NuGet支持的RabbitMQ.Client客户端库与安装RabbitMQ服务. 1.安装客户端库操作服务. 2.安装服务. 步骤一.下载Erlang. 步骤二.下载RabbitMQ服务 采 ...
- 不小心执行 rm -f,该如何恢复?
每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库.日志 ...
- sass-RGB颜色函数-RGB()颜色函数
在 Sass 的官方文档中,列出了 Sass 的颜色函数清单,从大的方面主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数,比如说 adjust-color 和 ...
- Center os6.5设置静态ip
DEVICE="eth0"BOOTPROTO=staticHWADDR="00:0C:29:95:89:35"IPV6INIT="yes"N ...