Ang kahinaan sa Linux kernel na nagbibigay-daan sa mga read-only na file na masira

Natukoy ang isang kahinaan sa Linux kernel (CVE-2022-0847) na nagbibigay-daan sa mga nilalaman ng cache ng pahina na ma-overwrite para sa anumang mga file, kabilang ang mga nasa read-only na mode, binuksan gamit ang O_RDONLY na flag, o matatagpuan sa mga file system naka-mount sa read-only na mode. Sa praktikal na mga termino, ang kahinaan ay maaaring gamitin upang mag-inject ng code sa mga arbitrary na proseso o masira ang data sa mga binuksan na file. Halimbawa, maaari mong baguhin ang mga nilalaman ng authorized_keys file para sa proseso ng sshd. Ang isang prototype ng pagsasamantala ay magagamit para sa pagsubok.

Ang problema ay na-codenamed na Dirty Pipe, katulad ng kritikal na kahinaan na natukoy na Dirty COW noong 2016. Napansin na sa mga tuntunin ng antas ng panganib, ang Dirty Pipe ay nasa parehong antas ng Dirty COW, ngunit mas madaling patakbuhin. Natukoy ang kahinaan sa panahon ng pagsusuri ng mga reklamo tungkol sa pana-panahong katiwalian ng mga file na na-download sa network sa isang system na nagda-download ng mga naka-compress na archive mula sa isang log server (37 mga katiwalian sa loob ng 3 buwan sa isang load system), ang paghahanda nito ay ginamit ang splice() na operasyon. at hindi pinangalanang mga tubo.

Lumilitaw ang kahinaan simula sa Linux kernel 5.8, na inilabas noong Agosto 2020, i.e. naroroon sa Debian 11, ngunit hindi nakakaapekto sa base kernel sa Ubuntu 20.04 LTS. Ang mga kernel ng RHEL 8.x at openSUSE/SUSE 15 ay unang nakabatay sa mga lumang sangay, ngunit posibleng ang pagbabagong nagdulot ng problema ay nai-backport sa kanila (wala pang eksaktong data). Maaari mong subaybayan ang paglalathala ng mga update sa package sa mga pamamahagi sa mga pahinang ito: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Ang isang pag-aayos para sa kahinaan ay iminungkahi sa mga release 5.16.11, 5.15.25 at 5.10.102. Ang pag-aayos ay kasama rin sa kernel na ginamit sa Android platform.

Ang kahinaan ay sanhi ng kakulangan ng pagsisimula ng "buf->flags" na halaga sa code ng mga function copy_page_to_iter_pipe() at push_pipe(), sa kabila ng katotohanan na ang memorya ay hindi na-clear kapag naglalaan ng isang istraktura at sa panahon ng ilang mga manipulasyon sa hindi pinangalanang mga tubo, isang halaga mula sa isa pang operasyon. Gamit ang feature na ito, makakamit ng isang walang pribilehiyong lokal na user ang hitsura ng PIPE_BUF_FLAG_CAN_MERGE na halaga sa flag, na nagbibigay-daan sa iyong ayusin ang pag-overwrit ng data sa cache ng page sa pamamagitan lamang ng pagsusulat ng bagong data sa isang espesyal na inihandang hindi pinangalanang pipe.

Para sa isang pag-atake, ang target na file ay dapat na nababasa, at dahil ang mga karapatan sa pag-access ay hindi nasuri kapag sumusulat sa pipe, ang pagpapalit sa cache ng pahina ay maaari ding gawin para sa mga file na matatagpuan sa mga partisyon na naka-mount na read-only (halimbawa, para sa mga file c CD- ROM). Pagkatapos palitan ang impormasyon sa cache ng pahina, kapag nagbabasa ng data mula sa isang file, ang proseso ay hindi makakatanggap ng aktwal na data, ngunit ang pinalitan na data.

Ang operasyon ay bumababa sa paglikha ng isang hindi pinangalanang channel at pagpuno dito ng arbitrary na data upang matiyak na ang PIPE_BUF_FLAG_CAN_MERGE na bandila ay nakatakda sa lahat ng istruktura ng singsing na nauugnay dito. Susunod, binabasa ang data mula sa channel, ngunit ang flag ay nananatiling nakatakda sa lahat ng pagkakataon ng pipe_buffer structure sa pipe_inode_info ring structures. Ang isang tawag sa splice() ay ginawa upang basahin ang data mula sa target na file sa isang hindi pinangalanang pipe, simula sa nais na offset. Kapag nagsusulat ng data sa hindi pinangalanang pipe na ito, dahil sa PIPE_BUF_FLAG_CAN_MERGE na flag na itinatakda, ang data sa cache ng page ay ma-overwrite sa halip na gumawa ng bagong instance ng pipe_buffer structure.

Pinagmulan: opennet.ru

Magdagdag ng komento