Joe Desimone

拆解智能应用控制

新的初始访问和逃避技术

阅读时间:11 分钟安全研究
拆除智能应用控制

简介

基于声誉的保护(例如 Elastic 的声誉服务)可以显著提高检测能力,同时保持较低的误报率。 然而,与任何保护能力一样,也存在弱点,并且有可能被绕过。 了解这些弱点可以让防御者将他们的检测工程重点放在关键的覆盖漏洞上。 本文将探讨 Windows智能应用控制和 SmartScreen 作为研究绕过基于信誉的系统的案例研究,然后演示检测方法以弥补这些弱点。

关键要点:

  • Windows 智能应用控制和 SmartScreen 存在一些设计缺陷,使得攻击者可以在没有任何安全警告或弹出窗口的情况下获得初始访问权限。
  • LNK 文件处理中的错误也可以绕过这些安全控制
  • 防御者应该了解这些操作系统功能的局限性,并在其安全堆栈中实施检测以进行弥补

SmartScreen/SAC 背景

自 Windows 8 以来,Microsoft SmartScreen一直是操作系统的内置功能。 它对具有“网络标记” (MotW)并被用户点击的文件进行操作。 微软在 Windows 11 的发布中引入了智能应用控制 (SAC)。 从某种程度上来说,SAC 是 SmartScreen 的演变。 微软表示,“通过阻止恶意或不受信任的应用程序,可以增强对新出现的威胁的防护”。 它的工作原理是在执行应用程序时查询 Microsoft 云服务。 如果已知它们是安全的,则允许执行;但是,如果它们是未知的,则只有在具有有效的代码签名的情况下才会执行它们。 当启用 SAC 时,它会替换并禁用 Defender SmartScreen。

微软公开了用于查询 SmartScreen 和 Smart App Control 文件信任级别的未记录 API。 为了帮助这项研究,我们开发了一个可以显示文件信任度的实用程序。 该实用程序的源代码可在此处获得。

签名的恶意软件

绕过智能应用程序控制的一种方法是使用代码签名证书对恶意软件进行签名。 甚至在 SAC 出现之前,就存在攻击者对其恶意软件进行签名以逃避检测的趋势。 最近,攻击者经常获取扩展验证 (EV) 签名证书。 EV 证书需要身份证明才能获得访问权限,并且只能存在于专门设计的硬件令牌上,因此很难被窃取。 然而,攻击者已经找到了冒充企业并购买这些证书的方法。 SolarMarker背后的威胁组织在其活动中利用了超过 100 个独特的签名证书。 证书颁发机构 (CA) 应该加大力度打击滥用行为,尽量减少通过欺诈手段获取的证书。 可能需要开展更多的公开研究来对最常出售伪造证书的 CA 施加压力。

声誉劫持

声誉劫持是针对基于声誉的恶意软件保护系统的一种通用攻击范例。 它类似于 Casey Smith 等人针对应用程序控制系统进行的错误信任研究,以及 Gabriel Landau 和我进行的易受攻击的驱动程序研究。不幸的是,在这种情况下,攻击面甚至更大。 声誉劫持涉及查找和重新利用具有良好声誉的应用程序来绕过系统。 要作为初始访问向量工作,一个约束是必须在没有任何命令行参数的情况下控制应用程序 - 例如,在可预测的文件路径上加载和执行脚本的脚本宿主。

脚本主机是声誉劫持攻击的理想目标。 如果它们包含外部功能接口(FFI)功能,则尤其如此。 利用FFI,攻击者可以轻松地在内存中加载并执行任意代码和恶意软件。 通过在 VirusTotal 和 GitHub 中搜索,我们发现了许多享有良好声誉且可以被利用来执行完整代码的脚本主机。 这包括 Lua、Node.js 和 AutoHotkey 解释器。 此处提供了一个演示此技术的示例。

以下视频演示了如何使用JamPlus构建实用程序进行劫持,以绕过智能应用程序控制,并且没有任何安全警告:

在另一个例子中,使用已知的 AutoHotkey 解释器绕过了 SmartScreen 安全警告:

劫持已知应用程序声誉的另一种途径是利用它。 这可能很简单,就像从可预测的路径读取 INI 文件的经典缓冲区溢出一样。 它可能是一些更复杂的东西,可以链接其他原语(比如命令执行/注册表写入/等等)。 此外,可以将多个已知应用程序链接在一起以实现完整的代码执行。 例如,一个读取配置文件并执行命令行参数的应用程序可用于启动另一个需要一组参数才能获得任意代码执行的已知应用程序。

声誉播种

对声誉保护的另一种攻击是将攻击者控制的二进制文件植入系统。 如果精心制作,这些二进制文件可能看起来是无害的,并获得良好的声誉,但以后仍然对攻击者有用。 它可能只是一个新的脚本宿主二进制文件、一个具有已知漏洞的应用程序或一个具有有用原语的应用程序。 另一方面,它可能是一个包含嵌入恶意代码的二进制文件,但仅在特定日期或环境触发后激活。

智能应用程序控制似乎容易受到种子攻击。 在一台机器上执行样本后,大约 2 小时后收到了良好的标签。 我们注意到,基本的反模拟技术似乎是获得良性判决或声誉的一个因素。 幸运的是,SmartScreen 在信任应用程序之前似乎具有更高的全球流行度标准。 此处提供了一个演示此技术的示例,如下所示:

声誉篡改

针对声誉系统的第三类攻击是声誉篡改。 通常,声誉系统使用加密安全散列系统来使篡改变得不可行。 然而,我们注意到对文件的某些修改似乎并没有改变 SAC 的声誉。 SAC 可以使用模糊散列或基于特征的相似性比较来代替或补充标准文件散列。 它还可以利用云中的 ML 模型来允许具有高度良性分数的文件(例如与已知良好文件非常相似)。 令人惊讶的是,一些代码段可以被修改而不会失去其相关的声誉。 通过反复试验,我们可以识别出可以安全篡改且保持相同声誉的片段。 我们制作了一个被篡改的二进制文件,其具有微软或 SAC 从未见过的独特哈希值。 这嵌入了一个“execute calc”shellcode,可以在强制模式下使用 SAC 执行:

LNK 踩踏

当用户下载文件时,浏览器将在称为 Web 标记 (MotW) 的备用数据流中创建关联的“Zone.Identifier”文件。 这会让系统上的其他软件(包括 AV 和 EDR)知道该文件的风险更大。 SmartScreen 仅扫描带有 Web 标记的文件。 如果存在某些文件类型,SAC 会完全阻止它们。 这使得 MotW 绕过成为一个有趣的研究目标,因为它通常可以导致绕过这些安全系统。 以经济为目的的威胁团体已经发现并利用多个漏洞来绕过 MotW 检查。 这些技术涉及将精心设计且无效的代码签名附加到 javascript 或 MSI 文件。

在我们的研究过程中,我们偶然发现了另一个很容易利用的 MotW 绕过方法。 它涉及制作具有非标准目标路径或内部结构的 LNK 文件。 当单击时,这些 LNK 文件会被 explorer.exe 使用规范格式进行修改。 此修改导致在进行安全检查之前删除 MotW 标签。 覆盖 LNK 文件的函数是_SaveAsLink(),如下面的调用堆栈所示:

执行安全检查的函数是CheckSmartScreen(),如下面的调用堆栈所示:

这个问题最简单的演示就是在目标可执行路径后附加一个点或空格(例如, powershell.exe. )。 或者,可以创建一个包含相对路径(例如.\target.exe的 LNK 文件。 点击链接后, explorer.exe将搜索并找到匹配的.exe名称,自动更正完整路径,更新磁盘上的文件(删除 MotW),最后启动目标。 另一种变体涉及在 LNK 的目标路径数组的单个条目中制作多级路径。 目标路径数组通常每个目录应有 1 条目。 pylnk3实用程序显示执行前后漏洞 LNK 的结构(非规范格式):

此处提供了演示这些技术的 Python 脚本。

下面显示了一个 LNK 文件如何绕过智能应用程序控制下的 MotW 限制来启动 Powershell 并弹出计算:

在另一个示例中,我们展示了此技术与 Microsoft cdb 命令行调试器相结合,以实现任意代码执行并执行 shellcode 来弹出 calc:

我们在 VirusTotal 中发现了多个存在该漏洞的样本,证明该漏洞被广泛使用。 已识别出的最早样本是在 6 年前提交的。 我们还向 MSRC 披露了该漏洞的详细信息。 它可能会在未来的 Windows 更新中得到修复。 我们正在发布此信息以及检测逻辑和对策,以帮助防御者识别此活动,直到补丁发布为止。

检测

从本质上来说,声誉劫持很难被发现。 无数的应用程序可以被选用来执行该技术。 对已知被滥用的应用程序进行分类和阻止是初始(也是持续)的步骤。

process where process.parent.name == "explorer.exe" and process.hash.sha256 in (
"ba35b8b4346b79b8bb4f97360025cb6befaf501b03149a3b5fef8f07bdf265c7", // AutoHotKey
"4e213bd0a127f1bb24c4c0d971c2727097b04eed9c6e62a57110d168ccc3ba10" // JamPlus
)

然而,这种方法总是会落后于攻击者。 一个稍微更强大的方法是开发行为特征来识别被滥用软件的一般类别。 例如,我们可以在可疑的调用堆栈中寻找常见的 Lua 或 Node.js 函数名或模块:

sequence by process.entity_id with maxspan=1m
[library where
  (dll.Ext.relative_file_creation_time <= 3600 or
   dll.Ext.relative_file_name_modify_time <= 3600 or
   (dll.Ext.device.product_id : ("Virtual DVD-ROM", "Virtual Disk","USB *") and not dll.path : "C:\\*")) and
   _arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info: "*!luaopen_*")] by dll.hash.sha256
[api where
 process.Ext.api.behaviors : ("shellcode", "allocate_shellcode", "execute_shellcode", "unbacked_rwx", "rwx", "hook_api") and
 process.thread.Ext.call_stack_final_user_module.hash.sha256 : "?*"] by process.thread.Ext.call_stack_final_user_module.hash.sha256
api where process.Ext.api.name : ("VirtualProtect*", "WriteProcessMemory", "VirtualAlloc*", "MapViewOfFile*") and
 process.Ext.api.behaviors : ("shellcode", "allocate_shellcode", "execute_shellcode", "unbacked_rwx", "rwx", "hook_api") and
 process.thread.Ext.call_stack_final_user_module.name : "ffi_bindings.node"

安全团队应该特别注意下载的文件。 他们可以利用当地的声誉来识别环境中的异常值,以便进行更仔细的检查。

from logs-* | 
where host.os.type == "windows"
and event.category == "process" and event.action == "start"
and process.parent.name == "explorer.exe"
and (process.executable like "*Downloads*" or process.executable like "*Temp*")
and process.hash.sha256 is not null
| eval process.name = replace(process.name, " \\(1\\).", ".")
| stats hosts = count_distinct(agent.id) by process.name, process.hash.sha256
| where hosts == 1

LNK 踩踏可能有很多变种,使得基于签名的 LNK 文件检测变得困难。 但是,它们都应该触发类似的行为信号 - explorer.exe覆盖 LNK 文件。 在下载文件夹中或当 LNK 具有 Web 标记时,这种情况尤其异常。

file where event.action == "overwrite" and file.extension : "lnk" and
 process.name : "explorer.exe" and process.thread.Ext.call_stack_summary : "ntdll.dll|*|windows.storage.dll|shell32.dll|*" and
 (
  file.path : ("?:\\Users\\*\\Downloads\\*.lnk", "?:\\Users\\*\\AppData\\Local\\Temp\\*.lnk") or
  file.Ext.windows.zone_identifier == 3
  )

最后,围绕常见攻击者技术(例如内存逃避、持久性、凭证访问、枚举和横向移动)的强大行为覆盖有助于检测现实的入侵,包括声誉劫持。

结论

基于信誉的保护系统是阻止商品恶意软件的强大手段。 然而,与任何保护技术一样,它们也存在一些弱点,只要小心一点就可以绕过。 智能应用程序控制和 SmartScreen 存在一些根本的设计缺陷,可能导致初始访问时没有安全警告且需要最少的用户交互。 安全团队应该在其检测堆栈中仔细检查下载内容,而不要仅仅依赖操作系统原生的安全功能来保护这一领域。