Kerentanan dalam kernel Linux yang dapat mengutak-atik file read-only

Kerentanan telah diidentifikasi di kernel Linux (CVE-2022-0847) yang memungkinkan penimpaan konten cache halaman untuk file apa pun, termasuk yang dalam mode hanya-baca, dibuka dengan bendera O_RDONLY, atau terletak di sistem file yang dipasang di mode hanya baca. Di sisi praktis, kerentanan dapat digunakan untuk menyuntikkan kode ke dalam proses arbitrer atau merusak data dalam file yang dibuka. Misalnya, Anda dapat mengubah konten file authorized_keys untuk proses sshd. Eksploitasi prototipe tersedia untuk pengujian.

Masalahnya diberi nama kode Dirty Pipe, dengan analogi dengan kerentanan kritis Dirty COW yang teridentifikasi pada tahun 2016. Perlu dicatat bahwa Dirty Pipe berada pada level yang sama dengan Dirty COW dalam hal bahaya, tetapi jauh lebih mudah dioperasikan. Kerentanan diidentifikasi selama analisis keluhan tentang kerusakan berkala pada file yang diunduh melalui jaringan dalam sistem yang mengunduh arsip terkompresi dari server log (37 kerusakan dalam 3 bulan pada sistem yang dimuat), yang disiapkan menggunakan operasi splice() dan pipa tanpa nama.

Kerentanan telah muncul sejak kernel Linux 5.8, dirilis pada Agustus 2020, yaitu. hadir di Debian 11 tetapi tidak memengaruhi kernel dasar di Ubuntu 20.04 LTS. Kernel RHEL 8.x dan openSUSE/SUSE 15 awalnya didasarkan pada cabang-cabang lama, tetapi ada kemungkinan bahwa perubahan yang menyebabkan masalah telah di-backport ke mereka (belum ada data pasti). Anda dapat mengikuti publikasi pembaruan paket dalam distribusi di halaman ini: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Perbaikan untuk kerentanan telah diusulkan dalam rilis 5.16.11, 5.15.25, dan 5.10.102. Perbaikan juga termasuk dalam kernel yang digunakan di platform Android.

Kerentanan disebabkan oleh kurangnya inisialisasi nilai β€œbuf->flags” dalam kode fungsi copy_page_to_iter_pipe() dan push_pipe(), meskipun memori tidak dihapus saat struktur dialokasikan, dan dengan beberapa manipulasi dengan pipa tanpa nama, "buf->flags" mungkin berisi nilai dari operasi lain. Dengan menggunakan fitur ini, pengguna lokal yang tidak memiliki hak istimewa dapat mencapai tampilan nilai PIPE_BUF_FLAG_CAN_MERGE di bendera, yang memungkinkan Anda untuk menimpa data di cache halaman hanya dengan menulis data baru ke pipa (pipa) tanpa nama yang disiapkan secara khusus.

Untuk serangan, file target harus dapat dibaca, dan karena hak akses tidak diperiksa saat menulis ke pipa, penggantian cache halaman dapat dilakukan, termasuk untuk file yang terletak di partisi yang dipasang hanya-baca (misalnya, untuk file c CD ROM). Setelah mengganti informasi di cache halaman, proses, saat membaca data dari file, tidak akan menerima yang sebenarnya, tetapi data yang diganti.

Operasi turun untuk membuat pipa tanpa nama dan mengisinya dengan data sewenang-wenang untuk mencapai pengaturan flag PIPE_BUF_FLAG_CAN_MERGE di semua struktur cincin yang terkait dengannya. Selanjutnya, data dibaca dari pipa, tetapi flag tetap disetel di semua contoh struktur pipe_buffer di struktur cincin pipe_inode_info. Kemudian panggilan splice() dilakukan untuk membaca data dari file target ke dalam pipa tanpa nama, mulai dari offset yang diperlukan. Saat data ditulis ke pipa tanpa nama ini, flag PIPE_BUF_FLAG_CAN_MERGE akan menimpa data di cache halaman alih-alih membuat instance baru dari struktur pipe_buffer.

Sumber: opennet.ru

Tambah komentar