
Notas redigidas sobre CVE-2026-28618 / laboratório StreamBox APV — escrita em heap em um objeto de sessão via incompatibilidade de altura de FRAME
CVE-2026-28618 no StreamBox — a mesma classe de decoder do RCE APV do Android explorado in-the-wild, transformada em uma escrita de heap contra um objeto de sessão.
Este repositório é um writeup público e redigido: flags, tokens de instância e a chave HMAC foram omitidos. O APK e o make_clip.py pertencem ao Mobile Hacking Lab; eles não são espelhados aqui.

StreamBox é um pequeno player APV. APV é Advanced Professional Video (RFC 9924), o codec livre de royalties da Samsung, a mesma família que foi distribuída na stack de mídia do Android. A proposta do lab é uma frase: o player reproduz clipes compartilhados ao chegar.
SEND, VIEW ou streambox://?url=… coloca um arquivo em files/incoming.apv e NativeDec.loadClip() é executado. Sem toque extra no clipe.
O bug é o CVE-2026-28618: um heap buffer overflow em dec_frm_prepare do OpenAPV. Mesma classe, mesmo decoder do CVE-2026-0006, o RCE APV zero-click explorado in-the-wild no início deste ano.
O lab empacota essa escrita como um jogo. Estoure o plano Y fixo de 64×64, destrua um objeto de sessão adjacente, redirecione o teardown para handlers[2], e o Worker devolve a flag.
O kit são dois zips do lab:
streambox-lab.apk.zip — o playermake_clip.py.zip — como os clipes da biblioteca 64×64 foram construídos, e o bitstream que você estoura
PlayerActivity faz:
NativeDec.setVideoTitle(name);
status = NativeDec.loadClip(path);
// WebView bridge later calls Android.openTier(status)
openTier(1) é um acerto parcial (sessão tocada, token incompatível). openTier(2) é win(). PremiumActivity envia o estado nativo via POST para o lab:
POST /api/unlock
{
"instance_id": <from POST /api/instance>,
"tier": 3,
"session_hex": hex(sessionProof[64]),
"ticket": HMAC-SHA256(ticketKey, instance_id + ":" + session_hex)
}
Na inicialização o app já fez POST /api/instance e NativeDec.setPlatinumToken(token). Esse token é o que o overflow precisa escrever na sessão.

arena = calloc(1, 0x206040);
session = arena + pad + 0x2000;
*(uint64_t *)session = 0x53545245414D424F; /* bytes: "OBMAERTS" */
O oapv_imgb_t é fixo em 64×64, YUV de 10 bits. O plano 0 (Y) começa em arena+0. 64 × 64 × 2 = 0x2000. Com pad == 0, a sessão fica no primeiro byte após Y.
oapvd_decode() escreve na largura/altura do FRAME PBU. Um FRAME mais alto que 64 escreve amostras de 10 bits direto na session.
Após o 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;

O gerador do lab desenha 32 frames de RGB 64×64, converte para yuv422p10le e chama o encoder de referência OpenAPV:
oapv_app_enc -i anim.yuv -w 64 -h 64 -z 8 --input-csp 2 -d 10 -o out.apv -v 1
Todo clipe incluído é composto de 32 access units de FRAME 64×64:
[u32be au_size] ['aPv1' + PBUs] × 32

O player ainda aloca 64×64. Faça patch de todo frame_height de AU de 64 → 72:
python3 scripts/patch_frame_height.py clip_pulse.apv -o overflow_height72.apv --height 72
Compartilhe (SEND / VIEW / streambox://?url=). A reprodução automática é o exploit.
Um overflow mais limpo é editar H em make_clip.py para 72 ou 128 e recodificar, para que as linhas Y extras sejam dados reais de imagem. A linha 64 de um plano de 10 bits com 64 de largura tem 128 bytes:
OBMAERTS)g_token)2APV é lossy; valores exatos de 10 bits através do oapv_app_enc exigem QP 0 / quase sem perdas.
PoC público relacionado para a classe de bug pai: mobilehackinglab/CVE-2026-0006-openapv-poc.
O urllib do Python recebe Cloudflare 1010. curl com um UA de celular funciona.
O Worker rejeita o magic original com no overflow evidence: session magic intact. O ASCII STREAMBO (bytes diferentes do uint64 LE) conta como uma escrita.

# fill TICKET_KEY in scripts/unlock.py from NativeDec.ticketKey()
python3 scripts/unlock.py
win() é o que o player mostra quando loadClip retorna 2:

dec_frm_prepareNotas de lab autorizadas para o exercício StreamBox do Mobile Hacking Lab. Sem APK, sem tokens ativos, sem flag. Não execute essas primitivas contra nada que você não possua ou tenha permissão para testar.