Zraniteľnosť v jadre Linuxu, ktorá môže manipulovať so súbormi iba na čítanie

V linuxovom jadre (CVE-2022-0847) bola identifikovaná chyba zabezpečenia, ktorá umožňuje prepísať obsah vyrovnávacej pamäte stránok pre ľubovoľné súbory vrátane tých, ktoré sú v režime iba na čítanie, otvorené s príznakom O_RDONLY alebo umiestnené na súborových systémoch pripojených v režim iba na čítanie. Z praktickej stránky by sa zraniteľnosť mohla použiť na vloženie kódu do ľubovoľných procesov alebo na poškodenie údajov v otvorených súboroch. Môžete napríklad zmeniť obsah súboru author_keys pre proces sshd. Na testovanie je k dispozícii prototyp exploitu.

Problém dostal kódové označenie Dirty Pipe, analogicky s kritickou zraniteľnosťou Dirty COW identifikovanou v roku 2016. Je potrebné poznamenať, že Dirty Pipe je na rovnakej úrovni ako Dirty COW, pokiaľ ide o nebezpečenstvo, ale je oveľa jednoduchšie ovládať. Zraniteľnosť bola identifikovaná pri analýze sťažností na pravidelné poškodenie súborov sťahovaných cez sieť v systéme, ktorý sťahuje komprimované archívy z log servera (37 poškodení za 3 mesiace na načítanom systéme), ktoré boli pripravené pomocou operácie splice() a nepomenované fajky.

Zraniteľnosť sa prejavuje už od jadra Linuxu 5.8, vydaného v auguste 2020, t.j. je prítomný v Debiane 11, ale neovplyvňuje základné jadro v Ubuntu 20.04 LTS. Jadrá RHEL 8.xa openSUSE/SUSE 15 sú pôvodne založené na starých vetvách, ale je možné, že zmena spôsobujúca problém bola do nich backportovaná (zatiaľ žiadne presné údaje). Publikovanie aktualizácií balíkov v distribúciách môžete sledovať na týchto stránkach: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Oprava tejto chyby zabezpečenia bola navrhnutá vo vydaniach 5.16.11, 5.15.25 a 5.10.102. Oprava je zahrnutá aj v jadre používanom na platforme Android.

Zraniteľnosť je spôsobená nedostatočnou inicializáciou hodnoty „buf->flags“ v kóde funkcií copy_page_to_iter_pipe() a push_pipe() napriek skutočnosti, že pamäť nie je vyčistená pri prideľovaní štruktúry a s určitými manipulácie s nepomenovanými potrubiami, „buf->flags“ môžu obsahovať hodnotu z inej operácie. Pomocou tejto funkcie môže neprivilegovaný lokálny používateľ dosiahnuť vzhľad hodnoty PIPE_BUF_FLAG_CAN_MERGE v príznaku, čo vám umožňuje prepísať údaje vo vyrovnávacej pamäti stránok jednoduchým zápisom nových údajov do špeciálne pripraveného nepomenovaného potrubia (pipe).

V prípade útoku musí byť cieľový súbor čitateľný, a keďže sa pri zápise do kanála nekontrolujú prístupové práva, je možné vykonať nahradenie vo vyrovnávacej pamäti stránok, a to aj pre súbory umiestnené v oddieloch pripojených len na čítanie (napríklad pre súbory c CD-ROM). Po nahradení informácií vo vyrovnávacej pamäti stránok proces pri čítaní údajov zo súboru neprijme skutočné, ale nahradené údaje.

Operácia spočíva v vytvorení nepomenovaného potrubia a jeho naplnení ľubovoľnými údajmi, aby sa dosiahlo nastavenie príznaku PIPE_BUF_FLAG_CAN_MERGE vo všetkých kruhových štruktúrach, ktoré sú s ním spojené. Ďalej sa údaje načítajú z potrubia, ale príznak zostáva nastavený vo všetkých inštanciách štruktúry pipe_buffer v kruhových štruktúrach pipe_inode_info. Potom sa uskutoční volanie splice() na čítanie údajov z cieľového súboru do nepomenovaného kanála, počnúc požadovaným posunom. Keď sa údaje zapíšu do tohto nepomenovaného kanála, príznak PIPE_BUF_FLAG_CAN_MERGE prepíše údaje vo vyrovnávacej pamäti stránok namiesto vytvorenia novej inštancie štruktúry pipe_buffer.

Zdroj: opennet.ru

Pridať komentár