flawopen.com/Teardowns/cve-2024-7646-ingress-nginx-annotation-code-injection
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.
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
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.
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.
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.
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.
// 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
}
// 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
- ✓Batasi izin RBAC Kubernetes untuk membuat atau mengubah objek Ingress, terutama di klaster multi-tenant; izin ini dapat mencapai jalur yang rentan.
- ✓Untuk penahanan historis, upgrade ke ingress-nginx 1.11.2 atau lebih baru pada jalur 1.11, atau 1.10.4 atau lebih baru pada jalur 1.10. Periksa versi image dan chart vendor secara tepat.
- ✓Periksa log audit Kubernetes untuk anotasi Ingress dengan carriage return (
\r), termasuknginx.ingress.kubernetes.io/auth-tls-verify-client, sesuai petunjuk upstream. - ✓Jangan anggap
allow-snippet-annotations: "false"sebagai perbaikan CVE ini: jalur yang terdampak adalah validasi anotasi dan penanganan baris konfigurasi, bukan hanya fitur snippet opsional. - ✓Ingress NGINX dihentikan pada Maret 2026. Rencanakan migrasi ke controller terpelihara atau implementasi Gateway API; patch historis tidak menyediakan pembaruan keamanan selanjutnya.
Sumber
- Respons keamanan Kubernetes — CVE-2024-7646: cakupan, versi, deteksi, dan mitigasi
- Perbaikan upstream — anchor nilai auth-tls-verify-client (PR #11719)
- Perbaikan upstream — bersihkan carriage return pada konfigurasi (PR #11721)
- NVD — CVE-2024-7646
- Kubernetes — penghentian Ingress NGINX dan panduan migrasi
- MITRE CWE-20 — validasi input yang tidak tepat