FlawOpen

flawopen.com/Teardowns/cve-2024-21626-runc-container-breakout-leaky-vessels

● CVE-2024-21626 · CVSS 8.6[1], [5] · Tinggi
Riset Keamanan · FlawOpen

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]

💡 Penjelasan Sederhana (ELI5)

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 advisoriKondisi dan batas yang diperlukanPerbaikan atau mitigasi sementara
Serangan 1 — image berbahaya melalui runc runPengguna 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 execProses 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 dijalankanVarian 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 execVarian 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

Langkah 1

Handle internal bocor

Saat persiapan, deskriptor internal runc yang merujuk ke namespace mount host dapat tetap tersedia bagi runc init.[1], [3]

Langkah 2

Jalur direktori kerja dapat dicapai

Image berbahaya atau alur runc exec dengan kondisi tertentu dapat membuat cwd yang diminta berada di luar root container.[1], [2]

Langkah 3

Pemeriksaan batas tidak ada

Kode lama tidak memverifikasi cwd akhir setelah chdir; varian terkait menyalahgunakan penanganan jalur execve untuk menimpa biner host.[2], [3]

Langkah 4

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

IMPLEMENTASI RENTAN
// 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
PERBAIKAN AMAN & KUAT
// 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

Sumber