【bsauce读论文】Razzer:Finding Kernel Race Bugs through Fuzzing-S&P-2019


1. 摘要

目标:挖掘竞争漏洞,如CVE-2016-8655, CVE-2017-2636, CVE-2017-17712。

问题:race漏洞受到系统不确定行为的影响,如线程调度与同步机制。

技术:静态分析定位可能引发竞争的代码;确定性的线程交错技术,控制线程调度,提供准确的并行执行信息,降低不确定性。

对比:Syzkaller[42],SKI[16]。

结果:发现30个竞争漏洞,16个已确认。

2. 问题与设计需求

(1)数据竞争定义

    若两条指令满足以下条件则为数据竞争:

            a.访问的内存地址相同

            b.至少其中一条指令是对内存的写

            c.两条指令可以并发执行

(2)标记

标记

(3)竞争案例—CVE-2017-2636

        两个线程分别调用ioctl(fd,TCFLSH)和write(fd,…),对变量n_hdlc->tbuf的并发读写导致竞争(n_hdlc->tbuf = NULL;与tbuf = n_hdlc->tbuf;),该内存地址在free_list中保存了两次,最后ioctl(fd,TCXONC)将导致double free。

Fig1-竞争案例—CVE-2017-2636 

(4)设计要求

R1——找到执行RacePair_cand的输入程序。即找到一个多线程的用户态程序,每个线程能够在内核态分别执行到RacePair_cand的指令。需求1把问题做了简化,并不去考虑并行执行的问题,就不用考虑线程调度对分析的影响。

R2——根据R1输入程序,找到并发执行RacePair_cand的线程执行序列。需求2主要是去寻找一个交错执行的线程调度方案,使得RacePair_cand的指令能并行执行。

3. 设计

    整体流程如图:

Fig3-Razzer总体架构

3.1静态分析—识别RacePair_cand

方法:指向分析(寻找内核中对同一个结构体的内存访问),但限制是准确率与性能,需要精确的CF/DF信息(运行时更准确)和并发信息(受到调度和同步原语的影响)。指向分析的时间开销是O(n^3)。

Razzer改进

(1)准确性

        采用指向分析得到近似的RacePair_cand(上下文敏感、流敏感、区域敏感),后续通过动态分析来确认。去除不会引起竞争的指令,例如访问结构中不同变量。

(2)性能

        分部分分析,减小分析的代码量。作者按目录结构划分模块,如kernel, mm, fs, drivers,但有些模块如fs和net/core会被每个模块调用。

缺点:未分析同步原语如read_lock(), br_read_lock(), spin_lock_irqsave(), up(),该分析可以排除不会引发竞争的内存对。

3.2 线程调度-hypervisor

方法:待Fuzz的内核运行在虚拟化的环境中,为了控制虚拟CPU的调度,作者修改了虚拟环境的Hypervisor,增加了三个功能。

(1)为每个虚拟CPU设置断点

超级调用接口:hcall_set_bp(vCPU_TD, guest_addr)。由虚拟机guest kernel调用,监管者收到后在guest_addr地址下硬件断点。

两点要求:

        a.准确设置每个vCPU的断点:断点地址存入virtualized debug register,每个vCPU有一个VDR,就能保证只有相关vCPU执行时才会触发断点;设置Intel VT-x中Virtual Machine Control Structure (VMCS)的中断表的相应位(硬件断点中断),就能保证VMEXIT事件首先交给监管器而非guest kernel。

        b.确定断点是否被指定内核线程触发:有可能是其他无关线程触发,利用virtual machine introspection(VMI)获取内核线程上下文,找到线程号,也即通过thread_info -> task_struct -> 内核线程号,确定是否被指定内核线程触发。

(2)控制线程执行顺序

        Hcall_set_order(vCPU_ID),恢复指定线程执行,不同的执行顺序决定是否触发错误。

(3)检测竞争结果

检查竞争指令访问地址是否相同,相同则为RacePair_true。

3.3 多线程fuzz

(1)单线程fuzzing

目的:生成单线程程序,执行RacePair_cand。

generator:生成单线程用户程序P_st—随机syscall序列。

                两种策略:一是generation,使用syzkaller[42]定义的syscall语法(含参数值范围),生成随机调用序列,传递调用参数;二是mutation,对已有的P_st进行drop/insert/change。

executor:执行P_st。

            a.用KCov[3]收集执行覆盖路径,看是否有2个syscall执行RacePair_cand指令;

            b.记录这2个syscall+RacePair_cand在syscall中地址+P_st,发送给多线程fuzzing。

            反馈:若某个P_st产生新的路径覆盖,则作为反馈加入到变异种子队列。

(2)多线程fuzzing

目的:生成多线程程序,触发竞争。

generator:P_st→P_mt,转化为一个多线程版本P_mt。在转换过程中还会进行一些插桩,与Hypervisor协作控制程序的调度。输入P_st,i(syscall下标),j,RP_i,RP_j(竞争指令地址)。

executor:运行P_mt,检测RacePair_cand是否触发竞争。

            判断条件:a.捕捉到2个断点RacePair_cand;b. RacePair_cand指令访问地址相同。

            razzer竞争检查:使用lockdep[29],KASAN[2],或手动插入assertion。

            反馈:导致竞争的P_mt用于进一步变异,以触发崩溃。

4.实现

4.1 静态分析

        基于LLVM+SVF[39]。

        改进SVF—指向分析:处理内核内存分配/释放;处理堆/全局结构中的非指针变量。

        输出:RacePair_cand(含源文件名+行号),编译利用GCC的调试信息将之转化为二进制地址。

4.2 hypervisor

        基于QEMU+KVM(kernel-based Virtual Machine)硬件加速;

        Capstone[1]反汇编来检查RacePair_cand;

        fuzzer基于Syzkaller[42]。

4.3 代码量

        SVF静态分析—638 LoC C++;

        QEMU实现hypervisor 652 LoC c;

        Syzkaller实现fuzzer 6403 LoC Go和286 LoC。

5.评价

(1)发现的竞争漏洞,竞争漏洞列表见Fig6。

        能发现很老的洞,2007,见Fig8。

        Report对于漏洞修复帮助很大

(2)静态分析有效性

        分部分分析效率很高见Fig9,整体分析耗时7天。

        RacePair_cand有效性,有效引导到低于0.1%的可疑竞争点。

(3)hypervisor性能开销

        hypercall开销很小,见Fig12。

(4)与syzkaller/SKI工具进行比较

        找单线程输入程序:执行速度慢于syzkaller,但找有害竞争快于syzkaller。

        找多线程交错程序:由于SKI不开源,所以根据SKI随机线程交错特性实现SKI_Emu—修改Razzer的多线程fuzzing部分(不使用hypercall),效率明显高于SKI。

6. 未来工作

(1)优化静态分析

        本文假设不同内核模块之间很少有竞争,分部分分析导致错过很多RacePair_cand;提高静态分析的准确性,以识别不会竞争的指令对,可分析同步原语[14,41](如read_lock(), br_read_lock(), spin_lock_irqsave(), up(),该分析可以排除不会引发竞争的内存对)。

(2)扩展性

        移植到别的OS,如Windows/MacOSX/FreeBSD。

        扩展到用户程序分析,用户程序不需要其他变异策略,因为用户程序竞争和内核不一样,只要发生竞争都算作漏洞。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容