Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
streambox-cve-2026-28618 — CVE-2026-28618 / StreamBox APV 랩 관련 편집된 노트 — FRAME 높이 불일치를 통한 세션 객체로의 힙 쓰기 | Kitploit
도구/GitHubGitHub/raafatabualazm/streambox-cve-2026-28618
Android SecurityMemory ForensicsVulnerability AnalysisExploitationReverse EngineeringMobile SecurityPapers & ResearchLearning & EducationBinary Exploitation

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHubraafatabualazm/streambox-cve-2026-28618

streambox-cve-2026-28618

CVE-2026-28618 / StreamBox APV 랩 관련 편집된 노트 — FRAME 높이 불일치를 통한 세션 객체로의 힙 쓰기

저장소 보기
2시간 54분 전아직 검토되지 않음

공유 클립을 자동 재생하는 플레이어에서의 제로클릭 APV

StreamBox의 CVE-2026-28618 — 실제 공격에 사용된 Android APV RCE와 동일한 디코더 클래스를 세션 객체에 대한 힙 쓰기로 전환한 것입니다.

이 저장소는 공개된 편집(redacted) 분석 문서입니다: 플래그, 인스턴스 토큰, HMAC 키는 생략되었습니다. APK와 make_clip.py는 Mobile Hacking Lab에 속하며, 여기에 미러링되지 않았습니다.

공격 체인

우리가 해결한 것

StreamBox는 작은 APV 플레이어입니다. APV는 Advanced Professional Video (RFC 9924)로, 삼성의 로열티 없는 코덱이며 Android 미디어 스택에 탑재된 것과 같은 계열입니다. 랩의 핵심 설명은 한 문장입니다: 플레이어는 공유된 클립을 도착하면 재생한다.

SEND, VIEW, 또는 streambox://?url=…은 파일을 files/incoming.apv에 떨어뜨리고 NativeDec.loadClip()이 실행됩니다. 클립에 추가 탭이 필요 없습니다.

버그는 CVE-2026-28618입니다: OpenAPV의 dec_frm_prepare에 있는 힙 버퍼 오버플로입니다. 올해 초 실제 공격에 사용된 제로클릭 APV RCE인 CVE-2026-0006과 동일한 클래스, 동일한 디코더입니다.

랩은 그 쓰기를 게임으로 포장합니다. 하드코딩된 64×64 Y 평면을 오버플로하고, 인접한 세션 객체를 덮어쓰고, teardown을 handlers[2]로 리다이렉트하면 Worker가 플래그를 돌려줍니다.

키트는 랩에서 제공하는 두 개의 zip입니다:

  • streambox-lab.apk.zip — 플레이어
  • make_clip.py.zip — 64×64 라이브러리 클립이 어떻게 만들어졌는지, 그리고 오버플로하는 비트스트림

플레이어

StreamBox 플레이어 목업, 공유 클립 자동 재생, arena와 세션을 노출하는 진단

PlayerActivity는 다음을 수행합니다:

root@kitploit:~
NativeDec.setVideoTitle(name);
status = NativeDec.loadClip(path);
// WebView bridge later calls Android.openTier(status)

openTier(1)은 부분 성공입니다 (세션이 건드려졌지만 토큰 불일치). openTier(2)는 win()입니다. PremiumActivity는 네이티브 상태를 랩에 POST합니다:

root@kitploit:~
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)을 수행했습니다. 그 토큰이 바로 오버플로가 세션에 써넣어야 하는 것입니다.

힙: 64×64 Y, 그다음 세션

0x2000 바이트의 Y 평면, 바로 뒤에 세션 객체, 추가 FRAME 행이 magic/token/handler로 오버플로

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

oapv_imgb_t는 64×64, 10-bit YUV로 하드코딩되어 있습니다. 평면 0 (Y)은 arena+0에서 시작합니다. 64 × 64 × 2 = 0x2000. pad == 0이면 세션은 Y 바로 다음 첫 바이트에 위치합니다.

oapvd_decode()는 FRAME PBU의 너비/높이에 씁니다. 64보다 높은 FRAME은 10-bit 샘플을 session에 바로 씁니다.

디코드 후:

root@kitploit:~
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 레이아웃: magic 덮어쓰기, token 일치, handler 인덱스 2

make_clip.py가 클립 경로다

랩의 생성기는 64×64 RGB 32 프레임을 그린 뒤 yuv422p10le로 변환하고, OpenAPV 참조 인코더를 호출합니다:

root@kitploit:~
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개 액세스 유닛입니다:

root@kitploit:~
[u32be au_size] ['aPv1' + PBUs] × 32

FRAME 헤더: 파일 +0x16의 u24be height를 64에서 72로 패치

플레이어는 여전히 64×64를 할당합니다. 모든 AU의 frame_height를 64 → 72로 패치하세요:

root@kitploit:~
python3 scripts/patch_frame_height.py clip_pulse.apv -o overflow_height72.apv --height 72

공유하세요 (SEND / VIEW / streambox://?url=). 자동 재생이 곧 익스플로잇입니다.

더 깔끔한 오버플로는 make_clip.py의 H를 72 또는 128로 편집하고 재인코딩하여 추가 Y 행이 실제 픽처 데이터가 되게 하는 것입니다. 너비 64의 10-bit 평면에서 행 64는 128 바이트입니다:

  • 픽셀 0–3 → 세션 magic (OBMAERTS가 아니게 되어야 함)
  • 픽셀 4–5 → 인스턴스 토큰 (g_token)
  • 픽셀 6–7 → handler 인덱스 2

APV는 손실 압축입니다; oapv_app_enc를 통한 정확한 10-bit 값은 QP 0 / 거의 무손실이 필요합니다.

상위 버그 클래스에 대한 관련 공개 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와 다른 바이트)는 쓰기로 간주됩니다.

편집된 unlock: POST /api/instance 후 POST /api/unlock이 MHL{REDACTED} 반환

root@kitploit:~
# fill TICKET_KEY in scripts/unlock.py from NativeDec.ticketKey()
python3 scripts/unlock.py

win()은 loadClip이 2를 반환할 때 플레이어가 보여주는 것입니다:

플래그가 편집된 SESSION COMPROMISED 화면

링크

  • 이 저장소: 헬퍼 스크립트 + 다이어그램
  • Android Security Bulletin — 2026년 9월 (CVE-2026-28618, A-492492028, Media Codecs)
  • CVE-2026-0006 분석 — Mobile Hacking Lab
  • CVE-2026-0006 PoC
  • OpenAPV (Academy Software Foundation)
  • AOSP 패치 — dec_frm_prepare의 차원 검증

면책 조항

Mobile Hacking Lab의 StreamBox 실습을 위한 승인된 랩 노트입니다. APK, 라이브 토큰, 플래그는 없습니다. 소유하지 않았거나 테스트 권한이 없는 대상에 대해 이 프리미티브를 실행하지 마세요.

도구 다운로드