简介
基于信誉的防护措施(例如 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 公开了用于查询 SmartScreen 和智能应用控制的文件信任级别的未公开 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 模型来允许具有高度良性分数的文件(例如与已知良好的文件非常相似)。令人惊讶的是,一些代码段可以在不丢失其关联信誉的情况下进行修改。通过反复试验,我们可以识别出可以安全篡改并保持相同信誉的段。我们制作了一个 篡改后的二进制文件,它具有 Microsoft 或 SAC 从未见过的唯一哈希值。这嵌入了一个“执行计算器”的 shellcode,并且可以在 SAC 强制模式下执行。
LNK 覆盖
当用户下载文件时,浏览器会在一个称为 Web 标记 (MotW) 的备用数据流中创建一个关联的“Zone.Identifier”文件。这可以让系统上的其他软件(包括 AV 和 EDR)知道该文件风险较高。SmartScreen 仅扫描带有 Web 标记的文件。SAC 如果文件带有 Web 标记,则完全阻止某些类型的文件。这使得 MotW 成为一个有趣的绕过研究目标,因为它通常可以绕过这些安全系统。出于经济动机的威胁组织已经发现并利用了多个漏洞来绕过 MotW 检查。这些技术涉及将精心制作的和无效的代码签名附加到 javascript 或 MSI 文件。
在我们的研究中,我们偶然发现另一种易于利用的 MotW 绕过方法。它涉及制作具有非标准目标路径或内部结构的 LNK 文件。当单击这些 LNK 文件时,explorer.exe 会对其进行修改,使其采用规范格式。此修改会导致在执行安全检查之前删除 MotW 标签。覆盖 LNK 文件的功能是_SaveAsLink(),如下面的调用栈所示
执行安全检查的功能是CheckSmartScreen(),如下面的调用栈所示
此问题的最简单的演示是在目标可执行文件路径中追加一个点或空格(例如,powershell.exe.
)。或者,可以创建一个包含相对路径的 LNK 文件,例如.\target.exe
。单击链接后,explorer.exe
将搜索并找到匹配的.exe
名称,自动更正完整路径,更新磁盘上的文件(删除 MotW),最后启动目标。另一个变体涉及在 LNK 的目标路径数组的一个条目中制作多级路径。目标路径数组通常每个目录应有一个条目。pylnk3实用程序显示了执行前(非规范格式)和执行后(规范格式)的漏洞利用 LNK 的结构
演示这些技术的 Python 脚本可在此处获得。
以下显示了一个 LNK 文件绕过 Smart App Control 下的 MotW 限制以启动 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 具有 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
)
最后,围绕常见攻击者技术(如内存内逃避、持久性、凭据访问、枚举和横向移动)的稳健行为覆盖有助于检测真实的入侵,包括来自声誉劫持的入侵。
结论
基于声誉的保护系统是阻止商品恶意软件的强大层。但是,与任何保护技术一样,它们也存在可以通过一些小心措施绕过的弱点。Smart App Control 和 SmartScreen 存在许多基本设计缺陷,这些缺陷可能允许在没有任何安全警告和最少的用户交互的情况下进行初始访问。安全团队应在他们的检测堆栈中仔细审查下载,并且不要仅仅依靠操作系统本机安全功能来保护此区域。