参考: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的实现的更多相关文章

  1. xsos:一个在Linux上阅读SOSReport的工具

    xsos:一个在Linux上阅读SOSReport的工具 时间 2019-05-23 14:36:29  51CTO 原文  http://os.51cto.com/art/201905/596889 ...

随机推荐

  1. java_第一年_JDBC(2)

    上篇说到,通过JDBC可实现java编程程序和mysql数据库进行连接并交互,而交互后所形成的结果集是通过ResultSet对象来操作的. 创建ResultSet对象: stmt = conn.cre ...

  2. P3452 [POI2007]BIU-Offices(链表+bfs)

    P3452 [POI2007]BIU-Offices 新姿势:链表存图快速删除 显然两个没有直接相连的点要放到同一个集合里 但是直接搞一个图的补图会挂掉 考虑用链表维护点序列 每次bfs删除一个点和与 ...

  3. 详解Twitter开源分布式自增ID算法snowflake(附演算验证过程)

    详解Twitter开源分布式自增ID算法snowflake,附演算验证过程 2017年01月22日 14:44:40 url: http://blog.csdn.net/li396864285/art ...

  4. C#设计模式:原型模式(Prototype Pattern)

    一,原型模式:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建.(包含深度克隆和浅克隆) 主要面对的问题是:“某些结构复杂的对象”的创建工作:由于 ...

  5. supermap idesktop连接oraclesptial数据源

    1.要使用相同的版本,如iServer 9D, iDesktop9D ,32位的 plsql,32位的 oracleinstance_client 11g 2.当时遇到的问题是使用oracleinst ...

  6. 【Leetcode周赛】从contest-51开始。(一般是10个contest写一篇文章)

    Contest 51 (2018年11月22日,周四早上)(题号681-684) 链接:https://leetcode.com/contest/leetcode-weekly-contest-51 ...

  7. XML及XML的解析

    XML的用途 充当显示数据(以XML充当显示层) 存储数据的功能 以XML描述数据,并在联系服务器与系统的其余部分之间传递.(传输数据的一种格式),从某种角度来讲,XML是数据封装和消息传递技术 SA ...

  8. python基础:1.位、字节、字的关系

    1.位,简称b,或bit,比特,数据存储的最小单位.每个二进制数字0或1就是一个位(bit),网络通信常用bps,bit per second ,每秒传输多少位 2.字节,简称byte, 1byte ...

  9. spark的知识的链接

    IDEA 创建scala spark的Mvn项目:https://blog.csdn.net/u014646662/article/details/84618032 Spark详解03Job 物理执行 ...

  10. C#-弄懂泛型和协变、逆变

    脑图概览 泛型声明和使用 协变和逆变 <C#权威指南>上在委托篇中这样定义: 协变:委托方法的返回值类型直接或者间接地继承自委托前面的返回值类型; 逆变:委托签名中的参数类型继承自委托方法 ...