Joe Desimone

拆解智能应用控制

新的初始访问和规避技术

阅读 11 分钟安全研究
Dismantling Smart App Control

引言

像 Elastic 的 信誉服务 这样基于信誉的保护可以显著提高检测能力,同时保持较低的误报率。但是,像任何保护功能一样,也存在弱点,并且可以被绕过。了解这些弱点可以帮助防御者将检测工程集中在关键的覆盖差距上。本文将探讨 Windows 智能应用控制和 SmartScreen,作为研究绕过基于信誉的系统的案例,然后演示如何进行检测以弥补这些弱点。

主要结论

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

SmartScreen/SAC 背景

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

Microsoft 公开了未文档化的 API,用于查询 SmartScreen 和智能应用控制的文件信任级别。为了帮助进行此项研究,我们开发了一个实用程序来显示文件的信任度。此实用程序的源代码可在此处 获得

已签名的恶意软件

绕过智能应用控制的一种方法是简单地使用代码签名证书对恶意软件进行签名。甚至在 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 模型来允许具有高度良性分数的文件(例如与已知良好的文件非常相似的文件)。令人惊讶的是,某些代码段可以在不丢失其关联信誉的情况下进行修改。通过反复试验,我们可以确定可以安全篡改且保持相同信誉的段。我们制作了一个 篡改的二进制文件,其哈希值是 Microsoft 或 SAC 从未见过的。这嵌入了一个“执行 calc”shellcode,可以在强制模式下使用 SAC 执行

LNK 踩踏

当用户下载文件时,浏览器会在一个备用数据流中创建一个关联的“Zone.Identifier”文件,即所谓的“网络标记 (Mark of the Web, MotW)”。这会让系统上的其他软件(包括防病毒软件和端点检测与响应软件)知道该文件风险较高。SmartScreen 只扫描带有网络标记的文件。如果 SAC 检测到特定文件类型带有网络标记,则会完全阻止这些文件。这使得绕过网络标记成为一个有趣的研究目标,因为它通常会导致绕过这些安全系统。经济动机驱动的威胁组织已经发现并利用了多个漏洞来绕过网络标记检查。这些技术包括在 JavaScript 或 MSI 文件中附加精心构造的无效代码签名。

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

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

演示此问题最简单的方法是在目标可执行文件路径中附加一个点或空格(例如,powershell.exe.)。或者,可以创建一个包含相对路径(例如 .\target.exe)的 LNK 文件。单击链接后,explorer.exe 将搜索并找到匹配的 .exe 名称,自动更正完整路径,更新磁盘上的文件(删除网络标记),最后启动目标文件。另一种变体是在 LNK 的目标路径数组的单个条目中构造多级路径。通常,目标路径数组的每个目录应该有一个条目。 pylnk3 实用工具显示了利用 LNK(非规范格式)在执行之前和之后(规范格式)的结构

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

以下示例显示了在智能应用控制下,一个 LNK 文件如何绕过网络标记限制来启动 Powershell 并弹出计算器

在另一个示例中,我们展示了这项技术如何与 Microsoft cdb 命令行调试器链接,以实现任意代码执行并执行 shellcode 来弹出计算器

我们在 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 具有网络标记时尤其异常。

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 有许多基本设计缺陷,这些缺陷允许在没有安全警告和最少用户交互的情况下进行初始访问。安全团队应仔细检查其检测堆栈中的下载,并且不要仅依赖于操作系统原生的安全功能来保护此区域。