美文网首页自动化攻防
bsauce读论文:All You Ever Wanted to

bsauce读论文:All You Ever Wanted to

作者: bsauce | 来源:发表于2019-04-09 22:30 被阅读44次

    一、总结:

    主要内容:采用SimpIL语言统一描述DTA和SE过程,并描述其中的挑战。

    挑战:DTA的主要挑战是地址也被污染,控制流被污染,去掉不必要的污染,检测被攻击的时机;

                SE的挑战是符号化内存地址(别名分析),执行路径选择,符号化的跳转地址(如jump tables),处理系统/库调用,优化性能,部分变量符号化mixed execution。

    应用:DTA和SE主要用于未知漏洞检测;自动输入筛选器生成(入侵检测);恶意软件分析;测试样例生成。

    二、DTA 动态污点分析

    1.动态污染策略Dynamic Taint Policies

    (1)污点引入

    get_input(.),污点策略会区别不同输入源,如网络输入(都引入污点),文件输入(配置文件不属于污点)。

    (2)污点传播

    采用命题逻辑来表示。

    (3)污点检查

    目的是检查程序运行时的行为,如跳转地址是否污染,维护程序安全。

    2.典型污点策略

    Tainted jump policy:输入绝不能覆盖返回地址/函数指针。

    缺点:没考虑内存地址是否污染,会错过某些攻击。

    3.DTA挑战与机会

    (1)Tainted Addresses—地址污染

    例如:

    x := getinput(.)

    y := load(z+x)

    goto y

    分析:能够使攻击者跳转到未污染但用户可控区域,反映了tainted jump policy不足。

    改进:tainted addresses policy,若值和地址其一被污染则表示内存单元被污染。Eg,TaintCheck[49]实现该策略。

    真实漏洞示例:tcpdump。

    问题:tainted address policy—过污染问题;tainted jump policy—欠污染问题。

    (2)Control-flow taint—控制流污染

    例如:y与x是控制流污染。

            x := get_input(.)                     

            if x=1 then goto 3 else goto 4

                    y := 1

            z := 42                                     

    分析:若不计算控制依赖,则不能确定基于控制流的污染,导致欠污染。

    问题:DTA不能分析控制流污染,原因是分析控制依赖需分析多条路径,而DTA一次只执行一条路径。

    解决:a.静态分析辅助DTA,静态分析可以计算控制依赖。

                b.启发式策略,根据具体场景决定是否污染。

    (3)Sanitization消毒

    问题:去除不必要的污染。

    方法:a.识别常数函数,如TEMU[7], TaintCheck[49]。

            b.自动识别hash函数-[48],因为hash函数返回值很难污染成指定值。

            c.下标未越界,则可以去污染。

    (4)Time of Detection vs Time of Attack

    问题:监测点/攻击点,检测到之前就已经被攻击,如tainted jump policy。

    问题2:DTA记录信息过少,很难记录返回地址存放位置,以及是否被覆盖。

    示例:DTA难检测整数溢出漏洞。

    工具:BitBlaze[7],离线分析执行路径上的指令序列。

    三、SE符号执行

    原理:采用逻辑公式表示程序执行,一次能描述多个输入的程序行为;get_input(.)返回符号值而非具体值。

    符号执行挑战与机会

    问题:符号内存;处理系统调用;路径选择。

    (1)符号化内存地址

    原理:具体执行时,使用具体值;符号执行时,使用表达式。从符号表达式load时,表示从任何符合条件的地址处load;store到符号地址时,表示能覆盖任何符合条件的地址。

    问题:别名问题,两个内存操作指向同一地址。例如example 7,addr1与addr2都是符号值,可能相等也可能不等。

                    store(addr1,v)

                    z=load(addr2)

    解决:a.去掉符号地址,不重名,如vine[7]。Example 7改写成mem_addr1=v,z=mem_addr2。

            b.用SMT解释所有重名关系,mem1 = (mem0 with mem0[addr1] = v) ^ z =mem1[addr2]。

            c.别名分析—静态分析,alias analysis,弄清两个引用是否指向同一地址。

    相关工作:KLEE采用别名分析+SMT求解器;DART[35]、CUTE[56]只处理线性约束的公式,不能处理一般化的符号引用。

    (2)路径选择

    问题:路径爆炸问题,需路径选择策略,例如,有符号条件的loop不会终止,影响其他路径的探索。

    示例:while(3^n+4^n == 5^n ) { n++; . . . }

    解决:a.深度优先搜索DFS,缺点是可能陷入无终止的loop,需设定循环上限。

            b.concolic testing,concrete execution-CE先生成执行路径,SE跟着路径走,并生成新的具体输入。改进—generational search[36],一次SE生成多个具体输入。

            c.随机选路,防止卡住,如KLEE。缺点是陷入浅层路径,但避免卡在有符号条件的loop。

            d.启发式,探索未覆盖路径。

    (3)符号化跳转

    问题:符号跳转symbolic jump,例如jump tables。

    解决:a.concrete and symbolic (concolic) analysis [56],发现跳转目标。一旦CE执行跳转目标,就用SE执行该路径;缺点是只探索了已知跳转目标,不能保证代码全覆盖。

            b.使用SMT solver,条件取反求解其他路径,缺点是效率低。

            c.使用静态分析,定位所有可能的跳转目标,源码级间接跳转分析一般采用指针分析,二进制级跳转静态分析用于识别跳转目标表达式中哪些值会被引用。Eg,函数指针表。

    (4)处理系统/库调用

    方法:a.函数总结,缺点是需要手动生成。

            b.在concolic testing时,使用上次具体执行的返回值,缺点是有些调用总是返回不同值,如gettimeofday()。

    (5)性能

    问题:执行时间,公式数量,公式长度增长。

    示例:example 9如下,展开后就是x->s+s+s+s+s+s+s+s。

                x := get_input(.)     

                x := x + x                 

                x := x + x                 

                x := x + x                 

                if e then S1 else S2 

                if e2 then S3 else S4

                if e3 then S5 else S6

                assert(x<10) ;           

    解决:a.用更快的硬件;

            b.每个变量赋予不同的name,x1=x0+x0 ^ x2=x1+x1 ^ x3=x2+x2。

            c.识别公式冗余,Bouncer[21]采用启发式识别公式中的共性;[36]采用离线优化公式。

            d.识别独立的子公式,计算过的公式保存于cache中,如EXE/KLEE[16,18]。

            e.使用weakest precondition [26]来计算公式[40]。

    (6)混合执行mixed execution

    方法:部分变量符号化,如server的配置文件不需要符号化(一般不允许改写配置文件),而网络包数据需要符号化。

    相关文章

      网友评论

        本文标题:bsauce读论文:All You Ever Wanted to

        本文链接:https://www.haomeiwen.com/subject/omrafxtx.html