4. Windows 10新子系统*新挑战

看雪编辑按:事物总是不断向前发展的,Windows系统演变同样如是。在 Windows 10系统中,微软引入了许多新的特性和功能,而每一次内核结构调整对研究者来说都是新的挑战,同时也充满了机遇。就内核漏洞,除了早已千疮百孔的 Win32k 外,能走的路还有很多。此次议题是由上海高重信息科技陆麟带来的有关 WSL(Windows Subsystem for Linux)的安全研究,其中涉及的内容很是有料,例如与大小写敏感相关的 0day 等,为此微软刚在前几天释出 Windows 10 build 17046 新版本用于修复 WSL 组件中的一些 bug。相信各位都能从中得到启发,另外,演讲者对于技术的热爱可谓溢于言表,谈笑间也尽显 Windows 内核大师风采。

以下内容为陆麟演讲实录,由看雪学院(微信公众号:ikanxue)整理。


陆麟

陆麟,中国最老的十大黑客之一,Windows系统内核专家!原NEC中科院软件研究所专家。现任上海高重信息科技有限公司CIO。长期研究系统内核。多年耕耘信息安全领域。



陆麟:感谢大家的捧场。今天的议题之前大家都看到了很多之前冒出来的洞,还有一些是大家历史上已经总结出来很多经验,如何对付黑产、灰产。现在我是临危授命要一些活着的东西给大家看看,之前已经爆料过了,据我所知是没有的,目前为止也没有任何解决方案,大家可以先看一下。这是之前我们通过使用Windows的Linux子系统,顺便看到的一些成果。当我们装完一个Windows subsystem for Linux以后我们得来的一些额外能力,额外能力的几个关键点是在于我们可以直接在Windows下直接执行的Linux的应用了,除了有这样一个改变以外,Linux系统是文件系统是大小写是敏感的,为了支持这个系统暴露了一些毛病。



现在可以看一下,右边的窗很典型,大家也已经看到了,是Linux系统典型的输出,我们其中有同样文件名的两个东西存在,一个叫A,一个文件是a,四个字节我们在里面看一下到底是什么内容。两个文件的内容区别在于大小写。左边的黑框是我们平常的Cmd框,也是可以看到两个不同A的文件存在,我们用一个Windows 可以看内容的Linux来看一下。我们突然发现这两边显示的内容对不上号了,无论我想尝试打开哪一个叫A的文件,它显示的内容都是大写的A,而大写的A是我们刚才所看到的Linux系统下面大写的A,这样一个小小的地方了其实暴露了一堆的问题,我们至少可以看到两样。首先,打开文件可能看到的内容是错的,Windows 文件读错了就算了,后面还有其他的错误,这个错误在哪边?大家可以看到输出的内容也错了。4字节的内容显示了8个字节。 [略去python演示内容]无论执行哪一个脚本,出来的都是A.py。像这样的漏洞是非常全局性的,[删除部分文字略去原因]。带来的后果,很可能相当长的时间内都没有办法修复,我们接下来就开始回到正题了,我要开始我的演讲了。


Windows下跑Linux应用的发展变迁


我的名字叫做陆麟,我现在是在上海高重信息科技有限公司CIO,是这个公司联合创始人之一,我们这个公司也是专注于攻防信息安全这一块的。我们这个课题讲的东西是什么,另外一个角度看待我们的主机安全攻防。



Windows下跑的Linux应用,它本身不是第一天了,从Windows2003的时代就已经开始要打这个主意了,让原先Unix的系统全部跑起来了,当时没有一个模式使得操作系统可以执行Unix下的可执行文件,当时采取了一些变通的方式,那个变通的方式是什么,叫做posix子系统。到windows 2003,SFU提供了一大堆工具集,还能跑Gcc,Gcc编出来的东西是Windows的,不是Unix的。再往后演化就变为的一个SUA的系统,它适用的范围是vista-win7,它也是独立的文件包,到了Windows10开始,一本正经微软开始支持直接跑Unix的应用,大家认为还是比较好用的,带来了很大的便利。



Windows 7下的SUA是怎么一回事?直接就是操作系统内置的安装里面了,装好一下我们可以看到黑色的图,最终的效果是安装完毕,所有的组建都是在Windows目录下有一个SUA的目录,可执行文件还是MZ的格式,通过一个特定目录可以访问到C盘的数据,而且还可以执行大小写。



到了Windows10之后演化出来的东西到底如何装起来,【演示】把这个模式先打开,适用于Unix的Windows子系统,通过开发人员模式就可以把这个系统安上。基本上这个功能覆盖度相当齐全了,大部分的功能都可以用。



安装完以后对Unix的应用其实还是有一些革命性的转变。装在哪边?首先是用户的目录下。多出来一个子目录叫做LXSS,通过操作系统可以装出来的Linux是Ubuntu。在Windows应用商店能下载安装suse。大家都可以下载。



安装的OS部件不重要,因为机制都一样的,怎么跑都会出毛病,它不是Linux出毛病,而是这些特性给整个操作系统带来一些问题。这样ELF的程序直接可以在Windows上执行。



除了能直接执行ELF文件,Linux子系统把Proc FS也实现了。微软做了相当大的努力进行兼容。默认情况下,子系统把C盘以及D盘也mount好了。【演示】所有目录上面显示了,mount point是在mnt的目录下。



这一系列的背景其实都是非常管用,在将来漏洞利用的整个攻击链中,这一些背景知识是逃不掉的,哪里找C盘,哪里找D盘,改写哪些程序和哪些配置,需要自己要动脑筋的。


这个系统我顺便跟大家报告一下,大家看到的有问题的系统,是九月份微软发布的Windows10最新版本(秋季创新者版),补丁也一直打到11月份,就是说处于所有补丁都齐全的状态。目前为止还是有缺陷。之前的几个版本WSL网络毛病比较多一点,今年三月份升级完了以后的系统,基本上整体可运行性非常好了,要想找出来毛病大家还是可有机会的。今天披露问题时考虑到大会上听众水平不一,咱们如果列一大堆的代码大家可能看起来比较头大,通过几个命令的执行就直接看到后果的话效果会好一点。


WSL漏洞的成因



为什么会出这些问题?就需要反过来考察子系统本身到底是怎么一回事,怎么带进来的?曾经微软做的操作系统的子系统叫OS/2,以及POSIX。兼容非windows的子系统一直都有,但当时一直无法回避需要源代码编译到windows下跑的毛病。后来可能还是因为linux的可执行程序数量太大了,最终走上ELF可执行这条路是免不掉的,为了支持这么一件事情,Windows的内核进行了非常大的改造,每一轮的大改造就成了大家的机会。如果是做攻防目前这一块机会比较多。



为了实现ELF文件的直接执行,除了利用现存OS功能,需要改造以及实现一大批新的操作系内核功能。我们可看到新的模块名字叫做Pico Provider,从图上我们可看到微软已经基本上把Vfs和Sys以及Dve等关键组件都实现了出来。这张图是微软自己披露的,系统结构的框图。


做安全,需要考虑攻击方会有哪些手法,而做防守会有哪些方面工具和能力。当能力到达一定条件下就能料敌先机。现在新的系统产生出来给现有安全机制带来很多方面的影响。有一个角度是安全软件没有办法监视系统的进程派生关系,系统进程派生关系是很多安全软件核心观察角度,比如说我们用了很多的漏洞技术,最终也就是执行一个什么东西。比如在浏览器下面跑个马,当一个不该跑的东西出来瞬间我们已经知道异常。



因此wsl对于大家原先派生关系的整个监控机制产生的挑战,按照原先的写法无法实时看到wsl下的进程派生关系。当然微软也发现了这个问题,提出了新的API接口,大家不去使用新的api,就没有办法观察到新wsl的进程关系。



网络监控这一块功能我们很明确的说,下一版本的Windows甚至是内部版本的时候,有一大堆的网络安全的软件会有相当一部分的功能受损,损在哪里?监视网络如果要用到TDI这个接口就不行。后续OS升级要把TDI都bypass掉,这样以来,借助TDI接口监控的安全软件就会损失功能。整个过程会有相当长的时间窗口出现。



回头来讲我们做杀毒软件,有很大的局限,大部分只能看到PE文件,现在又多了一个ELF格式。脚本也认不出来,刚刚一位讲师讲的Flash恶意软件也认不出来。


在操作系统在自身演变的过程当中带来了不少能导致崩溃的问题。甚至像原子操作也有带来崩溃的,我们没有看这些崩溃有无可能利用,如果能利用那漏洞就是内核级的。蓝屏最底线就是DoS。


刚刚讲到的新出来的接口在红框上给大家新标出来【略去部分演讲说明】。


这里比较有趣的挑战是什么?比如说一个进程跑出来我要知道他是什么进程,Windows很简单,有一个可执行文件就在那边了,直接就拿出来了。



但是传统的linux以及Unix不同【略去机制说明】如果改造一下执行模式,我们看到1和2,这个时候还是可以看到原来的程序在执行的,在这个过程当中留了一堆的事情,再就是EXEC一个新的可执行程序,pid不变,一个pid一会儿是A,一会儿是B,杀毒软件会头大,到底是什么东西搞出来的鬼,给大家形成一个判断上的挑战。


【略去部分说明】,我们可以预见相当长的时间,这个形势会愈演愈烈。现在利用工具大家还比较少见,将来会出来一大批。这个特性影响波及面实在太广了,只要是Windows的应用都受到影响。【略去部分说明】。这个里面还带来了一个特别有趣的东西,我把红圈出来了,刚刚没有仔细跟大家讲。我们实际的文件内容是AAA,再加一个换行,一共四个字。Windows里面冒出来了变了两行,给大家再仔细看看。A是在这边的这个框,小写a的这个文件内容有三个小写的a,文件名大写的A内容是大写的三个A文件,我们如果在Windows的下用type命令看我们发现有六个字冒出来,一个长度4字节的文件,type出来变成8个字节。【略去部分演讲内容】


演示的内容大致上就是这些,通过今天的课题,应该给大家一些比较有趣的启发,知道了接下来的路在哪里。如果是渗透团队机会在哪一边,防御团队知道自己缺陷在哪里,有相当多的路可以走,希望可以给大家一些启示,有什么问题可以会后交流。


谢谢。