Ranjivost u Linux jezgru koja omogućava izmena datoteka dostupnih samo za čitanje

V jedru Linux byla odhalena zranitelnost (CVE-2022-0847), která umožňuje přepsat obsah stránkového cache pro jakékoli soubory, včetně těch, které jsou otevřeny v režimu pouze pro čtení s příznakem O_RDONLY nebo umístěné v souborových systémech připojených v režimu pouze pro čtení. Z praktického hlediska může být zranitelnost využita k vkládání kódu do libovolných procesů nebo k poškození dat v otevíraných souborech. Například je možné změnit obsah souboru authorized_keys pro proces sshd. Pro testování je dostupný prototyp exploit.

Problém byl nazván Dirty Pipe, podle kritické zranitelnosti Dirty COW z roku 2016. Uvádí se, že z hlediska nebezpečnosti je Dirty Pipe na stejné úrovni jako Dirty COW, avšak je mnohem snazší k exploataci. Zranitelnost byla odhalena při analýze stížností na občasné poškození souborů stahovaných přes síť v systému, který načítal komprimované archivy z log-serveru (37 poškození během 3 měsíců na přetíženém systému), při jejichž přípravě byla použita operace splice() a nepojmenované roury.

Zranitelnost se projevuje od jádra Linux 5.8, vydaného v srpnu 2020, tedy je přítomna v Debianu 11, ale netýká se základního jádra v Ubuntu 20.04 LTS. Jádra RHEL 8.x a openSUSE/SUSE 15 jsou původně založena na starších větvích, nicméně nelze vyloučit, že problematická změna byla přenesena do těchto verzí (přesné údaje zatím nejsou k dispozici). Sledovat aktualizace balíčků v distribucích lze na těchto stránkách: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Oprava zranitelnosti byla navržena v verzích 5.16.11, 5.15.25 a 5.10.102. Oprava byla také zahrnuta do jádra používaného v platformě Android.

Zranitelnost je způsobena nedostatkem inicializace hodnoty "buf->flags" v kódu funkcí copy_page_to_iter_pipe() a push_pipe(), přičemž paměť při přidělení struktury není vymazána a při určitých manipulacích s nepojmenovanými rourami může v "buf->flags" být hodnota z jiné operace. Použitím této vlastnosti může nepř privileged lokální uživatel dosáhnout, že se ve flagu objeví hodnota PIPE_BUF_FLAG_CAN_MERGE, která umožňuje přepsání dat ve stránkovém cache prostřednictvím jednoduchého zápisu nových dat do speciálně připravené nepojmenované roury (pipe).

Za napad je ciljni datoteka mora biti dostopna za branje, pri čemer pa za zapis v cev (pipe) pravice dostopa niso preverjene, saj lahko zamenjava v predpomnilniku strani poteka tudi za datoteke v razdelkih, montiranih samo za branje (na primer datoteke z CD-ROM-a). Po zamenjavi informacij v predpomnilniku strani bo proces pri branju podatkov iz datoteke prejel ne dejanske, temveč zamenjane podatke.

Izvedba se zmanjša na ustvarjanje neimenovane cevi in njeno polnjenje z naključnimi podatki, da se doseže nastavitev zastavice PIPE_BUF_FLAG_CAN_MERGE v vseh povezanih obročnih strukturah. Nato se podatki berejo iz cevi, toda zastavica ostaja nastavljena v vseh instancah strukture pipe_buffer v obročnih strukturah pipe_inode_info. Sledi klic splice() za branje podatkov iz ciljne datoteke v neimenovano cev, pri čemer se začne z zahtevano offsetom. Pri zapisovanju podatkov v to neimenovano cev se zaradi nastavljene zastavice PIPE_BUF_FLAG_CAN_MERGE podatki v predpomnilniku strani prepišejo, namesto da bi ustvarili novo instanco strukture pipe_buffer.

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster