delphi 调用浏览器内核_HFL:基于混合模糊测试的Linux内核漏洞挖掘

61b8008144c55b2678cbd753011edeaf.png

Remarks

Conference: NDSS 2020

Full Paper: HFL: Hybrid Fuzzing on the Linux Kernel

Summary

  • 针对的问题: Linux 操作系统内核安全漏洞的发现需要新技术。
  • 现有解决方案的不足:当前的模糊测试技术难以直接应用于内核安全漏洞发现。
  • 提出的创新方案概述:解决内核安全漏洞发现过程中的三大挑战:1) 具有由系统调用参数确定的间接控制传输,2)通过系统调用控制和匹配内部系统状态,3)推断用于调用系统调用的嵌套参数类型。提出一种基于混合模糊测试技术的内核安全漏洞发现技术。
  • 达到的效果:在最新的 Linux 内核中 ,发现 24 个新型安全漏洞, 漏洞发现速率提高 3 倍以上。代码覆盖率比Moonshine提升15%,比Syzkaller提升26%。

Introduction

Linux其内核庞大导致存在很多未知的漏洞, 而这些内核安全漏洞影响巨大,迫切需要创新的技术提升当前的漏洞发现率 。本文创新发展的混合模糊测试技术,一直是近年来漏洞发现领域的研究热点,技术价值正在逐步展现,值得漏洞挖掘相关研究人员跟踪、掌握该技术,用于现有研究工作中。

本文的主要贡献有:

  1. 第一个可以应用于内核测试的混合模糊测试工具。
  2. 解决内核安全漏洞发现过程中的三大挑战:1) 具有由系统调用参数确定的间接控制传输,2)通过系统调用控制和匹配内部系统状态,3)推断用于调用系统调用的嵌套参数类型。提出一种基于混合模糊测试技术的内核安全漏洞发现技术。
  3. 在最近的 Linux 内核中 ,发现 24 个新型安全漏洞, 漏洞发现速率提高 3 倍以上。代码覆盖率比Moonshine提升15%,比Syzkaller提升26%。

Motivation

混合模糊测试结合了模糊测试和符号执行的优点,避免了各自一定的缺陷,是挖掘二进制漏洞的有力工具。但是在Linux内核的测试上,不论是单独地模糊测试,单独地符号执行,或者是混合模糊测试,都无法取得很好的结果,这是由于Linux内核的机制,比常规的软件有很多特殊的地方。本文总结了三个特定于内核的挑战。

  • 挑战一:为了支持大量的设备,Linux内核中大多数组件都和抽象接口实现层解耦合,一般来讲,接口层用于访问特定功能的实现,这方面与对象编程相似。Linux内核代码中有运行时多态性和编译时多态性,借用C++中的多态概念来分析,运行时多态是指程序运行时才可确定的多态性,主要通过继承和虚函数获得。Linux构建一个函数指针表(抽象接口),其中包含一系列指向具体实现的函数指针,在运行时候,执行某种操作,从函数指针表抓取某个指针,由当时具体的对象类型决定,在编译阶段不能确定系统调用哪个函数,也被称为滞后联编(或动态绑定),典型的例子就是虚拟文件系统。编译时多态性,主要通过重载机制获得。可在执行前,通过静态分析提升测试效果。但是运行时多态性之前没有有效的办法解决。Fuzzer无法用输入的索引值来获取函数指针表中的指针。符号执行也不能解决。
  • 挑战二:利用fuzzing技术测试内核操作系统,一般都是以系统调用作为输入,因为系统调用是用户态和内核态交互的关键。并且内核的系统调用是上下文依赖的,需要在特定的内部状态下。而不考虑上下文依赖的系统调用往往会直接被拒绝,无法进入下一步测试。对于符号执行技术,由于内核的系统状态需要很多数据变量维持,符号执行容易遭遇状态爆炸问题。
  • 挑战三:Linux内核中大量的系统调用的参数都是嵌入式结构,比如某个参数字段的内容指向另外一个结构,这样的嵌入式结构的系统调用的各个参数的语义很难猜测,因此输入很难构造,更难以把输入模板化。

当前的一些内核模糊测试技术并没有很好的解决上述的问题。如下图所示。IMF使用系统调用跟踪来分析系统调用顺序,以期望解决上述挑战二。MoonShine通过静态分析来推断系统调用依赖。DIFUZE通过静态分析来推断完整系统调用参数的类型。这些静态分析的方法无法准确的推断处结果,因为某些参数是须在运行时才能确定的。

0647f3680fbaa8c306f669948cdd9e29.png

Approach

总体来讲,HFL的设计遵循了用户级混合模糊测试技术的设计,将传统的模糊和符号执行结合起来。HFL的总体运行流程如下图所示。HFL的特征有Kernel Syscall Fuzzing,Coverage Guided Fuzzing,Symbolic Analyzer。前面两个特征在内核模糊测试中很常见,就不赘述了。对于Symbolic Analyzer,传统的混合模糊测试中,如何判定fuzzing遇到hard constraint,再切换到symbolic execution,一直是一个难点。在HFL中,其fuzzer通过维护一个频度计数表在测试期间统计用户程序(一系列的系统调用)执行时,条件判断语句的true or false频度,以此来判定程序是否被“卡住”。对于一个用户程序执行过程中,越是先出现的分支判断低频度越要重视,因为他的非条件可能会触发更多的代码覆盖。

b589abb8e5c95f23f6698c43459f7f47.png

针对内核的模糊测试,本文提出了以下解决方法:

  1. 将间接控制转化为直接控制-转换原始内核。
  2. 推断系统调用序列,建立一致的系统状态-缩小变量符号化的范围。
  3. 确定系统调用时的嵌套参数类型-在运行时检索嵌套的系统调用参数。

下面具体讲HFL如何解决Motivation中提到的三个挑战:

  • 把指针的间接控制流转换成直接控制流,HFL提出了一个基于内核源代码操作的offline translator。在保证条件分支语义的同时,将间接的控制流转换为直接的控制流,这样内核底层的调用代码块都可以直接被访问,而不需要在执行时才确定虚函数具体由哪个函数实现。具体做法是:在编译的时候,遍历所有的指令,对于间接控制流,执行以下步骤:(1)离线转换器确保函数指针表的索引变量来源于系统调用的参数,即是由系统调用的参数决定某个功能的实现这种情况,不是这种情况的索引变量对fuzzer执行并无影响。HFL通过执行过程间数据流分析来跟踪系统调用的参数是如何传播,以确定是否需要转换。(2)确定索引的值以后,结合给定的函数表,HFL对每个索引值进行分支变换(类似指令编译优化的循环展开),通过插入一个条件转移到相应的函数指针上。至此,控制流便由间接转为直接,方便fuzzer测试。
  • 为了推断处合适的系统调用顺序和系统调用依赖,HFL首先在内核上进行静态分析,获取可能存在依赖的系统调用组,然后再验证这些潜在的依赖组以筛选出真正的依赖关系。HFL对目标内核进行指针分析(pointer-analysis),收集一对读/写操作,即其中一条指令执行读指令,另一条指令执行写指令,两条指令都是从相同的内存位置读取和写入,这样的读/写操作就被称为候选依赖对。但是pointer analysis存在误报问题,因此在执行内核时,符号化地执行这些潜在依赖项对时,HFL检查他们是否访问相同的地址,这样就能确定是否存在正在的依赖,然后就能确定合适的系统调用顺序。与以往的内核测试不一样的是:HFL除了确定系统调用顺序外,还使用符号约束信息(来自系统调用参数的符号化)来保证那些系统调用参数之间的依赖。HFL的fuzzer和symbolic analyzer之间联系紧密,执行过程中,交互密切,相辅相成,直接测试结束。
  • HFL使用concolic executor和内核特有知识来检索复杂的嵌套参数结构。在嵌套结构中,(1)连接到嵌套输入结构的内存位置和(2)内存缓冲区参数的长度,这两个参数是系统调用构建的关键。HFL在concolic执行时不断监视传递函数的调用,一旦被调用,就检查传递函数的源缓冲区是否收到了符号污染,这样就能确定来自我们感兴趣的系统调用的传递函数,然后就能确认参数指向的缓冲区,HFL使用符号状态来跟踪某个位置的偏移值,最后就能确定内存位置。同时,也可以通过跟踪传递函数的参数值来获得缓冲区的长度。

Reflection

  1. 本文提出的解决方法,对于非内核的二进制程序测试也有帮助,比如大量用c++虚函数实现的多态和继承的二进制程序,比如本身带有大量嵌套结构的二进制程序等,都可以借鉴HFL的方法精神。
  2. 按理来说,先解决前面的分支问题较为重要,但是如QYSM所讲,会出现过度约束问题(导致前面的约束条件满足了,后面的条件约束无法满足,反而会降低代码覆盖率。当后面的函数路径并不依赖前面的分支时,即为过度约束),下面这个例子出自QYSM论文。解决过度约束这个问题的办法就是部分求解约束,即从最后一个条件开始,倒推着求解约束。因此这是一个需要权衡的问题。

78445c95fe620ee67c63e6ac0ddce056.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隔行变色java代码_jquery入门—选择器实现隔行变色实例代码

1、JQuery选择器继承了CSS、path语音的部分语法,允许通过标签名、属性名、内容对DOM元素进行快速、准确的选择。2、JQuery选择器与JavaScript相比,具有代码简单、完善的检测机制的优势。3、使用JQuery选择器实现隔行变色,示例代码如下&#x…

角标越界 Java_【新人求助】利用占位符操作数据库是总是提示数组角标越界是怎么回事 - Java论坛 - 51CTO技术论坛_中国领先的IT技术社区...

用占位符和数组来操作数据库总是提示下角标越界,找了半天也没弄明白哪里有问题,这个地方是跟着云课堂老师的讲解做的,只不过操作的数据表不一样,但是老师那个就没问题,我就出了问题,如果有大神能帮忙看看&a…

简述ospf的工作原理_现代数字存储示波器的工作原理简述

示波器是一种用途十分广泛的电子测量仪器。俗话说,电是看不见摸不着的。但是示波器可以帮我们“看见”电信号,便于人们研究各种电现象的变化过程。所以示波器的核心功能,就和他的名字一样,是显示电信号波形的仪器,以供…

pyecharts 间距_高月双色球20108期:红球首尾间距参考29区段

双色球第2020108期奖号为:03 09 11 24 25 28 16,红球和值:100,重号2个:11 28,首尾间距:25。和值:上期和值为100,上升了22点,再次开出小和值,最近…

java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据

LogXixi用于Android环境,java环境的log打印,可打印任何类型数据,根据android项目环境debug环境自动打开,release环境自动关闭android环境log打印,规范bean对象,json,xml对应log,crash捕捉&#…

xbox手柄接收器驱动_xbox手柄连接 win10电脑

xbox手柄 连接win10笔记本 分为三种连接方式:有线蓝牙无线适配器首先说明一下连接方式的特点然后说明连接方式第一种:有线连接 手柄直接通过micro USB数据线和win10电脑连接。这一步最简单,一般电脑会自动安装驱动,连接之后可以使…

单片机复位后为什么要对sp重新赋值_51单片机系列之2点亮第一个led小灯

点亮led灯简单的理解就是要求阳极高电平阴极低电平。接下来我们去看看单片机的原理图,找到led 模块。如图可以看到led的阳极是连接的VCC(电源高电平)阴极连接的接口是单片机的I/O口P20到P27.要想led点亮只需控制单片机I/O口输出低电平即可(单片机I/O口默认高电平)。…

关机时无人照管更新正在运行_无法抗拒的未来:无人叉车在内部物流中已成为现实...

自动化和半自动化的叉车不再是新奇的东西,在人力短缺的仓库中取得了进展。他们最终会成为规范吗?目前尚不知道全世界有多少辆无人驾驶叉车(也称为自动叉车、机器人叉车或者AGV)售出。但是叉车生产商都显示出,它在该领域的迅速增长。重要的是&#xff0c…

打开浏览器不是主页_对于360浏览器的一些小小改善

​虽然自己不怎么喜欢,但是以前小编的多数同事都在使用它,所以今天带来360安全浏览器改造的小建议。整理&排版 | idea君 ,预计阅读 | 4分钟文章意在学习交流分享,如有侵权请联系删除封面:http://www.pexels.com/zh…

c++ 二次开发 良田高拍仪_六枝特良田LYV-850加工中心导轨配套防护罩日常维修

六枝特良田LYV-850加工中心导轨配套防护罩日常维修我厂生产的防护罩质量可与原厂的一样,同样的保障,质保期为一年,护罩安装不合适支持退换货。尤其是元件连结的接合面刚度,对加工精度影响较大。通常,采用组合夹具时其尺…

atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理

一、JTA组件简介1、JTA基本概念JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。XA协议是数据库层面的一套分布式事务管理的规范,JTA…

crt 8.7.3 黑暗模式_民谣缠绕厄运金属,抒情中的黑暗故事

2020/7/31,瑞典厄运/重金属乐队Dun Ringill,发表了新专辑“Library of Death”。“Library Of Death”是瑞典乐队Dun Ringill的第二张唱片,由The Order of Israfel、Doomdogs等成员发起。乐队的声音,介于重金属和厄运金属之间&…

前窗玻璃膜贴了一周还有气泡_关于车窗玻璃的养护你了解多少?

【中国皮卡网 维修保养】车窗玻璃的养护是最容易忽视的,但它也是非常重要的,虽然在用车过程中我们很少直接接触车窗玻璃,但是它却时时刻刻在影响着驾驶者。相信很多人会有洗车的习惯,洗好之后的车窗玻璃非常明亮,不仅仅…

c语言新龟兔赛跑_幽默 | 新龟兔赛跑

新龟兔赛跑作者 / 何必加自从输给了乌龟后,兔子心里很是生气。这一天,他又遇见了乌龟,要求和他比赛,一定要一雪前耻。乌龟答应了,并且约定连比三场。第一场还是兔子输了,原来他一着急,跑错了方向…

bugku 杂项 就五层你能解开吗_长春老旧小区加装电梯,你家符合条件吗?_媒体_澎湃新闻...

新朋友戳蓝字关注我们哦!长春市老旧小区开始加装外置电梯大家都很关注很多市民也在想我家符合加装条件吗?能申请吗?伴随着长春市朝阳区3个老旧小区加装电梯工作的结束,这项惠民工程也成为了老百姓茶余饭后的谈资,那么大…

vba 指定列后插入列_Excle中的VBA介绍分享

SunYoung1、什么是VBAVisual Basic for Applications(VBA)是Visual Basic的一种 宏 语言,它能使常用的程序自动化,是针对Office开发的一种工具,通俗点讲,VBA是一种Excle能听懂识别的编程语言。2、在Excle中VBA的作用2.1、实现Exce…

php中文歌词,html如何制作滚动歌词

html制作滚动歌词的方法:首先在标签里面写好编码格式,引入css样式和jQuery;然后放置播放器,代码为【】。本教程操作环境:windows7系统、html5版,DELL G3电脑。html制作滚动歌词的方法:首先我们创…

docker run 服务名_在 WSL2.0 的 Ubuntu 18 里使用 Docker

近日,随着Windows 10 2004版本的发布,WSL 2经过了近一年的insider测试,现在也正式上线了。Windows 10 2004中引入了一个真实的Linux kernel,使得系统全部的系统调用更加兼容。这也是首次,Linux kernel安装在Windows系统…

vb.net如何查询电脑麦克风收到声音_EMUI 10.1 跨屏协同实测:这一次把你的手机「搬」进电脑...

智能手机发展到现在,我们越来越需要手机与其他设备进行互联互通。电脑是我们办公最常用的工具,手机则是生活必需设备,这两者的协同需求,自然也就成为了大多数用户的痛点。Apple 用隔空投送、接力、随航等连续互通功能来打造系统生…

gerber文件怎么导贴片坐标_SMT贴片工序

贴片,也称SMT,就是把元器件用贴片机设备贴装在印刷好的PCB板上。贴片这一过程之所以用“贴”字,是因为锡膏内有助焊剂的成分,有一定的粘性,能够在没有熔化的时候,也能够黏住元器件。SMT又称贴片&#xff0c…