Chyba zabezpečení v jádře Linuxu, která může manipulovat se soubory pouze pro čtení

V linuxovém jádře byla identifikována chyba zabezpečení (CVE-2022-0847), která umožňuje přepsání obsahu mezipaměti stránek pro jakékoli soubory, včetně souborů v režimu pouze pro čtení, otevření s příznakem O_RDONLY nebo umístění v souborových systémech. nainstalované v režimu pouze pro čtení. Prakticky řečeno, zranitelnost by mohla být použita k vložení kódu do libovolných procesů nebo poškození dat v otevřených souborech. Můžete například změnit obsah souboru autorizovaných klíčů pro proces sshd. Prototyp exploitu je k dispozici pro testování.

Problém dostal kódové označení Dirty Pipe, podobně jako kritická zranitelnost Dirty COW identifikovaná v roce 2016. Je třeba poznamenat, že pokud jde o úroveň nebezpečí, je Dirty Pipe na stejné úrovni jako Dirty COW, ale je mnohem jednodušší na ovládání. Zranitelnost byla identifikována při analýze stížností na periodické poškození souborů stahovaných přes síť v systému stahujícím komprimované archivy z log serveru (37 poškození za 3 měsíce na načteném systému), při jehož přípravě byla použita operace splice() a nejmenované dýmky.

Chyba zabezpečení se objevuje počínaje linuxovým jádrem 5.8, vydaným v srpnu 2020, tj. přítomen v Debianu 11, ale neovlivňuje základní jádro v Ubuntu 20.04 LTS. Jádra RHEL 8.xa openSUSE/SUSE 15 jsou původně založena na starých větvích, ale je možné, že do nich byla zpětně portována změna způsobující problém (přesná data zatím neexistují). Publikování aktualizací balíčků v distribucích můžete sledovat na těchto stránkách: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Oprava této chyby zabezpečení byla navržena ve vydáních 5.16.11, 5.15.25 a 5.10.102. Oprava je také součástí jádra používaného na platformě Android.

Zranitelnost je způsobena nedostatečnou inicializací hodnoty „buf->flags“ v kódu funkcí copy_page_to_iter_pipe() a push_pipe(), a to navzdory skutečnosti, že paměť není vyčištěna při alokaci struktury a při určitých manipulacích s nepojmenované roury, hodnota z jiné operace. Pomocí této funkce může neprivilegovaný místní uživatel dosáhnout vzhledu hodnoty PIPE_BUF_FLAG_CAN_MERGE v příznaku, což vám umožňuje organizovat přepisování dat v mezipaměti stránek jednoduchým zápisem nových dat do speciálně připraveného nepojmenovaného kanálu.

Pro útok musí být cílový soubor čitelný, a protože se při zápisu do kanálu nekontrolují přístupová práva, lze náhradu v mezipaměti stránek provést také za soubory umístěné v oddílech připojených pouze pro čtení (například pro soubory c CD- ROM). Po nahrazení informací v mezipaměti stránek při čtení dat ze souboru proces neobdrží skutečná data, ale nahrazená data.

Operace spočívá ve vytvoření nepojmenovaného kanálu a jeho naplnění libovolnými daty, aby bylo zajištěno, že příznak PIPE_BUF_FLAG_CAN_MERGE je nastaven ve všech kruhových strukturách, které jsou s ním spojené. Dále jsou data čtena z kanálu, ale příznak zůstává nastaven ve všech instancích struktury pipe_buffer v kruhových strukturách pipe_inode_info. Poté se provede volání funkce splice() pro čtení dat z cílového souboru do nepojmenovaného kanálu, počínaje požadovaným offsetem. Při zapisování dat do tohoto nepojmenovaného kanálu dojde v důsledku nastavení příznaku PIPE_BUF_FLAG_CAN_MERGE k přepsání dat v mezipaměti stránek namísto vytvoření nové instance struktury pipe_buffer.

Zdroj: opennet.ru

Přidat komentář