绕过Carbonara补丁:拆MediaTekDA2堆溢出heapb8到任意代码执行"

admin 2026-11-06 02:53:51 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

绕过 Carbonara 补丁:拆 MediaTek DA2 堆溢出 heapb8 到任意代码执行

原创

黑卷
黑卷

黑卷的IoT攻防日记

2026年11月5日 14:53
上海

去阅读

2025 年 9 月,GSM 工具 Chimera 悄悄宣称「世界首发」支持 Dimensity 9400 / 8400——而这些 SoC 上的 Download Agent,早在 Carbonara 补丁之后编译。

要么它绕过了补丁,要么手里捏着新洞。R0rt1z2 和 shomy 决定把这条路摸清楚。

几个月的 USB 抓包、连夜逆向、无数次回退之后,他们挖出了 heapb8(读作 heap-bait,「堆饵」):DA2 USB 文件下载路径上的堆溢出,能在已打 Carbonara 的 V6 设备上拿到任意代码执行。

一、战场从 BROM 挪到了 DA2

联发科设备有两套 USB 下载面:BootROM 和 Preloader。前几年 MTKClient 一类工具,主打 BROM USB 栈漏洞。

新 SoC 上 BROM 洞基本被补完,不少 OEM 干脆关掉 BootROM USBDL,只剩 Preloader 这一条路。要刷机、要解锁,就得跟 Download Agent(DA)打交道。

DA 是跑在设备上的小程序,负责 USB 通信和刷写。协议分三代:Legacy V3、XFlash V5、XML V6(codename chimaera)。heapb8 盯的就是 V6 的 DA2。

上传 DA 时还要过 SBC / SLA / DAA 三道关。BROM 验完跳 DA1,DA1 再验完跳 DA2——真正干活的下载处理,就在 DA2 里。

二、抓 Chimera:Beagle + UART

目标机选 Nothing Phone 2A(Dimensity 7200)。Chimera 有反分析,Wireshark 直接挂容易翻车,于是上了 Total Phase Beagle USB 480 做硬件旁路抓包。

光看 USB 不够,还要看设备侧日志。板子背面两颗小焊盘就是 UART:BROM 115200 8N1,后续阶段 921600。

一个坑:DA 默认可能把 g_log_switch 关掉,outchar() 直接不往串口吐。Chimera 抓包里还能看到它主动关日志——防你对照。

三、假洞与真洞:XML 烟雾弹

抓包里 Chimera 会发两次 CMD:SECURITY-SET-ALLINONE-SIGNATURE。第一次文件内容居然像 ARM64 指令序言;第二次文件名塞满 & 一类特殊字符,然后中途 abort。

AIO 命令会 mxmlLoadString 解析 XML,再 fp_read_host_file 拉文件。拉之前对文件名做 mxml_escape——固定 512 字节缓冲,特殊字符展开却不设界。一百多个 & 扩成 &,就能越出约 172 字节。

一开始所有人都以为 XML 展开就是 exploit。可文件名是 XML 字符串:空字节进不去,假堆块头拼不出来。白忙一场。

四、真杀伤:USB「少报多发」

回头看抓包:协议要求主机先声明文件长度。Chimera 声明只要 0x13FC 字节,DA 按宣称长度 +4 分配缓冲;实际却多塞数据,读循环按 packet\_size(0x20000) 收包,只在 bytes_received == advertised_size 时停。

结果:缓冲按「小尺寸」开,写入按「大包」走——直接写穿下一块的 header。而且这是原始 USB 载荷,每个字节(含空字节)都可控。

ARM64 上,free() 会把 alloc.size 写到 alloc.ptr + 0x10。溢出改掉下一块的 ptr / size,就变成任意写。

写谁?DA2 命令循环末尾有个 DPC(Deferred Procedure Call) 结构,.bss 固定地址,cb 非空就会被调用。把 dpc->cb 改成 shellcode 地址,命令一结束就跳进去。

五、落地:NOP 雪橇 + hakujoudai

堆基址随机型/DA 版本变,AIO 缓冲位置也不稳。他们的懒办法:塞大约堆大小 10% 的 NOP 雪橇(量级 ~80MB),shellcode 放末尾,dpc->cb 指向雪橇 95% 处——滑到哪都进 payload。

简化版甚至不用 Chimera 那套「花文件名」:一串 A 把 XML 节点分配到 AIO2 缓冲后面就够;特殊字符多半是故意混淆。

拿到执行后,payload 名叫 hakujoudai(白杖代):先把被搞烂的堆修回去,再注册自定义命令,回到命令循环。penumbra 集成整条链,之后可读写分区、刷镜像,甚至在原厂 DA 会挡的机型上解锁 bootloader。

作者对照补丁,怀疑对应 CVE-2025-20658(逻辑问题)与 CVE-2025-20656(缺边界检查)——以官方描述为准,编号是推断。

黑卷点评

BROM 补完、OEM 关 USBDL 之后,真正还在干活的,是 Preloader + DA2。Carbonara 不是终点;GSM 工具「世界首发」新 SoC,往往说明下载面又被撕开一条缝。

  • 声明长度 ≠ 实际写入

。fp_read_host_file 按 advertised 分配、按 packet 读取——少报多发就是洞。协议状态机要对齐看,不能只信 XML。
* 混淆是给逆向准备的烟雾

。花文件名、垃圾 padding、主动关 UART,都会把你拖进 XML 死胡同;可控空字节在 USB 层。
* 物理 USB + 未鉴权 DA 面

仍是量产与售后刷机的高频入口。升带 ALPS09474894 / ALPS09625423 的 DA;产线夹具别把「能进下载模式」当成默认可信。

补丁之后,战场在 DA2——堆饵已经抛下去了。


⚠️ 免责声明
 本人所有文章均为技术分享,均用于防御为目的的记录,请勿用于其他用途,否则后果自负。

🔧 更多内容在星球「黑卷的IoT攻防日记」

这里长期更新,专注 IoT / 车联网 / 机器人 / AI 安全实战:

· 每天一篇一线漏洞拆解与复现思路,紧跟最新 CVE

· 累计整车实测 20+、IoT 组件 100+ 的经验沉淀与踩坑笔记

· 车联网 / V2X / 固件逆向 的资料、工具与字典

· 星球里提问,我 24 小时内必答,一起挖洞、上分、接项目

👇 扫码进星球「黑卷的IoT攻防日记」· 🎟 早鸟价 ¥98/年

往期推荐


    评论:0   参与:  0