FlawOpen

flawopen.com/Teardowns/cve-2024-7646-ingress-nginx-annotation-code-injection

● CVE-2024-7646 · CVSS 8.8 · Tinggi
Riset Keamanan · FlawOpen

CVE-2024-7646: bypass validasi Ingress-NGINX

Bypass carriage return memungkinkan injeksi perintah dan akses ke kredensial controller. Diperbaiki di 1.11.2/1.10.4; ingress-nginx kini dihentikan.

💡 Penjelasan Sederhana (ELI5)

Bayangkan penjaga yang hanya memeriksa apakah formulir memuat kata yang diizinkan, bukan seluruh nilainya. Carriage return dapat mengubah cara sistem berikutnya membaca teks yang tersisa. Di sini, anotasi lolos dari pencocokan sebagian lalu ditulis ke konfigurasi NGINX yang dihasilkan. Perbaikannya memvalidasi seluruh nilai dan menangani carriage return dengan aman.

Konsep Kunci & Istilah

Objek Ingress
Resource API Kubernetes yang menjelaskan perutean dari host atau jalur ke Service. Pengguna dapat diberi izin membuatnya tanpa menjadi admin klaster.
Bypass validasi anotasi
Nilai anotasi lolos dari validator yang hanya mencari substring yang diizinkan, tanpa mewajibkan kecocokan tepat untuk seluruh nilai.
Carriage return (`\r`)
Karakter kontrol yang digunakan sebagai pergantian baris di beberapa format. Penafsiran berbeda antara validasi dan pembuatan konfigurasi dapat mengubah batas baris.
Service account controller
Identitas Kubernetes yang digunakan controller ingress-nginx. Pemberitahuan upstream menyebut izin default dapat mencakup akses ke semua Secret klaster.

Pemetaan kerangka kerja

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

Analisis Akar Masalah (Root Cause)

CVE-2024-7646 adalah bypass validasi anotasi ingress-nginx, bukan penggunaan snippet Lua kustom tanpa batas. Validator auth-tls-verify-client menggunakan regex Go tanpa anchor awal dan akhir, sehingga MatchString dapat menerima nilai lebih panjang yang hanya memuat opsi sah sebagai substring. Carriage return di dalam anotasi kemudian dapat ditafsirkan berbeda saat konfigurasi NGINX yang dihasilkan dibersihkan. Perbaikan upstream mewajibkan kecocokan seluruh nilai dan menangani carriage return tunggal secara aman di cleanConf. Pemberitahuan keamanan Kubernetes menyatakan bahwa pelaku yang dapat membuat objek Ingress bisa melewati validasi, menyisipkan perintah, dan memperoleh kredensial controller; dalam konfigurasi default, kredensial tersebut dapat membaca semua Secret di klaster. Ini jalur API Kubernetes terautentikasi dengan tingkat keparahan tinggi (CVSS 8.8), bukan permintaan anonim dari jaringan. Proyek dihentikan pada Maret 2026; upgrade ke versi perbaikan historis hanya tindakan penahanan segera. Deployment harus bermigrasi ke controller yang masih dipelihara atau implementasi Gateway API.

Alur Serangan Langkah demi Langkah

Langkah 1

Pengguna memiliki izin membuat Ingress

Penyerang memerlukan izin API Kubernetes untuk membuat objek Ingress. Risiko paling tinggi di klaster multi-tenant yang mendelegasikan izin tersebut ke tim aplikasi.

Langkah 2

Anotasi lolos melalui pencocokan sebagian

Regex auth-tls-verify-client yang rentan tidak memiliki anchor. Karena itu Go MatchString dapat menerima nilai lebih panjang yang memuat opsi sah, bukan hanya nilai yang tepat.

Langkah 3

Carriage return mengubah batas konfigurasi

Anotasi dimasukkan ke konfigurasi NGINX yang dihasilkan. Rangkaian patch memperbaiki validasi seluruh nilai dan penanganan carriage return tunggal saat konfigurasi dibersihkan.

Langkah 4

Identitas controller terekspos

Pemberitahuan Kubernetes menyatakan injeksi perintah dapat memperoleh kredensial controller. Secara default service account dapat membaca semua Secret; dampak bergantung pada RBAC yang diterapkan.

Kode Sumber: Rentan vs Aman

Cuplikan ini berasal dari perbaikan upstream CVE-2024-7646: PR #11719 memberi anchor pada nilai auth-tls-verify-client yang diizinkan, dan PR #11721 menangani carriage return tunggal dalam cleanConf. Cabang 1.10 menerima perubahan terkait melalui PR #11718 dan #11722. Konteks fungsi yang tidak relevan dihilangkan.

IMPLEMENTASI RENTAN
// internal/ingress/annotations/authtls/main.go (sebelum perbaikan)
authVerifyClientRegex = regexp.MustCompile(`on|off|optional|optional_no_ca`)

// internal/ingress/controller/template/template.go (sebelum perbaikan)
switch c {
case ' ', '\t':
    needOutput = lineStarted
case '\n':
    needOutput = !(!lineStarted && emptyLineWritten)
    nextLineStarted = false
}
PERBAIKAN AMAN & KUAT
// internal/ingress/annotations/authtls/main.go (diperbaiki)
authVerifyClientRegex = regexp.MustCompile(`^(on|off|optional|optional_no_ca)$`)

// internal/ingress/controller/template/template.go (diperbaiki)
switch c {
case '\r':
    rest := in.Bytes()
    if len(rest) > 0 && rest[0] != '\n' {
        c = ' '
        needOutput = lineStarted
    }
case '\n':
    needOutput = !(!lineStarted && emptyLineWritten)
    nextLineStarted = false
}

Daftar Periksa Penguatan Sistem Rekayasa

Sumber