内核破绽发掘手艺系列(3)——bochspwn-reloaded(1) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

申博_安全防护 申博 99次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

媒介

上一篇文章我们解说了内核double fetch破绽和Project Zero的j00ru开源的这类破绽的发掘东西bochspwn的道理。这一篇文章我们继续解说内核中未初始化致使的信息泄漏破绽和Project Zero的j00ru开源的一样基于bochs的插桩API完成的这类破绽的发掘东西bochspwn-reloaded的道理。状况搭建可以或许直接参考github上的文档,可以或许会碰到的题目也在上一篇文章中有申明,以是就不再赘述状况搭建的步调了。由于内容对照多,以是文章分红两个局部,第一局部基于论文解说信息泄漏破绽和bochspwn-reloaded的设想,第二局部解说bochspwn-reloaded的代码和信息泄漏破绽的别的发掘要领。

为何会形成信息泄漏破绽

内核中信息泄漏破绽的发生重要有两方面的缘由,一是C言语带来的题目,二是内核设想和编程情势带来的题目。

C言语带来的题目

未初始化变量

在C言语中未初始化变量会继续其响应内存地区的旧值。好比下面如许的体系挪用每次就会泄漏栈上的四个字节。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
然则如许单个变量的信息泄漏实在并非很稀有,由于编译器一般会正告,也较轻易在开辟和测试的过程当中发明。在下面如许的体系挪用中构造体中的Reserved成员没有被用到,然则也会被拷贝回用户态,一样会泄漏栈上的四个字节。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

构造体对齐和添补

构造体中的一切成员和悉数构造体都是对齐的。在须要的处所,添补字节被人为地插进去到构造体中。虽然不能在源代码中直接接见,然则这些字节依然继续了响应内存地区的旧值。下面的体系挪用中构造体中的每一个成员都被准确初始化,然则由于存在添补字节,以是依然会形成信息泄漏。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
关于这个题目,有下面这几种解决方案:

  1. 在代码中声明添补字节并初始化。
  2. 设置__attribute__((packed))制止构造体对齐。
  3. 将构造体序列化为字节缓冲区并在另一端反序列化。

1须要消费顺序员大批分外的精神;3可以或许会形成内核机能下落;我预测2多是内核开辟实践中对照好的一个解决方案。

联合体中分歧巨细的成员

若是union由分歧巨细的成员构成并且只设置了较小的成员,未较大成员分派的盈余字节就没有初始化。下面的体系挪用中联合体是8个字节,然则只设置了较小的成员的值,因而剩下四个字节未初始化,形成信息泄漏。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

总结

在前面的例子中我们可以或许看到,sizeof操作符的运用和内核信息泄漏有直接的干系,由于它致使终究复制的数据比初始化的数据更多。更深条理的缘由在于C言语缺乏在分歧条理之间平安传输数据的功用,若是不接纳编译器/操作体系/言语范例如许级别的解决方案,如许的破绽可以或许长期存在。

内核设想和编程情势带来的题目

动态分派中的内存重用

前面几个例子都是重用了栈上的值,在windows/linux中也存在动态分派的内存重用机制,一样会致使信息泄漏的风险

流动长度的数组

大的缓冲区很少被悉数运用,剩下的空间一般不会被重置,这可以或许致使迥殊长的一连的内核内存泄漏。下面的体系挪用中RtlGetSystemPath函数加载体系途径到一个当地缓冲区,若是挪用胜利,一切260个字节都通报给挪用者而不斟酌字符串的实际长度。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

分派缓冲区未悉数初始化

大多数体系挪用吸收指向用户态缓冲区的指针和缓冲区的巨细。在大多数状况下,关于巨细的信息应当只用于肯定缓冲区是不是充足大以吸收体系挪用的输出数据,但不应当影响复制了若干内存。然则内核中存在试图添补用户态缓冲区的每一个字节的而不斟酌要复制的实际数据量的状况。下面的体系挪用目的是提供给用户态3个32位的值,一共12个字节。在搜检用户态缓冲区巨细充足以后,内核正本可以或许分派一个12字节的缓冲区然后拷贝到用户态,然则内核依据用户态传入的OutputLength分派缓冲区并悉数拷贝到了用户态。用户态只须要12个字节的数据,剩下的字节没有初始化并且泄漏给了用户态。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

经由过程CISCN2019 Day 1 SQL注入思索基于运行时毛病的盲注

前言 这次的CISCN WEB题感觉质量还不错。第一天的SQL注入一题,很容易发现服务端的返回有两种,一种是登录失败,另一种数据库操作失败。可以意识到可以盲注,但是与一般的盲注好像不太一样。比较常遇到的是服务端会根据sql语句的逻辑true

bochspwn-reloaded设想道理

shadow memory

bochspwn-reloaded的道理是污点追踪,污点信息记录在bochs历程的shadow memory内存地区中,将每一个字节映射到响应的元数据。在32位体系中,除污点符号以外,元数据还包罗下面这些信息。

  • size:内存分派的巨细
  • base address:内存分派的肇端地点
  • tag/flags:windows体系上是池分派的tag,linux体系上是堆分派的flag
  • origin:要求分派的指令的地点

为了勤俭空间,除taint以外别的信息的粒度由1个byte增加到8个byte。范例、粒度和内存运用状况以下。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
在64位的体系中,元数据还依照32位体系中的构造就不太实际了,以是size,base address和tag/flags就不要了,然则origin照样须要保存的,究竟结果须要跟踪掌握流定位破绽点。origin不再静态分派,改用std::unordered_map<uint64_t, uint64_t> origins透露表现。就算如许taint占用的内存也不可以或许一次分派胜利。在windows体系上不支持Memory overcommitment(分派给假造装备的内存大于它们地点的物理装备的内存),然则可以或许运用非常分派机制完成。
1.运用VirtualAlloc和MEM_RESERVE标记保存shadow memory。
2.运用AddVectoredExceptionHandler函数设置非常处置惩罚顺序。
3.在非常处置惩罚顺序中,搜检被接见的地点是不是位于shadow memory中,并且非常代码即是EXCEPTION_ACCESS_VIOLATION。若是是这类状况,运用VirtualAlloc和MEM_COMMIT标记提交shadow memory并返回EXCEPTION_CONTINUE_EXECUTION。
除设置shadow memory以外,新分派的堆/池用0xaa添补,栈用0xbb添补。这不仅可以或许资助调试,另有助于发明隐蔽的未初始化破绽。

栈污点符号

用伪代码透露表现的栈污点符号的大抵逻辑以下。指令实行前的回调函数标记指令是不是会修正栈指针,指令实行后的回调函数搜检标记,若是栈指针被修正并且ESP变小了,对ESP(new)-ESP(old)做污点符号。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
关于32位的windows体系另有两个题目。
1.在32位的windows体系中有一个内置的chkstk函数,它等价于alloca,相干代码以下所示。高亮的xchg eax, esp将更新后的esp保存到eax中。为此我们须要读取eax寄存器中的值作为origin。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
2.在32位的windows体系中__SEH_prolog4和__SEH_prolog4_GS用来为含有非常处置惩罚顺序的函数建立栈帧,为此我们须要读取[EBP-8]的值作为origin。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

池/堆污点符号

windows x86

在32位的windows体系中函数遵照stdcall挪用商定,即参数存储在栈上,返回值存储在EAX寄存器。windows内核中险些一切的内存分派函数终究都邑挪用ExAllocatePoolWithTag函数,hook这个函数就可以或许取得内核中险些一切内存分派的信息。

windows x64

经由过程RCX,RDX和R8寄存器将参数通报给ExAllocatePoolWithTag函数的参数,当函数返回时可以或许个中的值已被变动。以是须要hook函数两次,第一次读取origin和size,第二次读取base address,依据这些信息做污点符号。
须要迥殊注意的一个状况是内核中特定子体系运用的内核分派器。好比下面是win32k!AllocFreeTmpBuffer函数的伪代码。内存地区只分派一次,并且永久不会开释,然则图形子体系的多个局部会重用它,这对我们的检测晦气。我们可以或许patch代码让它每次都邑挪用AllocThreadBufferWithTag函数。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

linux x86

在linux x86体系中hook了更多的函数,然则道理相似。下一篇文章解说代码时再细致提。

污点消灭

内存被除memcpy外的指令覆写时将消灭污点。污点也可以或许在内存被开释时消灭,好比add esp指令或许挪用ExFreePoolWithTag/kfree等函数时。在bochspwn-reloaded中只对32位的linux/windows完成了内存被开释时消灭污点。

污点流传

当检测到内核到内核的数据拷贝时举行污点流传。

windows x86

在windows内核中存在下面这些拷贝数据的函数:memcpy,memmove,RtlCopyMemory和RtlMoveMemory。在32位的windows体系上,RtlCopyMemory相当于memcpy的宏;RtlMoveMemory基础基于rep movs指令;memcpy和memmove基础上也是基于rep movs指令,然则须要知足下面几个前提:
1.源缓冲区和目的缓冲区堆叠
2.目的指针不是4字节对齐的
3.复制长度小于32字节
4.复制长度不是4字节对齐的
1,2,4这几个前提都对照稀有,对照贫苦的是3,它可以或许会致使内核地点空间中大批较小对象没有被符号污点。解决要领依然是patch代码,将下面cmp ecx, 8改成cmp ecx, 0使得rep movsd指令永久都邑被挪用(一样也要patch memmove函数)。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

windows x64

在64位windows上有两个处置惩罚逻辑。
1.内存拷贝函数不再运用rep movs指令,而是被优化成mov指令和等价的SSE指令的情势。由于它们都有配合的完成,以是在配置文件中设置了memcpy_signature,婚配上了就挪用handle_memcpy函数举行污点流传。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
2.更高的windows版本上越来越多流动长度的memcpy被编译为内联的mov指令序列,而不是rep movs指令或许直接挪用库函数。

linux x86

设置CONFIG_X86_GENERIC=y和CONFIG_X86_USE_3DNOW=n然后以下图所示patch代码,使得一切的memcpy都挪用rep movsd指令和rep movsb指令完成的__memcpy。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)

破绽检测

当检测到内核到用户的数据拷贝时插桩指令检测到含有未初始化的字节就申报破绽。
在linux中,有两个接口可以或许方便地将数据从内核态写入用户态:copy_to_user和put_user。copy_to_user等价于memcpy,相符我们破绽检测的逻辑;put_user许可内核将字符或整数等简朴的数据范例直接写入用户态,在二进制层面数据是经由过程寄存器通报的。这类范例的信息泄漏我们前面通用的破绽检测逻辑就检测不到了。
在代码中我们可以或许看到通报给用户态的数据被存储在名为__x的当地辅佐变量中。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
我们修正这个宏,增加下面两个指令。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
在bochs中prefetcht1和prefetcht2指令由BX_CPU_C::NOP要领处置惩罚。这使得它们成为用作hypercall的重要候选对象——对guest的实行没有任何影响,而是用于与模拟器通讯的特别操作码。在这类状况下,插桩指令检测prefetcht1的实行,把它看成一个旌旗灯号。若是此时读取了未初始化内存,以一样的体式格局申报潜伏的破绽。prefetcht2指令禁用了该旌旗灯号。

浅谈RASP手艺攻防之实战[代码完成篇]

概述 本篇主要讲了简易版RASP实现,所有的环境都可以参考前一篇文章《浅谈RASP技术攻防之实战[环境配置篇]》,再次说明,本文只起到抛砖引玉的作用,仅供参考,文笔不好,大家轻拍。关于其中涉及到的ASM等知识,大家可以来我的博客[Sky’s


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明内核破绽发掘手艺系列(3)——bochspwn-reloaded(1)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址