FlawOpen

flawopen.com/Incidents/citrix-bleed-session-token-leak-october-2023

● Citrix · CVE-2023-4966 · October 2023 · CVSS 9.4 · Kritis
Riset Keamanan · FlawOpen

Citrix Bleed: kebocoran token sesi dan bypass MFA

CVE-2023-4966 membocorkan memori NetScaler, termasuk token sesi, sehingga sesi dapat dibajak tanpa MFA. Eksploitasi dimulai pada akhir Agustus 2023.[1], [2]

💡 Penjelasan Sederhana (ELI5)

Anda meminta asisten menyalin pesan ke kartu kecil dan memberi tahu panjangnya. Kartu itu hanya muat 50 karakter, jadi ia menulis 50, tetapi saat ditanya panjangnya ia menjawab jujur "800 karakter", karena begitulah panjang aslinya. Lalu Anda memberikan kartu itu kepada orang lain dan menyuruhnya membaca 800 karakter. Ia membaca 50 karakter Anda, lalu terus membaca apa pun yang tertulis di sisa lembaran.[2]

Konsep Kunci & Istilah

snprintf
Fungsi C yang memformat teks ke buffer berukuran tetap. Jika teks tidak muat, fungsi ini memotongnya, tetapi mengembalikan panjang yang seharusnya dimiliki teks lengkap.[3]
NetScaler ADC / Gateway
Perangkat Citrix yang menyediakan akses jarak jauh dan penyeimbangan beban di tepi jaringan. Hanya yang dikonfigurasi sebagai Gateway atau server virtual AAA yang terdampak.[1]
Pembacaan di luar batas buffer (CWE-125)
Membaca melewati ujung buffer. Tidak ada yang ditimpa, tetapi isi memori di sebelahnya ikut terungkap. Ini menjelaskan mekanisme pembacaan di luar batas yang spesifik (CWE-125); Citrix mengklasifikasikan CVE-2023-4966 secara umum sebagai CWE-119.[1], [3]
Token sesi
Nilai yang membuktikan bahwa pengguna sudah masuk. Siapa pun yang menunjukkannya diperlakukan sebagai pengguna itu, tanpa diminta kata sandi atau MFA.[2]

Pemetaan kerangka kerja

Kronologi Insiden

2023-08

Menurut laporan penanganan insiden yang terbit kemudian, eksploitasi celah ini sebagai zero-day dimulai.[2]

2023-10-10

Citrix menerbitkan buletin CTX579459 dengan build perbaikan 14.1-8.50, 13.1-49.15, dan 13.0-92.19.[1]

2023-10-18

CISA memasukkan CVE-2023-4966 ke katalog Known Exploited Vulnerabilities.[4]

Alur Serangan Langkah demi Langkah

Langkah 1

Header yang terlalu besar

Permintaan tanpa autentikasi dengan header Host yang sangat panjang mencapai kode yang menyusun respons penemuan OpenID Connect pada perangkat.[2], [3]

Langkah 2

Panjangnya salah dibaca

snprintf memotong teks agar muat di buffer, tetapi mengembalikan panjang penuh yang seharusnya, dan kode memperlakukannya sebagai jumlah byte yang ditulis.[3], [2]

Langkah 3

Memori di luar buffer terkirim

Respons dikirim dengan panjang yang lebih besar itu, sehingga perangkat mengembalikan memori di sebelahnya bersama JSON yang terpotong.[2]

Langkah 4

Sesi diambil alih

Memori yang bocor dapat berisi token sesi yang valid. Dengan memakai ulang salah satunya, penyerang mendapatkan sesi pengguna tanpa kata sandi dan MFA.[2], [1]

Kode Sumber: Rentan vs Aman

Kode C ilustratif, bukan kode sumber NetScaler. Perbaikannya memeriksa nilai kembali snprintf, yang menunjukkan panjang keluaran lengkap seandainya seluruhnya ditulis. Jika nilainya negatif atau sama dengan maupun lebih besar dari ukuran buffer, pemformatan gagal atau terpotong sehingga fungsi tidak mengirim apa pun. Dengan demikian, panjang hanya diteruskan ke send_response jika respons lengkap muat di buf.[3], [2]

IMPLEMENTASI RENTAN
#include <stdio.h>

int send_response(const char *data, int len);

int send_oidc_config(const char *host)
{
    char buf[256];
    /* n adalah jumlah byte yang seharusnya ditulis dan dapat melebihi sizeof(buf) */
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    return send_response(buf, n);   /* mengirim n byte dengan membaca melewati buf */
}
PERBAIKAN AMAN & KUAT
#include <stdio.h>

int send_response(const char *data, int len);

int send_oidc_config(const char *host)
{
    char buf[256];
    int n = snprintf(buf, sizeof(buf), "{\"issuer\":\"https://%s\"}", host);
    if (n < 0 || (size_t)n >= sizeof(buf))
        return -1;                  /* tolak keluaran yang terpotong; jangan pernah mengirim melewati buffer */
    return send_response(buf, n);
}

Daftar Periksa Penguatan Sistem Rekayasa

Sumber