参考: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. 提交代码到github

    1. 下载git 点击download下载即可.下载地址:https://gitforwindows.org/ 2. 注册github github地址:https://github.com/ 一定要 ...

  2. [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)

    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...

  3. 基于Idea从零搭建一个最简单的vue项目

    一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...

  4. window下 nginx 80端口被占用

    问题:启动nginx没有反应,查看日志提示 bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in ...

  5. Ajax爬取豆瓣电影目录(Python)

    下面的分析相当于一个框架,搞懂之后,对于类似的文字爬取,我们也可以实现.就算不能使用Ajax方法,我们也能够使用相同思想去爬取我们想要的数据. 豆瓣电影排行榜分析 网址:https://movie.d ...

  6. Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)

    在异步请求中要返回文件流,不能使用JQuery,因为$.ajax,$.post 不支持返回二进制文件流的类型,可以看到下图,dataType只支持xml,json,script,html这几种格式,没 ...

  7. Error- spark streaming 打包将全部依赖打进去Invalid signature file digest for Manifest main attributes

    spark streaming 打包将全部依赖打进去,运行jar包报错:如下 Exception in thread "main" java.lang.SecurityExcept ...

  8. python常用函数 P

    popleft(iterable) 对应pop,左侧弹出,队列适用. 例子: permutations(iterable, int) itertools的permutations方法可以产生集合的所有 ...

  9. 在IDEA中如何将Spring boot项目打包成可执行的jar包并发布到linux服务

    这两年微服务很流行,这里简单介绍一下如何将自己使用idea写的微服务打包成一个可执行的jar包,并发布到linux服务器的步骤.因为spring boot有内置的tomcat所以一般使用内置的tomc ...

  10. web安全—tomcat禁用WebDAV或者禁止不需要的 HTTP 方法

    现在主流的WEB服务器一般都支持WebDAV,使用WebDAV的方便性,呵呵,就不用多说了吧,用过VS.NET开发ASP.Net应用的朋友就应该 知道,新建/修改WEB项目,其实就是通过WebDAV+ ...