Google白帽发现Windows bug
上一篇 /
下一篇 2019-03-22 13:27:09
Google Project Zero白帽研究员James Forshaw发现位于
Windows kernel模式驱动中的
漏洞,利用该漏洞可以进行权限提升。该漏洞是由于处理特定请求时缺乏必要检查导致的。
Windows使用PreviousMode域来设置UserMode或KernelMode,然后确定调用的参数是否来源于可信源。
该机制也用于文件创建和打开,kernel模式代码可以从不同的API函数中选择,包括到I/O管理器内部函数IopCreateFile的函数。
在这种情况下,PreviousMode会被分配一个特定的变量来确定是否检查有效的参数和缓存。
操作系统使用该变量进行设备对象的检查,即是否是UserMode。IopCreateFile中的Options参数会暴露给一些API函数,这些API函数只能从kernel模式来调用以设定覆盖AccessMode的flag,并设置为KernelMode。
IoCreateFile只能从kernel模式代码调用,并且没有系统调用传递参与,因此任意的调用都会使用线程中设置的previous mode。如果IoCreateFile被一个previous mode为UserMode的线程调用,这就意味着会执行SecAC和MemAC。
强制执行MemAC是有问题的,因为kernel代码无法传递到IoCreateFile的kernel模式指针,这会使API很难使用。但调用IoCreateFile不能只修改线程的previous mode为KernelMode,因为SecAC会被禁用。
在特定情形下,会出现访问强制检查的行为,因此有kernel mode驱动会打开用户模式应用指定的对象名。
Forshaw解释说,
并不是kernel mode下运行的Windows中所有的驱动在执行特定(IRP_MJ_CREATE)请求时都会执行所有的访问检查。Kernel mode代码会进行强制检查,为恶意活动打开了后门。
执行的操作类型和操作的特定参数都是在IRP结构之后的IO Stack Location结构中传递的。在打开文件的情形中,主要的操作类型是IRP_MJ_CREATE,使用了IO_STACK_LOCATION结构的Create union域。
如果攻击者能够控制文件创建或打开调用的参数,就可以用来自用户模式下的请求,发送check设定为KernelMode的IRP_MJ_CREATE请求,这样就可以进行权限提升。
要完成本地权限提升,还需要以下部件:
1、kernel mode Initiator (调用IoCreateFile或IoCreateFileEx的代码)会设定INPC和IFAC flags,但是不会设定OFAC。
2、使用RequestorMode的有漏洞的接收器在处理IRP_MJ_CREATE进行安全检查时并不会检查SFAC。
攻击者需要可以让Initiator打开接收器处理的设备对象。接收器中的安全检查会被绕过因为Irp->RequestorMode是KernelMode,但SL_FORCE_ACCESS_CHECK flag并不会检查。研究人员发现了多个initiator和接收器的实例,但是链接在一起并不会造成权限提升。研究人员称会进一步研究。
研究人员认为第三方驱动也存在被攻击者利用的风险,因此建议所有的kernel驱动开发者尽快检查带来确保IRP请求的正确处理,并对文件打开API的使用进行防护。
微软称会在未来的Windows操作系统版本中解决该bug,会在Windows 10 19H1中应用大多数的补丁。
收藏
举报
TAG:
Bug
软件测试管理
缺陷管理