FlawOpen

flawopen.com/Teardowns/cve-2024-33066-qualcomm-wlan-log-redirection

● CVE-2024-33066 · CVSS 9.8 · Kritis
Riset Keamanan · FlawOpen

CVE-2024-33066: cacat pengalihan log WLAN Qualcomm

CVE-2024-33066 dapat merusak memori saat WLAN Resource Manager Qualcomm mengalihkan log ke path pilihan pemanggil. Diperbaiki pada Oktober 2024.

💡 Penjelasan Sederhana (ELI5)

Bayangkan meja resepsionis hotel yang membiarkan siapa pun menelepon dan berkata, "Mulai sekarang, kirim salinan buku tamu ke alamat ini." Resepsionis menyalin apa pun yang didiktekan ke kartu kecil, bahkan ketika tulisannya meluber keluar kartu sampai ke meja, lalu mengirim salinannya ke tempat yang tertulis, termasuk brankas manajer. Perbaikannya adalah hanya menerima label pendek yang menyebut satu laci di ruang arsip.

Konsep Kunci & Istilah

WLAN Resource Manager
Komponen Wi-Fi yang disebut dalam imbauan Qualcomm tentang CVE-2024-33066. Komponen ini berjalan di platform jaringan Qualcomm yang dipakai pada router, sistem mesh, dan titik akses.
Chipset IPQ / QCN
Keluarga system-on-chip jaringan Wi-Fi milik Qualcomm. Daftar yang terdampak mencakup IPQ5332, IPQ8074A, IPQ9574, QCN9000, dan platform Immersive Home, bukan chipset ponsel.
CWE-20
Validasi masukan yang tidak tepat: perangkat lunak memercayai masukan tanpa memeriksa apakah masukan itu memiliki sifat yang diandalkan kode, seperti panjang maksimum atau direktori yang diizinkan.
Pembukaan relatif direktori
Membuka berkas dengan openat() terhadap deskriptor direktori, memakai nama polos tanpa '/', sehingga hasilnya tidak mungkin berada di luar direktori itu.
Vektor CVSS 3.1
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H: dapat dijangkau lewat jaringan, kompleksitas rendah, tanpa hak istimewa maupun interaksi pengguna, dampak tinggi pada ketiga sifat (skor 9.8).

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-20

Analisis Akar Masalah (Root Cause)

Imbauan Qualcomm hanya menyebut bahwa WLAN Resource Manager mengalami korupsi memori "while redirecting log file to any file location with any file name" (CWE-20). Tujuan yang dikirim bersama permintaan pengalihan log dipakai tanpa memeriksa panjangnya maupun ke mana ia menunjuk. Kode di bawah memodelkan celah validasi masukan itu; kode ini bersifat ilustratif dan bukan kode sumber Qualcomm.

Alur Serangan Langkah demi Langkah

Langkah 1

1. Permintaan pengalihan log tiba

WLAN Resource Manager menerima permintaan untuk mengirim keluaran lognya ke tempat lain. Vektor CVSS (AV:N/PR:N/UI:N) menilai celah ini dapat dijangkau lewat jaringan tanpa hak istimewa dan tanpa interaksi pengguna.

Langkah 2

2. Lokasi dan nama apa pun diterima

Menurut deskripsi Qualcomm, pengalihan berfungsi ke lokasi mana pun dan dengan nama berkas apa pun: tujuan yang diminta tidak diperiksa panjangnya maupun ke mana ia menunjuk.

Langkah 3

3. Masukan yang tidak diperiksa merusak memori

Dalam model di bawah, nama yang lebih panjang dari buffer jalur berukuran tetap akan meluap (strcpy), dan jalur apa pun, termasuk berkas konfigurasi, dapat dibuka untuk ditulis. Qualcomm tidak memublikasikan kasus mana yang terjadi di kodenya.

Langkah 4

4. Dampak dan status

CVSS 3.1 menilai dampak pada kerahasiaan, integritas, dan ketersediaan sebagai tinggi (9.8). Qualcomm mengirim perbaikan ke produsen perangkat dalam buletin Oktober 2024; triase CISA tidak mencatat eksploitasi yang diketahui.

Kode Sumber: Rentan vs Aman

Model ilustratif dari kelas kerentanan ini, bukan kode Qualcomm. Handler yang diperkuat membatasi masukan dengan strnlen sebelum memakainya, hanya menerima nama pendek dari himpunan karakter tetap (tanpa '/', tanpa '.' di awal), lalu membukanya dengan openat() relatif terhadap direktori log yang dipilih saat mulai, dengan O_NOFOLLOW agar symlink yang ditanam tidak membelokkan penulisan. Pemanggil boleh memilih nama berkas, tetapi tidak pernah lokasinya, dan masukan yang terlalu panjang ditolak alih-alih disalin.

IMPLEMENTASI RENTAN
#include <fcntl.h>
#include <string.h>

#define LOG_PATH_MAX 64

struct rm_log_cfg {
    char path[LOG_PATH_MAX];
    int fd;
};

/* Menangani permintaan "redirect log"; `requested` berasal dari isi permintaan. */
int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
    strcpy(cfg->path, requested);   /* tanpa pemeriksaan panjang: input panjang melampaui batas path[] */
    cfg->fd = open(cfg->path, O_WRONLY | O_CREAT | O_APPEND, 0644);  /* lokasi mana pun */
    return cfg->fd < 0 ? -1 : 0;
}
PERBAIKAN AMAN & KUAT
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#define LOG_NAME_MAX 32

struct rm_log_cfg {
    int dir_fd;                /* direktori log tetap, dibuka sekali saat proses dimulai */
    char name[LOG_NAME_MAX];
    int fd;
};

static int valid_log_name(const char *name, size_t len)
{
    if (len == 0 || len >= LOG_NAME_MAX || name[0] == '.')
        return 0;
    for (size_t i = 0; i < len; i++) {
        char c = name[i];
        int ok = (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
                 c == '-' || c == '_' || c == '.';
        if (!ok)
            return 0;          /* menolak '/', sehingga nama tidak dapat keluar dari dir_fd */
    }
    return 1;
}

int rm_set_log_destination(struct rm_log_cfg *cfg, const char *requested)
{
    size_t len = strnlen(requested, LOG_NAME_MAX);
    if (!valid_log_name(requested, len))
        return -EINVAL;

    int fd = openat(cfg->dir_fd, requested,
                    O_WRONLY | O_CREAT | O_APPEND | O_NOFOLLOW | O_CLOEXEC, 0600);
    if (fd < 0)
        return -errno;

    memcpy(cfg->name, requested, len + 1);
    if (cfg->fd >= 0)
        close(cfg->fd);
    cfg->fd = fd;
    return 0;
}

Daftar Periksa Penguatan Sistem Rekayasa

Sumber