如何将恶意软件修改为非恶意
译者:blueSky
预估稿费:200RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
前言
随着越来越多的网络攻击、数据库漏洞、间谍软件以及敲诈软件频繁的出现在新闻头条上,每家商业公司也开始在其企业网中部署安全产品。一般地,他们往往会投入人力物力来制定适合自己公司的信息安全策略以及寻找最佳的解决方案来对付这些网络攻击行为。
最近,我们发现一种新的令人震惊的绕过杀软的方法,该方法允许任何已知的恶意软件绕过最常见的安全解决方案,例如下一代防病毒软件,安全检测工具以及反勒索改软件等。这种技术被称为Bashware,该技术在实现上利用了Windows 10系统上一个新的、称为Subsystem for Linux(WSL)的功能,此新功能可以使Windows操作系统用户使用流行的bash终端,而且该功能还可以使Windows用户在本机操作系统上运行Linux操作系统的可执行文件。该功能能够允许Linux和Windows系统中的进程在同一时间运行,由于现有的安全解决方案还不能够监视在Windows操作系统上运行的Linux可执行文件的进程,因此该技术可能为那些希望运行恶意代码的网络犯罪分子提供了便利,他们可以利用WSL来绕过尚未集成正确检测机制的安全产品。
观看攻击演示:
https://youtu.be/fwEQFMbHIV8
Bashware是一个非常令人震惊的技术,任何恶意软件利用WSL机制都可以很容易的绕过安全产品。我们在大多数知名的防病毒和安全产品上测试了这种技术,并使用该技术成功地绕过了上述所有的安全产品,由此可见Bashware对全球目前运行的4亿台Windows 10 PC 的影响还是很大的。在发现该技术之后,我们立马更新了我们的SandBlast威胁防护解决方案,以保护我们的客户免受Bashware的攻击。因此安全同行们也应立即采取行动并修改其安全解决方案,以防止这种网络攻击的新方法。
Bashware技术在实现上利用了Windows Subsystem for Linux(WSL)的底层机制,该功能是Windows 10系统中的一个新功能,允许本机Linux ELF二进制文件在Windows上运行。在正式介绍Bashware的细节之前,我们首先回顾一下WSL的内部原理。
WSL概述
Windows Subsystem for Linux(简称WSL,如图1所示)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层,该兼容层包含了用户模式和内核模式,可用于运行Linux二进制可执行文件,而无需启动任何的虚拟机。
Microsoft打算实现一种在隔离环境中以低开销运行应用程序的方法来在单个进程的用户模式地址空间内运行目标应用程序和操作系统。为了达到这个目的,Microsoft在Windows 10系统中引入了Pico进程,该进程是允许在Windows操作系统上运行ELF二进制文件的容器,这些新引进的进程在结构上往往是比较小的,缺少Windows NT进程(PEB,TEB,NTDLL等)中常见的结构块。通过将未修改的Linux二进制文件放在Pico进程中,WSL可以将Linux系统中的调用引导到Windows内核,lxss.sys和lxcore.sys驱动程序将Linux系统调用转换为NT APIs并模拟Linux内核。
WSL概念最初是在Astoria项目和Drawbridge项目中才开始出现,目的是想在Windows系统上运行原生的Android应用程序。在WSL的初始版本中发现多个问题后,Microsoft决定以beta模式提供此项目,并在其GitHub页面上添加技术支持板块,以收集社区中发现的实时问题。在修复了社区提出的大多数问题并达到一个稳定的版本之后,微软正式在2017年7月28日发布了WSL。虽然WSL已经成为一个稳定的功能,其许多问题现在也得到了解决,但似乎行业仍然没有适应这种允许Linux和Windows系统中的进程在同一时间运行的这个奇怪想法。并且这在一定程度上为那些希望运行恶意代码的网络犯罪分子提供了便利,他们可以利用WSL功能来绕过尚未集成正确检测机制的安全产品。有关WSL组件的详细信息请参见“附录A”。
Bashware
Bashware是一种通用和跨平台技术,该技术在实现上利用了WSL,使得恶意软件能够以隐藏的方式运行,从而绕过当前大多数安全产品的检测。该技术的关键在于Pico进程结构的设计,虽然Pico进程与常见的Windows进程特征不同,甚至该进程没有任何特征可以将其标识为一个常见的NT进程,但是Pico进程却具有与常见NT进程相同的功能,并且不会造成任何的威胁。下面我们将从4个步骤来介绍Bashware是如何加载恶意软件payloads的,如下图所示:
步骤1:加载WSL组件
为了利用WSL,Bashware必须首先验证WSL功能是否已经启用,该操作是通过检查Pico驱动程序的状态来实现的(检查lxcore.sys和lxss.sys是否存在于Windows驱动程序的路径中)。在功能被禁用的情况下,Bashware将使用DISM程序来加载驱动程序。这种方法是最简单的,也不会引起任何安全软件的怀疑。在加载WSL组件之后,Bashware将会进入下一步操作。
步骤2:启用开发者模式
只有启用了开发者模式才可以使用WSL组件功能,进入开发者模式需要设置以下这些注册表项:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\AllowAllTrustedApps
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\AllowDevelopmentWithoutDevLicense
虽然这些值由TrustedInstaller设置,但也可以由任何拥有管理员权限的用户(或应用程序)完成设置。由于机器系统或任何高级安全检查没有验证这些是否被修改,因此Bashware可以通过打开并使用这些注册表项,以执行恶意软件的payloads,一旦Bashware的操作完成,注册表项将会被关闭,使得这个操作对用户而言实际上是不可见的。
步骤3:安装Linux
虽然Bashware现在启用了WSL并进入开发者模式,但Linux实例仍然不包含任何的文件系统。因此,Bashware的下一步是从Microsoft的服务器下载并解压缩Linux文件系统。正常情况下,用户可以使用“Lxrun”命令行程序来下载linux文件系统(Ubuntu 16.04),并使用/install选项将文件系统安装到在Windows PC上。Bashware利用Lxrun.exe程序从Microsoft服务器下载Linux文件系统并将其安装到Windows系统上,整个操作看似都是合法的。有趣的是,根据我们的研究发现这个安装过程在某种条件下容易受到网络攻击,这部分内容我们会在下面的内容中进行阐述。
步骤4:Wine
现在,Bashware已经在Windows系统上建立了一个完整的Linux环境,并且能够在两个环境中执行任何操作,下一步该怎么办?我们的最终目的是:尽管恶意软件不是跨平台的,我们也可以从Linux程序中运行恶意软件来攻击Windows系统。经过分析和研究,我们发现Winehq项目是一个完美的解决方案,该项目是一个免费的开源兼容层,可以允许Microsoft Windows程序在类Unix操作系统上运行。对于那些不熟悉它的人来说,Wine不是一个模拟器,而是将Windows API调用转换成POSIX(Portable Operating System Interface)。这正是我们所需要的,因为使用Wine可以在WSL环境中静默运行Windows恶意软件。Bashware使用Winehq项目功能,并将优化后的Wine项目安装到WSL Linux环境中。
接下来,Wine对EXE格式的文件进行转换,将其NT系统调用转换为POSIX系统调用。之后,lxcore.sys驱动程序会将这些POSIX系统调用转换到NT系统调用,并将lxcore转换为此进程的实际调用者。这样一来,在Windows操作系统上运行的文件就可以在Linux操作系统执行任何恶意软件的payloads,并绕过大多数安全产品的检测。
结论
随着“Bashware”完成了上述四个步骤,它成为运行任何恶意软件,绕过最常见的防病毒安全产品、安全检测工具,调试工具等的完美工具。
基于我们的研究发现,Bashware并没有利用WSL设计中的任何逻辑或实现上的漏洞。事实上,WSL的功能设计的很好。而导致Bashware可以运行任意恶意软件的原因主要有以下两个方面:一是在Windows操作系统中这是一种相对较新的技术;二是各种安全厂商缺乏对该技术进行检测的意识。我们认为,安全厂商应该要行动起来了,在支持这项至关重要的新技术的同时也要想法设法去阻止诸如Bashware这样的网络威胁。
Microsoft已采取措施,协助安全厂商处理由WSL引入的新的安全问题,例如Microsoft提供了Pico APIs,这些API接口可由AV公司调用以用来对这些类型的进程进行监控。
进一步分析
在WSL的安装过程中, LxRun.exe程序负责从Microsoft服务器上下载和解压缩Linux文件系统。之后,文件系统被命名为lxss.tar.gz,并保存在%APPDAT%目录下的隐藏文件夹中。在获取到文件系统的压缩包之后,LxRun.exe将其解压缩到同一目录中。解压后的文件夹中包含了完整的Linux文件系统,WSL和Bash.exe稍后会使用该文件系统。
虽然微软已经花了很大的努力来保护Linux文件系统本身,例如防止Linux初始化被篡改,防范常见的注入技术等安全保护,但文件系统本身的保护机制呢?
根据我们的研究和分析发现Linux文件系统在安装过程中是存在安全隐患的,如果攻击者在下载后(在提取文件系统压缩包之前)修改文件系统的压缩包,由于系统不会对文件系统的真实性进行检查。因此,它允许攻击者完全更改文件系统并加载任何Linux文件系统。
与实现此技术相关的主要问题是识别存档被解压的确切时间。幸运的是,对于我们来说,微软为下载的文件系统计算出了一个SHA256值,该值在下载过程完成之后(解压文件之前)被保存到一个文件中。但是,这个SHA256散列值除了用于识别文件系统的压缩包是何时被解压之外,并没有其他用途。
当用户希望使用WSL时,他会运行“Bash.exe”,该程序是在用户权限下执行的。在每个运行的WSL中,NTFS分区会被自动挂载到Linux环境中的/mnt中,从而被授予从WSL内读写和执行NTFS的能力,具体如下图所示:
如果一个网络攻击者利用管理员权限启动了Bash.exe程序,那么Bash.exe 以及其子进程都将以管理员的权限来执行,这样在Windows系统中,网络攻击者就可以轻易的绕过UAC,而在Linux系统端,网络攻击者可以通过提取操作以拥有超级管理员的权限,具体如下图所示:
参考文献
1. Official Microsoft's Blog and GitHub on WSL:
https://blogs.msdn.microsoft.com/wsl
https://github.com/Microsoft/BashOnWindows
2. Alex Ionescu's repository on GitHub:
https://github.com/ionescu007/lxss – Dedicated to research, code, and various studies of the Windows Subsystem for Linux used as great source of information and inspiration for this project.
3. Wine project – a free open-sourcecompatibility layer that allows Microsoft Windows programs to run on Unix-like operating systems. https://www.winehq.org/