登录
 找回密码
 立即注册
发帖

浅谈Windows 10中藏着的那个Linux

admin 2017-10-13 18:55

早在去年8月份,eWEEK曾经发表过一篇文章,题为《藏于Windows 10之中Linux内核风险》。这篇文章实际上是对Crowdstrike首席架构师Alex Ionescu在去年Black Hat USA安全大会上发言的简单总结。我觉得这个话题还是挺有意思的,我在去年Black Hat USA的总结文章中也提到了这个议题,不过可惜未能亲临现场听教,这里将这篇文章添油加醋后与列位分享,仅停留在理论和嘴炮上,但可作为各位深入研究的切入点。

terry_myerson_silhouette_web.jpg

Windows 10中的Linux

微软去年3月份在Build大会上宣布“将Ubuntu Linux的一些能力带给微软用户”。其实最初Windows 10系统中引入Bash就已经让不少人感觉到惊讶了(Bash on Ubuntu on Windows),不过Bash对很多人来讲也是福音,比如能运行GUI Linux应用了。但实际情况还不止于此,微软去年其实已经向大众明确解释了Windows 10中的Linux子系统。

这里多嘴一句,似乎在纳德拉成为微软CEO之后,其行事风格已经发生了极大转变,拥抱Linux不过是其中一个事件罢了——且拥抱Linux这件事并不只是通过在Windows中塞个Linux实现的,似乎前两年微软在培训体系中已经增加了更多针对Linux工程师的联合认证,而且是和Linux基金会合作的。

微软首席软件架构负责人Deepu Thomas说,其中Linux子系统就是微软Windows Kernel团队打造的,而且绝不只是加个解释层或虚拟机。据说这个Windows Subsystem for Linux几年前就已经诞生了,针对的是NT内核,彼时是期望以此支持POSIX和OS/2。

Thomas说这是用户模式(或者叫用户态,user mode)Linux二进制代码和Windows内核组件之间,”the magic happens”。微软令Linux系统调用能够直接往Windows内核,Pico进程(有关Pico详情可见https://blogs.msdn.microsoft.com/wsl/2016/05/23/pico-process-overview/)中放了未修改版(原话就是未修改版)的Linux二进制程序。他稍稍解释了Windows Subsystem for Linux(简称WSL)的组成:

WSL由一系列组件组成,可让原生的Linux ELF64二进制程序在Windows之上运行。它包含用户态和内核态组件。主要组成部分包括:

- 用户模式管理服务,用于处理Linux实例生命周期;

- Pico Provider驱动(lxss.sys, lxcore.sys),通过解释Linux系统调用来模拟Linux内核;

- Pico进程,放置原版用户模式Linux(e.g. /bin/bash)

当然了,要将这么个子系统塞进Windows中,并非一个简单的进程就能搞定的。

LXSS-diagram-1024x472.jpg

WSL通过在Windows NT内核之上虚拟Linux内核接口,来执行未修改的Linux ELF64二进制程序。内核接口之一就是系统调用(syscall)。系统调用就是内核提供的服务,可从用户模式调用。Linux内核与Windows NT内核都向用户模式提供大量系统调用,但两者语义不同,且并不直接兼容。比如说,Linux内核包括如fork、open、kill之类,而Windows NT内核则相应的有NtCreatProcess、NtOpenFile、NtTerminateProcess。

WSL包含内核模式驱动(lxss.sys和lxcore.sys),这些驱动负责处理Linux系统请求调用与Windows NT内核协调。它们并不包含Linux内核的代码,而采用Linux兼容内核界面的clean room implementation。在原生Linux中,用户模式可执行程序进行系统调用时,是由Linux内核处理。而在WSL中,可执行程序进行系统调用,Windows NT内核要将请求转发给lxcore.sys。lxcore.sys将Linux系统调用解释为相应的Windows NT调用,后者再依次处理。在没有合理对应的情况下,Windows内核模式驱动需要直接服务于请求。

感兴趣的同学可以点击这里作更多了解:https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/

增加的攻击面

去年的Black Hat USA大会之上,Crowdstrike首席架构师Alex Ionescu做了个议题分享,名字就叫“Windows 10中藏着的Linux内核”。eWEEK后来也对他单独做了采访,Ionescu因此分享了更多细节。

他说早在beta测试期间,他就将发现的安全问题反馈给了微软,某些漏洞已经修复。不过他强调说,现如今的Windows系统令企业组织有了更大的攻击面,这是企业组织需要去了解的。

Ionescu表示:“在某些情况下,Windows系统中的Linux环境,由于兼容性问题会更不安全。Windows应用有很多方法针对Windows系统中的Linux应用植入代码、篡改内存,形成新的威胁。”

“这样一来,你就有了个双头猛兽,既能对Linux做些小动作,也能对Windows进行攻击。”

前面已经提到,Windows系统中的这个Linux并不是运行在Hyper-V虚拟机里面的,而是运行在原生硬件之上——Ionescu的用词说可以获得所有的性能和系统访问,因此扩大攻击面是必然的。而且Windows系统文件也对应到Linux系统,Linux访问相同的文件和路径。

另外WSL的更新机制也是Ionescu比较关注的——Windows系统中可设定计划任务,运行Apt-Get Linux命令,针对用户态作包升级。实际上,微软并没有真的用Ubuntu Linux内核,只是用户空间工具和应用。

“内核是微软自家的实施方案,通过常规的Windows Update更新机制来更新。”

除此之外,Ionescu提到的问题还包括微软针对Windows应用的白名单服务AppLocker,对Linux应用而言是没用的。也就是说,如果某家企业在系统中采用Linux,那么Linux应用的运行是不会经过AppLocker检查的。

这里我也没有掌握更多的资料可供具体分享(毕竟我向来都是个只在意理论,而对实操毫无兴趣的人,具体请看我的另一个专栏:周三特别行动小组)。在攻击面增加之外,防范方法当然还是要提一下——网络防火墙设备检查流量还是有效的;另外虽然用户的传统反病毒产品可能面对此类问题时不会有什么效果,但基于行为的安全软件还是能够发现IoC。

不过Ionescu认为,这方面的威胁应该短期内不会太严重,毕竟当前WSL还很新,也并没有广泛部署。“攻击者一般不会在意最新的事物,毕竟其对市场影响力有限。不过随着功能采用率的增加,还是可能会成为更具吸引力的攻击向量。”(最后容我吐槽下,不知道究竟是谁把attack vector最先翻译成了攻击向量,小学语文真的是…好了不说了…)

VLS_7466.0.jpg

最后的最后,其实我一直很想吐槽微软近两年出现的各种短命且奇葩项目,比如说Project Astoria——在Windows 10 Mobile中塞个Android——其实Insider计划一度是出现过塞进Android的编译版本的(像追逐iOS的Project Islandwood计划则更昙花一现了)。是不是感觉跟Win10塞Linux也没差?这是其它话题了,而微软的脑回路近两年在纳德拉的影响下已经越来越曲折,就好像Windows on ARM一样(高通在Computex大会上已宣布支持完整版Windows)…这节奏是包罗万象的意思吗?攻击面???What…


鲜花

握手

雷人

路过

鸡蛋
分享到
  • admin 2017-10-13 19:12
    WSL通过在Windows NT内核之上虚拟Linux内核接口,来执行未修改的Linux ELF64二进制程序。
文章点评