在谈白名单的绕过与反绕过之前,我们首先回顾一下工控系统“白环境”的理念:

只有可信任的设备,才能接入控制网络;

只有可信任的消息,才能在网络上传输;

只有可信任的软件,才允许被执行。

可信任的设备,与可信任的消息,其判别方法与防护策略,将在其它文中叙述,本文暂不涉及。本文将与读者一同探讨可信任的软件的问题,也就是软件环境的白名单实现方案,以及该白名单方案当前面临的挑战与应对方案。

概述

在工业控制系统网络安全实践中,由于受保护系统软件和设备更新频率低,进程,通讯和数据相对单一、稳定,加之工控系统对业务的可靠性,连续性有严格要求,因此白名单不失为一种行之有效的保护方案。

所谓软件白名单,也就是只有可信任的软件,才允许被运行。软件白名单保护的通常做法有两种,一是计算目标程序的哈希,再与维护的白名单特征库作比对,作为控制软件执行的基本判别式。二是维护可信任发行厂商的证书链,通过校验软件签名决定是否允许软件执行。

白名单策略的经典案例就是苹果iOS,苹果公司的AppStore就是其白名单库,苹果公司用相对较高的成本,自行维护更新App Store这个大白名单,从而天然地解决了一大票安卓环境下常遇到的各种安全问题。近年来,许多安卓手机厂商也在推动自己的安卓市场和白名单建立工作。

我们回归windows平台环境,令软件白名单保护失效的方法有很多,粗略说来有以下几种:

1. 白名单污染

白名单污染是针对白名单数据库的攻击,也就是说,将恶意软件的签名或者哈希混入白名单软件的数据库。

2.  暴力破解

暴力破解白名单软件的防护,包括停止白名单软件,控制网络白名单软件的管理设备,或者欺骗白名单软件,通过某些技巧绕过可执行文件加载过程中的哈希或签名计算。

3. 白名单绕过

利用已在白名单中的软件执行目标代码,甚至发动无文件攻击。

白名单污染

白名单数据库是白名单软件的核心,必须具备最全面的保护。著名的白名单软件Bit9,就曾经发生过核心数据库被污染的事件。据说Bit9维护着全球最大型的软件哈希数据库,数据规模达到百亿级别,并且动态定期更新,还作为云服务提供给众多世界级安全厂商。但是2013年,Bit9的白名单遭到了恶意攻击者的破坏,攻击者获取了Bit9的签名证书,并将恶意程序签名后加入Bit9的白名单。造成了严重的后果。

这种攻击方式实际是发生在白名单软件的安装之前,那么如果面对的是已经安装完毕的白名单防护软件,攻击者能做些什么呢?

暴力破解白名单防护软件

白名单软件必须具备对自身的强大保护能力,避免被攻击者攻击导致保护失效。实际上这是众多安全软件普遍面临的一个问题。几乎所有的杀毒软件,IPS,IDS,主机防火墙,都被要求对自身有强大的保护能力。自我保护主要的方案包括注册服务,注册驱动,多进程相互守护等。这也是一个很深入的课题,不在本文赘述。

针对保护软件的另一攻击思路是欺骗其验证过程,这种思路并不通用,主要依赖白名单软件的实现逻辑。比如文件的二次读取,加载和验证并非同一次读取文件内容。攻击者可以用白名单内的可执行文件内容,临时替换验证过程。

针对例举的威胁,解决方案就是,将验证和加载统一起来,读取一次并锁定所读可执行文件内容的buffer。

白名单绕过

前面的两种方式,并不具有典型性,真正意义上的与白名单安全软件的对抗实践,主要思路都放在了白名单绕过上,最常见的白名单绕过思路,是从白名单列表中选择一个宿主,利用白名单软件的合法性,代为执行恶意代码。

以最常见的上位机操作系统Windows为例,我们知道在windows操作系统中执行一项任务,启动一个全新进程只是最常规的方法。除了启动进程,还有许多其它执行方法,包括启动服务,注入远程线程,RPC,启动各种语言的脚本,甚至许多工控软件的编程软件和组态软件。如果白名单只针对进程的exe,dll和bat等进行防护,显然是不够的。

以PowerShell为例,目前流行的一些无文件绕过白名单技术,经常采用PowerShell作为进程载体。

用PowerShell执行恶意代码

PowerShell的脚本扩展名为ps1,但是单纯地将ps1文件格式纳入白名单的过滤项是远远不够的,因为PowerShell完全可以读取任意一段文本,并加载入内存,解码成为shellcode并执行。这段文本可能来自网络CC,来自溢出数据等等。也就是一般意义上我们说的无文件执行攻击。

有兴趣的朋友可以关注开源的PowerSploit,提供了多种内网渗透的姿势,其中就有几种通过注入进程绕过白名单的方法。

PowerShell的强大之处还在于,即使微软自己也不能幸免。根据最新消息,微软自己的白名单WDAC,也存在一个借助PowerShell本地绕过白名单控制的漏洞,这个漏洞(CVE-2019-1167)刚刚于2019年7月16日被微软官方修补好。

因为以上种种原因,我们需要将PowerShell剔除出白名单。

接下来,我们知道PowerShell实际上是c#的一个高级接口,单纯控制PowerShell.exe并不能完全阻止入侵者获得一个PowerShell执行环境。入侵者完全可以把dll注入到其它进程来获取PowerShell,基于这种考虑,我们务必把PowerShell必须的几个dll,也剔除出白名单,例如:Microsoft.PowerShell.Commands.Utility.ni.dll

以下是一个注入到spoolsv.exe获取PowerShell执行权限的实例。

PowerShell只是无文件攻击常用的介质,但并非唯一选择。无文件攻击还可以借助常用软件,例如浏览器,PDF阅读器等的漏洞,将shellcode驻留在内存当中。在工控生产环境中,我们还务必关注工控编程和组态软件的漏洞情况。

无文件攻击的劣势在于需要直接将shellcode注入内存,难以驻留,一旦系统重新启动就失去了活性。但其优势在于很容易就可以突破软件白名单的保护。而不轻易重新启动却恰恰是工业控制领域设备的特性之一,所以无文件攻击特别适合用来针对工控系统进行攻击。也是白名单保护最需要解决的重要问题之一。

为了阻止白名单的绕过,我们必须明确工业现场的需求,压缩白名单到最小可用状态。将PowerShell和类似的其它若干可执行程序以及相关的dll文件剔除出白名单,最大努力避免给白名单绕过攻击者以可乘之机。

总结

白名单的绕过与反绕过是一个长期以来一直讨论的话题,威努特在构建工控白环境的长期实践中,积累了丰富的经验,并将这些经验应用在主机保护产品当中,为客户的工业生产环境保驾护航。

声明:本文来自威努特工控安全,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。