Kerentanan dalam subsistem eBPF yang memungkinkan eksekusi kode di tingkat kernel Linux

Dua kerentanan baru telah diidentifikasi di subsistem eBPF, yang memungkinkan Anda menjalankan penangan di dalam kernel Linux di mesin virtual khusus dengan JIT. Kedua kerentanan tersebut memungkinkan eksekusi kode Anda dengan hak kernel, di luar mesin virtual eBPF yang terisolasi. Informasi tentang masalah ini dipublikasikan oleh tim Zero Day Initiative, yang menyelenggarakan kompetisi Pwn2Own, di mana tahun ini tiga serangan terhadap Ubuntu Linux ditunjukkan menggunakan kerentanan yang sebelumnya tidak diketahui (apakah kerentanan di eBPF terkait dengan serangan ini tidak dilaporkan) .

  • CVE-2021-3490 - Kerentanan ini disebabkan oleh kurangnya pemeriksaan di luar batas 32-bit saat melakukan operasi bitwise AND, OR, dan XOR di eBPF ALU32. Penyerang dapat memanfaatkan kesalahan ini untuk membaca dan menulis data di luar batas buffer yang dialokasikan. Masalah dengan operasi XOR muncul mulai dari kernel versi 5.7-rc1, dan AND dan OR - mulai dari 5.10-rc1.
  • CVE-2021-3489 - Kerentanan disebabkan oleh kesalahan dalam implementasi buffer cincin dan karena fungsi bpf_ringbuf_reserve tidak memeriksa kemungkinan ukuran wilayah memori yang dialokasikan bisa lebih kecil dari ukuran sebenarnya dari ringbuf. Masalahnya muncul sejak rilis 5.8-rc1.

Status menambal kerentanan dalam distribusi dapat dilacak di halaman berikut: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Perbaikan juga tersedia sebagai patch (CVE-2021-3489, CVE-2021-3490). Apakah masalah dapat dieksploitasi bergantung pada apakah panggilan sistem eBPF dapat diakses oleh pengguna. Misalnya, dalam konfigurasi default di RHEL, eksploitasi kerentanan mengharuskan pengguna memiliki hak CAP_SYS_ADMIN.

Secara terpisah, kami dapat mencatat kerentanan lain di kernel Linux - CVE-2021-32606, yang memungkinkan pengguna lokal untuk meningkatkan hak istimewa mereka ke tingkat root. Masalahnya sudah terlihat sejak kernel Linux 5.11 dan disebabkan oleh kondisi race dalam implementasi protokol CAN ISOTP, yang memungkinkan untuk mengubah parameter pengikatan soket karena kurangnya pengaturan kunci yang tepat pada fungsi isotp_setsockopt() saat memproses tanda CAN_ISOTP_SF_BROADCAST.

Setelah soket ISOTP ditutup, pengikatan ke soket penerima tetap berlaku, yang dapat terus menggunakan struktur yang terkait dengan soket tersebut setelah memori yang terkait dengannya dibebaskan (gunakan setelah bebas karena panggilan ke struktur isotp_sock yang telah dibebaskan ketika isotp_rcv() dipanggil). Melalui manipulasi data, Anda dapat mengganti penunjuk ke fungsi sk_error_report() dan mengeksekusi kode Anda di tingkat kernel.

Sumber: opennet.ru

Tambah komentar