V jádře 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 flagem O_RDONLY nebo umístěných na souborových systémech připojených v režimu pouze pro čtení. Z praktického hlediska lze zranitelnost využít pro vkládání kódu do libovolných procesů nebo 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 k dispozici prototyp exploitů.
Problém byl označen kódovým názvem Dirty Pipe, obdobně jako kritická zranitelnost Dirty COW, která byla odhalena v roce 2016. Je zdůrazněno, že z hlediska nebezpečnosti je Dirty Pipe na stejné úrovni jako Dirty COW, ale je mnohem jednodušší pro exploataci. Zranitelnost byla odhalena při zkoumání stížností na občasné poškození souborů stahovaných po síti v systému stahujícím komprimované archivy z log-serveru (37 poškození za 3 měsíce v zatíženém systému), při jejichž přípravě byla použita operace splice() a anonymní kanály.
Zranitelnost se projevuje od jádra Linux 5.8, vydaného v srpnu 2020, což znamená, že 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, ale není vyloučeno, že problém způsobující změna byla do nich zpětně integrována (přesné údaje zatím nejsou). Sledovat publikaci aktualizací 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 je také zahrnuta v jádře používaném na platformě Android.
Zranitelnost je způsobena absencí inicializace hodnoty „buf->flags“ v kódu funkcí copy_page_to_iter_pipe() a push_pipe(), přičemž paměť při alokaci struktury není vymazána a při určitých manipulacích s anonymními kanály může ve „buf->flags“ skončit hodnota z jiné operace. Využitím této vlastnosti může neprivilegovaný místní uživatel způsobit, že se ve flagu objeví hodnota PIPE_BUF_FLAG_CAN_MERGE, která umožňuje přepsání dat ve stránkovém cache jednoduchým zápisem nových dat do speciálně připraveného anonymního kanálu (pipe).
Pro útok musí být cílový soubor přístupný pro čtení, přičemž, protože při zápisu do pipe nejsou kontrolována oprávnění, může být výměna ve stránkovém cache provedena také pro soubory nacházející se v oddílech, které jsou připojeny pouze pro čtení (například pro soubory na CD-ROM). Po výměně informací ve stránkovém cache proces při čtení dat ze souboru obdrží ne skutečná, ale podvržená data.
Exploatace spočívá ve vytvoření anonymního kanálu a jeho naplnění libovolnými daty s cílem dosáhnout nastavení příznaku PIPE_BUF_FLAG_CAN_MERGE ve všech souvisejících kruhových strukturách. Poté jsou data čtena z kanálu, ale příznak zůstává nastaven ve všech instancech struktury pipe_buffer v kruhových strukturách pipe_inode_info. Následně se provede volání splice() pro čtení dat z cílového souboru do anonymního kanálu, počínaje požadovaným posunem. Při zápisu dat do tohoto anonymního kanálu budou kvůli nastavenému příznaku PIPE_BUF_FLAG_CAN_MERGE data ve stránkovém cache přepsána, místo aby byl vytvořen nový instance struktury pipe_buffer.
Zdroj: opennet.ru
