flawopen.com/Teardowns/cve-2024-21626-runc-container-breakout-leaky-vessels
CVE-2024-21626: cara runc memperbaiki pelarian Leaky Vessels
CVE-2024-21626 menggabungkan kebocoran deskriptor file internal di runc dengan tidak adanya pemeriksaan batas setelah chdir. Bergantung pada jalur peluncuran, container dapat dimulai dengan direktori kerja di namespace host atau mencapai file host melalui jalur exec terkait.[1], [2], [3]
runc menyiapkan ruang terisolasi untuk container. Handle internal yang bocor dapat membuat direktori kerja terpilih menunjuk ke luar ruang itu; pemeriksaan batas akhir dan penutupan handle internal memutus jalur tersebut.[1], [2]
Konsep Kunci & Istilah
runc- Runtime OCI untuk membuat dan menjalankan container.[1]
Deskriptor file internal- Handle sistem operasi untuk file atau direktori yang terbuka. Deskriptor yang masih terbuka saat proses anak dijalankan dapat mempertahankan akses lintas batas proses.[1], [3]
cwd- Direktori kerja proses. Di Linux, Getwd dapat mengembalikan ENOENT jika direktori berada di luar root namespace mount.[1], [2]
Pelarian container- Jalur yang memungkinkan proses container mencapai sumber daya host di luar batas isolasinya.[1]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-403
Analisis Akar Masalah (Root Cause)
Sebelum runc 1.1.12, deskriptor file internal dapat bocor ke runc init. Deskriptor itu berada di internal runc init, bukan sekadar diwariskan oleh proses container. Pada serangan 1 dan 2, direktori kerja yang dikonfigurasi atau dipilih dapat diresolusikan melalui handle namespace mount host; setelah chdir, runc tidak memeriksa bahwa cwd akhir masih berada di dalam root container. Varian terpisah memanfaatkan penanganan jalur execve untuk menimpa biner host. Rilis 1.1.12 menambahkan empat lapisan: memeriksa cwd dengan perilaku Getwd/ENOENT Linux, menutup deskriptor internal tepat sebelum execve, memperbaiki kebocoran yang diketahui, dan menandai deskriptor non-stdio sebagai close-on-exec sebelum menjalankan runc init.[1], [2], [3], [4]
CVE-2024-21626: varian serangan dan perlindungan terkait di runc 1.1.12
| Varian advisori | Kondisi dan batas yang diperlukan | Perbaikan atau mitigasi sementara |
|---|---|---|
Serangan 1 — image berbahaya melalui runc run | Pengguna berprivilege harus tertipu untuk menjalankan image tak tepercaya. Direktori kerja yang dikonfigurasi dapat diresolusikan di luar namespace mount container. | Pemeriksaan unix.Getwd() setelah chdir gagal jika cwd berada di luar root namespace. Sebagai mitigasi sementara, izinkan hanya cwd / untuk image tak tepercaya. |
Serangan 2 — proses container dengan runc exec | Proses di dalam container harus mengantisipasi cwd selain / yang akan dipilih administrator melalui runc exec --cwd, lalu menyiapkan path terkait sebelum eksekusi. | Pemeriksaan cwd yang sama setelah chdir mencegah eksekusi di luar container. Batasi --cwd ke / sampai diperbarui. |
| Serangan 3a — penimpaan biner host saat image dijalankan | Varian ini mengadaptasi serangan 1 dan tetap memerlukan pengguna berprivilege untuk menjalankan image berbahaya; jalurnya melintasi batas execve menuju biner host. | Tutup deskriptor internal runc tepat sebelum execve, perbaiki kebocoran yang diketahui, dan tetapkan O_CLOEXEC. Perbarui ke runc 1.1.12 atau versi yang diperbaiki vendor. |
Serangan 3b — penimpaan biner host melalui runc exec | Varian ini mengadaptasi serangan 2 dan dimulai dari proses berbahaya di container aktif yang dapat dipengaruhi penyerang; administrator berprivilege tetap harus menjalankan operasi runc exec biasa pada container tersebut. Advisori menyebut jalur ini memerlukan lebih sedikit interaksi pengguna dibanding jalur image. | Perlindungan penutupan sebelum execve dan close-on-exec menangani jalur berbeda ini. Maintainer tidak menyebut workaround praktis; perbarui. |
Alur Serangan Langkah demi Langkah
Dampak dan kondisi
Advisori mendokumentasikan akses sistem berkas dan kendali host pada empat varian. Serangan berbasis image memerlukan pengguna berprivilege menjalankan image tak tepercaya. Serangan 3b tetap memerlukan administrator menjalankan operasi runc exec biasa pada container yang dapat dipengaruhi penyerang.[1]
Kode Sumber: Rentan vs Aman
// Perilaku sebelum perbaikan yang disederhanakan; bukan sumber runc verbatim
if err := os.Chdir(config.Cwd); err != nil {
return err
}
// Yang kurang: verifikasi cwd akhir berada di dalam root namespace
// Pemeriksaan batas runc 1.1.12 (cuplikan upstream)
if wd, err := unix.Getwd(); errors.Is(err, unix.ENOENT) {
return errors.New("cwd berada di luar root namespace mount container")
} else if err != nil {
return fmt.Errorf("keamanan cwd tidak dapat diverifikasi: %w", err)
} else if !filepath.IsAbs(wd) {
return fmt.Errorf("cwd bukan path absolut: %q", wd)
}
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Perbarui runc ke 1.1.12 atau versi lebih baru yang didukung vendor; verifikasi versi runtime efektif di setiap image node.[1], [4]
- ✓Perlakukan image container tak tepercaya sebagai permintaan eksekusi kode; batasi siapa yang boleh menjalankannya melalui Docker, Kubernetes, dan pipeline build.[1]
- ✓Dalam implementasi runtime, periksa cwd setelah chdir dengan pemeriksaan root namespace yang didukung platform dan gagal secara aman jika ada kesalahan.[1], [2]
- ✓Tetapkan O_CLOEXEC pada deskriptor internal dan tutup deskriptor non-stdio pada titik aman terakhir sebelum exec, dengan memperhitungkan deskriptor runtime.[1], [3]
- ✓Jangan menganggap user namespace sebagai pengganti patch runc; gunakan sebagai lapisan isolasi tambahan bila tersedia.[1]