免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 系统安全 > 利用Windows用户模式回调机制实施内核攻击(3)

利用Windows用户模式回调机制实施内核攻击(3)

时间:2012-05-05 22:02来源:未知 整理:寂涯网络 点击:



2.2用户对象锁
用户对象采用引用计数方式,以跟踪每个对象是否还在使用或者已经从内存中释放。在 内核离开用户关键段区时,那些被视为有效的对象必须上锁。通常,系统中提供两种形式的 锁:线程锁和任务锁。
线程锁。线程锁主要用在某个函数内对某些对象或缓冲区资源的锁定。每个线程锁单元 节点存放在一个线程锁(win32k !_孔)结构中,此结构采用单链表形式组织,由线程信息结 构体(THREADINFO. ptl)指向。线程锁队列节点的操作非常类似FiFo队列。Win32k系统,线 程锁通常都是以内联函数方式实现,在111函数被调用时,可以通过内联指针方式增加引用, 当给定的函数不在需要此对象或缓冲区时,它会调用作threadUnlock()函数,从线程锁列表中移除锁节点。若事件调度时,对象没有正常释放(如在处理用户模式回调时,进程意外结 束),此时Win32k会操作线程锁链表,释放此线程使用的所有对象单元,即在xxxdestoryThreadInfo函数中调用DeatroyThreadsObjects实现。Win32k中的线程上锁与释放过程如下:
mov ecx, _gptiCurrent  
add ecx, tagTHREADINFO. ptl ; thread lock list  
mov edx, [ecx]  
mov [ebp+tl. next], edx 
lea edx, [ebp+tl]  
mov [ecx], edx ; push new entry on list 
mov [ebp+tl. pobj], eax ;window object
inc [eax+tagWND. head. cLockObj]  
push [ebp+arg_8]  
push [ebp+arg_4]  
push eax  
call _xxxDragDetect@12  ;xxxDragDetect(x, x, x)
mov esi, eax  
call _ThreadUn1ock1@0  ThreadUnlockl()
任务锁。此锁通常用在对某些用户对象的长期锁定。如:在桌面系统内部创建一个新窗 口,win32k会采用任务锁对wind0w对象结构体的某个适合位置锁定此桌面对象。并不像线程 锁,需要操作一个锁队列,任务锁单元仅仅是一些存放在内存中的指针(指向锁定的对象)。 若一指针占用了win32k需要锁定某对象的位置,系统会在锁定此对象前释放已存在的任务锁单元,并用新产生的锁替换。句柄管理器为任务锁的锁定与释放提供了一些函数,如在锁定 某对象时,win32k调用HMAssignmentLock (Address, Object)函数分配锁并增加对象的引用计数以及函数HMAssignmentUnlock(address)释放对象的引用。尤其是,任务锁并不会像线程锁一样提供安全网,在回调机制中若一个线程结束后,线程或用户对象的清理函数会各自独立负责释放这些引用。若此类操作失败,且对象的分配可重复任意的执行,则将导致内存泄露或引述计数溢出。
Windows对象Use-After-Free漏洞,对系统设置一个基于cbt hook钩子时,应用程序可接收到各种通知消息如windows窗口事件、键盘与鼠标输入事件以及消息队列事件等。如, 在一个新窗口创建之前,此HCBT_CREATEWND回调机制允许应用程序检查并修改正在使用的一些 参数。其中,结构体cbt_createwnd可决定窗口大小和方向,允许应用程序通过此窗口的句 柄值可对hwninsertafter参数进行修改,以改变窗口在z序列中的位置。在设置此句柄时,hwninsertafter函数获取相应的对象指针,而后在将新窗口加入到2序列链之后使用它。 但是,当此函数未成功占有此指针时,攻击者可以在子序列回调时强迫Win32k在回调函数返 回时操作已经释放的内存来销毁由hwndinsertAfter参数提供的窗口。xxxCreateWindowEx 函数在调用pwinsertafter函数,获取windows对象指针即(^^. cbt.hwndInsertAfter对应的窗口对象指针后,函数会保存此指针在一个局部变量中,但并没有将其作为互斥资源保护,如图 1所示:
.text:BF892EAl push [ebp+cbt.hwndInsertAfter]
.text:BF892EA4 call _PWInsertAfter04 ; PWInsertAfter(x)
.text:BF892EA9 mov [ebp+pwndInsertAftGr], eax ; window object
图1.从cbt结构体中获取windows对象
由于xxxCreateWindowEx 函数并没有对象指针通过“锁”来进行保护,故攻击者可以在 随后调用的钩子函数中通过调用destroy销毁cbt.hwndinsertafter所指向的窗口,那 么该窗口的窗口对象就会被销毁,此时函数xxxCreateWindowEx 的局部变量保存的窗口对象 指针在调用linkwindows时实际指向的是一块已经被释放了的内存。那么在linkwindows函数中就会触发Use-after-free漏洞,此漏洞允许攻击者在内核上下文中执行任意代码。实际上, 在调用 PWI ns ertAft erSl 调用 LinkWindow 间,xxxCreateffindowEx还要为创建窗口进行很多 其他的操作,在此期间还会回调已经注册了的其他类型的用户模式钩子函数。如图2所示:

本页地址 http://www.jybase.net/xitonganquan/20120505900.html

百度搜索更多

谷歌搜索更多

顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com