CVE-2026-43655 AppleM2ScalerCSCDriver 释放后使用漏洞的公开披露
针对 CVE-2026-43655 的公开技术披露,这是一个 AppleM2ScalerCSCDriver / IOSurfaceAccelerator 释放后使用(use-after-free)漏洞,可从默认 iOS 应用沙箱触发,无需任何特殊 entitlements。
Apple 已在 iOS 26.5 / iPadOS 26.5 / macOS Tahoe 26.5 中修复该问题。本仓库包含 Objective-C 概念验证(PoC)源码、最小化 entitlements、构建好的 IPA,以及理解并在受影响设备上复现该问题所需的技术文档。
该漏洞是缩放器(scaler)调度器中的拆解/生命周期错误。用户进程可以提交异步缩放器操作,关闭拥有这些操作的 IOSurfaceAcceleratorClient 连接,并在驱动程序全局调度器结构中留下过期条目。后续的调度器遍历(pass)可能会处理仍指向已释放并被重用操作存储的条目。
PoC 使用两个不同的标记值来演示该生命周期漏洞:
0xDEAD00010xBEEF0002受害者连接提交异步操作后即被关闭。随后打开替换连接,并将其自身标记设置为 0xBEEF0002。当下一个缩放器调度周期运行时,故障观察到的是替换标记(x9 = 0x00000000BEEF0002),而非受害者标记。这证明调度器读取了一个已被释放并重新分配给其他连接的操作槽位。
com.apple.driver.AppleM2ScalerCSCDriverIOSurfaceAcceleratorClientget-task-allowAppleM2ScalerCSCDriver 在多个缩放器客户端之间共享调度器状态。相关的生命周期不匹配如下:
IOServiceClose 关闭。拆解路径不会从共享调度器堆中移除关闭客户端的待处理调度器条目。调度器稍后通过这些过期指针读取和写入字段。
分析过程中观察到的重要字段:
| 偏移量 | 调度器行为 |
|---|---|
operation + 0xc94 | 被读取为信用解析路径所使用的信用/标记值 |
operation + 0xc1c | 由调度器信用核算路径写入 |
operation + 0x1fe4 | 由调度器状态/标志更新路径写入 |
操作分配器的行为使该漏洞可以被观察到:已释放的操作槽位可被来自不同连接的后续操作重用。通过关闭受害者连接并立即喷射新连接,PoC 可以使过期的调度器条目指向现在由喷射连接拥有的内存。
x9 = 0xBEEF0002 能证明 UAFPoC 使用受害者/喷射区分:
0xDEAD0001。0xBEEF0002。如果调度器仍读取活跃的受害者拥有的对象,观察到的值应为 0xDEAD0001。然而,复现出的故障观察到的是 0xBEEF0002,即替换喷射连接写入的值。这是调度器解引用指向已释放并被重用内核内存的过期指针的关键证据。
这也显示了跨连接影响:调度器条目由一个连接创建,但稍后其访问的内存已被另一个连接回收利用。在复现运行中,最终的调度器活动可能是由正常的 SpringBoard/合成器(compositor)/UI 活动驱动的,而非原始的 PoC 进程。
Apple 公开公告将影响描述为:“应用或许能够导致系统意外终止或读取内核内存。”
重要的复现细节:点击 TEARDOWN UAF 后,设备不一定会立即 panic。PoC 首先制造过期的调度器状态。该漏洞会在下一个缩放器调度周期触发,实际操作中这发生在 SpringBoard/合成器活动驱动缩放器时。在我的真机复现中,我在 PoC 完成制造过期调度器状态后,通过点击/交互**灵动岛(Dynamic Island)**触发了该调度周期。
步骤:
ScalerTeardownUAF.ipa。AppleM2ScalerCSCDriver 连接。IOSurface 对象。0xDEAD0001。IOServiceClose 关闭受害者连接,释放受害者拥有的操作对象,同时保留过期的调度器条目。0xBEEF0002。x9 = 0x00000000BEEF0002。预期证明条件:
x9 = 0x00000000BEEF0002 表示调度器从原本属于已释放受害者操作的内存中读取到了喷射标记。0xBEEF0002 不是受害者标记;它是替换连接的标记。包含的源码执行以下序列:
open victim connection
create IOSurface source/destination pair
submit sync baseline scaler request
set victim marker = 0xDEAD0001 through selector 10
submit 50 async scaler operations
close victim connection
open 50 spray connections
set spray marker = 0xBEEF0002 through selector 10
submit repeated async scaler operations on spray connections
wait for SpringBoard/compositor scheduler trigger
相关源码文件为 ScalerTeardownUAF.m。
xcrun -sdk iphoneos clang -framework Foundation -framework UIKit -framework IOKit \
-framework IOSurface -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-arch arm64 -arch arm64e -miphoneos-version-min=16.0 -fobjc-arc \
-o iPhoneProbe.app/iPhoneProbe ScalerTeardownUAF.m
ldid -S entitlements.plist iPhoneProbe.app/iPhoneProbe
mkdir -p /tmp/pkg/Payload
cp -r iPhoneProbe.app /tmp/pkg/Payload/
cd /tmp/pkg && zip -qr ScalerTeardownUAF.ipa Payload
AppleM2ScalerCSCDriver 行为时首次发现崩溃。0xDEAD0001,喷射 0xBEEF0002。| 文件 | 描述 |
|---|
ScalerTeardownUAF.m | 实现受害者关闭 + 喷射重用序列的 Objective-C PoC 源码。 |
ScalerTeardownUAF.ipa | 构建好的 IPA 复现产物。 |
entitlements.plist | 包含 get-task-allow 的最小化 entitlement 文件。 |