Portál AbcLinuxu, 10. května 2025 13:33
Stav vydání jádra. Citáty týden: Greg Kroah-Hartman a Thomas Gleixner. Přirozená křehkost seccomp().
Jádro 4.14 bylo vydáno 12. listopadu a začleňovací okno cyklu 4.15 je otevřené. Stěžejní funkce tohoto vydání zahrnují odvíjení ORC pro spolehlivější zpětné trasování a patchování za chodu, dlouho očekávaný režim vláken v kontrolních skupinách, podporu AMD Secure Memory Encryption, podporu pětiúrovňových tabulek stránek, funkci umožňující síťový přenos bez kopírování, subsystém správy heterogenní paměti a další. Více informací najdete na stránce Kernel Newbies věnované jádru 4.14. Nakonec bylo do jádra 4.14, které je plánováno jako další vydání s dlouhodobou podporou, začleněno téměř 13 500 sad změn.
Pro správce bylo pozoruhodné Linusovo varování (v oznámení vydání 4.14), že začleňovací okno 4.15 mohlo být vzhledem k americkému Dni díkuvzdání o něco kratší. (Poznámka překladatele: nakonec 4.15-rc1 vyšla podle plánu, tedy 26. listopadu.)
Stabilní aktualizace: 4.13.13, 4.9.62, 4.4.98 a 3.18.81 byly vydány 15. listopadu.
Tohle je ta velká sada patchů char/misc pro začleňovací okno 4.15-rc1. Obsahuje obvyklou skupinu nových funkcí přidanou ke všem těm šíleným ovladačům, jakožto i následující zcela nové subsystémy:
Všechny tyto patche byly úspěšně otestovány na nejnovějších vydáních linux-next a původní problémy, které se tím našly, jsou vyřešeny (omlouvám se všem, kdo žijí v blízkosti Canberry, že v dřívějších verzích ze stromu linux-next chyběly volby Kconfig.)
První pravidlo při pohledu na uživatelský prostor zní, že je buď rozbitý, nebo nepřátelský. Rozumný a uživatelský prostor se navzájem vylučují.
The inherent fragility of seccomp(). Jonathan Corbet. 10. listopadu 2017
Vývojáři jádra se už řadu let obávají, že trasovací body by mohly vést k závislosti aplikací na obskurních implementačních detailech. Z toho plynoucí potřeba zachovat dosavadní chování, aby se zabránilo vzniku regresí, by ale mohla ztěžovat budoucí vývoj. Nedávná zpráva poukazuje, že systémové volání seccomp() je také náchylnější k regresím, než uživatelé očekávají – jaderní vývojáři ovšem tyto regrese pravděpodobně nezpůsobují a vlastně nemají příliš možnost jim zabránit. Programy, které seccomp() používají, jsou přirozeně náchylnější k rozbití po aktualizaci softwaru.
seccomp() umožňuje vytvoření filtru, který omezí množinu systémových volání, která je procesu k dispozici. Má to zřejmé využití související se sandboxingem. Pokud aplikace nepotřebuje např. systémové volání open(), může zamezení přístupu k tomuto volání snížit rozsah škod, které by mohly vzniknout v případě napadení aplikace. Jak se rozšiřuje tvrzení systémů a programů, lze očekávat, že využití seccomp() bude i nadále růst.
Michael Kerrisk nedávno oznámil, že povýšením glibc na verzi 2.26 se rozbila jedna z jeho demonstračních aplikací. Tento program používal seccomp() k blokování přístupu k systémovému volání open(). Problém, na který narazil, spočívá v tom, že aplikace téměř nikdy nevolají systémová volání přímo, místo toho volají wrapper definovaný v knihovně C.
Wrapper open() v glibc od počátku obaloval jaderné systémové volání open(). Ale open() je staré rozhraní, které bylo již dávno nahrazeno voláním openat(). Staré volání stále existuje, protože aplikace jeho přítomnost očekávají, ale v jádře je implementováno jako zvláštní případ openat(). Ve glibc 2.26 došlo ke změně wrapperu open(), aby nově volal přímo openat(). Tato změna nebyla viditelná běžným aplikacím, ale rozbíjí filtry seccomp(), které se chovají pro open() a openat() odlišně.
Kerrisk si vlastně nestěžoval na změnu samotnou, ale chtěl vývojáře glibc informovat o tom, že jejího dopadu si uživatelé mohli všimnout: „Chci zvýšit povědomí o tom, že tento druh změn může potenciálně způsobit rozbití nějakého kódu, který využívá seccomp(), a myslím si, že by se takové změny neměly dít bezmyšlenkovitě nebo bezdůvodně.“ Naznačil, že vývojáři by při provádění takových změn měli mít riziko rozbití filtrů seccomp() na paměti a dokumentovat tyto změny v případech, kdy se jim nelze vyhnout.
Florian Weimer ale nesouhlasil:
Mám opačný názor: měli bychom tyto změny dělat co nejčastěji, abychom lidem připomněli, že filtry seccomp() (a některá pravidla SELinuxu a AppArmor) nejsou kompatibilní s modelem GNU/Linuxu, kde je vše vyvíjeno odděleně a udržováno mimo jediný strom se zdrojáky (na rozdíl od třeba OpenBSD). To znamená, že se opravdu nemůžete odklonit od upstreamového linuxového ABI pro uživatelský prostor (v co nejširším možném slova smyslu) a stále očekávat, že vše bude fungovat.
Jiný způsob, jak to podat, by mohl vypadat takto: filtry seccomp() se nepovažují za součást ABI poskytovaného glibc, takže nekompatibilní změny nejsou považovány za regrese. Místo toho jsou důsledkem filtrování na úrovni nižší než glibc, zatímco očekávané chování nad touto úrovní zůstává beze změny.
Zdá se, že Weimerův pohled je ten, kterým se bude vývoj glibc řídit do budoucna. Kerrisk tedy navrhl několik změn manuálových stránek, aby křehkost filtrů seccomp() vývojáře překvapovala o něco méně. Na této úrovni bude potřeba poměrně hluboké pochopení toho, co se děje, a schopnost přizpůsobit se budoucím změnám knihovny C.
Tento výsledek se dá považovat za argument pro filtrovací rozhraní podobné pledge() z OpenBSD. Tak jako seccomp() i pledge() se používá k omezení množiny systémových volání, kterou má proces k dispozici, ale pledge() pracuje spíše na úrovni obecné funkcionality než jednotlivých systémových volání. Dá se použít například k povolení základního I/O do/ze souboru a současně zakázání otevírání (nebo vytváření) nových souborů. Volání pledge() má mnohem menší granularitu než seccomp() a nemůže ani zdaleka posloužit k implementaci podobně široké škály pravidel, ale v případě základního filtrování se zdá, že riziko překvapení po aktualizaci jádra nebo knihovny je s ním mnohem menší.
Jenže Linux pledge() neobsahuje a je nepravděpodobné, že by se v něm mohlo objevit. Volání seccomp() práci při sandboxingu jistě odvede, ale vývojáři, kteří ho používají, by měli očekávat, že budou muset vynaložit nějaký čas a námahu na správu svých filtrů.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.