V subsystému kryptografie Linux se připravuje odstranění podpory zero-copy z rozhraní AF_ALG pro typy algoritmů SKCIPHER a AEAD. Změna již je v stromu cryptodev a očekává se odeslání do sloučení Linux 7.2, které by mělo být otevřeno v červnu. Podnětem se staly rostoucí obavy o bezpečnost zero-copy mechanizmů v jádře, zvláště po nedávných zranitelnostech v kryptografickém kódu Linuxu.
AF_ALG — to je uživatelské rozhraní kryptografického API jádra Linux. Přes něj mohou programy přistupovat k implementacím šifrování, hashů a AEAD algoritmů v jádře jako k soketům. Dokumentace Linuxu zvlášť popisuje pro AF_ALG zero-copy režim přes splice() a vmsplice(), kdy se jádro snaží vyhnout zbytečnému kopírování dat do paměti jádra.
Problém je v tom, že v případě AF_ALG se takový zisk výkonnosti ukázal jako nepříliš důležitý a rizika jsou příliš velká. Autor změny, vývojář kryptografické subsystémy Linuxu Eric Biggers z Google, uvedl, že zero-copy umožňuje uživatelskému prostoru spouštět kryptografické operace přímo nad stránkami page cache souborů, například binárního souboru su, a také vytváří podmínky pro TOCTOU zranitelnosti, kdy se paměť může měnit současně s operací nad ní.
Jinými slovy, mechanismus užitečný v síťovém nebo souborovém vstupu-výstupu, v AF_ALG vypadá jako příliš nebezpečná optimalizace. Samotný AF_ALG, podle vývojáře, je nyní většinou udržován pro zpětnou kompatibilitu s malým množstvím programů, například iwd, které ještě nebyly převedeny na kryptografii v uživatelském prostoru. Původně byl AF_ALG navržen i pro přístup k hardwarovým kryptoprocesory, ale v praxi se ukázal jako ne příliš efektivní rozhraní pro tento úkol.
Je důležité, že nejde o úplné odstranění splice() nebo sendfile() pro AF_ALG. Změna je popsána jako "měkké porušení" kompatibility: přenos dat v požadavcích AF_ALG přes splice() a sendfile() bude i nadále fungovat, ale jádro nyní bude provádět interní stabilní kopii dat před kryptografickou operací. Výkon v některých případech může klesnout, ale uživatelské API se formálně nezhroutí.
Zároveň se zdůrazňuje, že zatím se zero-copy odstraňuje z skcipher a aead. Podpora pro typ hash bude zvažována zvlášť.
Kontext změny je nepříjemný. Na konci dubna byla odhalena zranitelnost Chyba kopírování (CVE-2026-31431) v algif_aead, což je přesně v uživatelském kryptointerface AF_ALG. Badatelé ukázali, že kombinace AF_ALG, splice() a zvláštností AEAD zpracování umožňovala neprivilegovanému uživateli poškozovat vyrovnávací paměť stránky, včetně stránek odpovídajících setuid binárkám, a získávat zvýšení privilegií na úroveň root.
Objevení Chyba kopírování bylo spojeno s optimalizací z roku 2017, která převedla operace AEAD na zpracování „na místě“; při přenosu souboru přes splice() v AF_ALG jádro pracovalo ne s kopií, ale s odkazy na stránky vyrovnávací paměti stránky. V důsledku toho se část dat, která byla považována pouze za vstupní, mohla ocitnout v zapisovatelném scatterlistu.
Odstranění zero-copy z AF_ALG není jen jednorázová oprava jedné zranitelnosti. Spíše to je pokus odstranit celý typ riskantních scénářů z málo používaného UAPI, kde zisk z optimalizace neospravedlňuje složitost a potenciální následky. Pro běžné uživatele pravděpodobně změna zůstane bez povšimnutí; pro vzácné programy, které aktivně používají AF_ALG přes splice() nebo sendfile(), může dojít k poklesu výkonu kvůli dodatečnému kopírování.
Zdroj: linux.org.ru
