Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Bezpečnost

V testovacích sestaveních jádra Linuxu 7.3 ustoupí randomizace struktur Rustu

Do hlavní větve jádra Linuxu se 2. září 2026 dostala změna o jednom řádku: randomizace vnitřních struktur se nepředvolí tam, kde je k dispozici překladač Rustu. Důvodem je allmodconfig, sestavení pro pokrytí překladu, ve kterém se obě věci vylučovaly a Rust z něj vypadával. Distribučních jader se to netýká, ta mají randstruct nepředvolený tak jako tak.

· 141 zhlédnutí

Do hlavní větve jádra Linuxu se 2. září 2026 dostala jednořádková změna, která ruší předvolené zapnutí randomizace vnitřních struktur všude, kde je po ruce použitelný překladač Rustu. Napsal ji Mark Brown, přes svůj strom zpevňování ji poslal dál Kees Cook a Linus Torvalds ji převzal pod značkou hardening-v7.3-rc2. Vyjde v Linuxu 7.3.

Hlavní nabídka nástroje menuconfig s položkou Security options
Nastavení jádra v nástroji menuconfig; volba o randomizaci struktur je pod položkou Security options. Snímek pochází z jádra 3.10.0-rc2. Foto: Hylepo, Wikimedia Commons (CC BY-SA 3.0)

Co randstruct dělá

Randstruct při překladu zamíchá pořadí položek uvnitř struktur, které se skládají výhradně z ukazatelů na funkce, a uvnitř těch, které někdo ručně označil značkou __randomize_layout. Kdo se pak chce v takové struktuře trefit do konkrétní položky, nevystačí si s hlavičkovými soubory: potřebuje k tomu ještě druhou zranitelnost, která mu rozložení prozradí. Nápověda v Kconfigu u toho poctivě jmenuje i cenu, tedy mírné zpomalení, o něco vyšší spotřebu paměti a to, že nad takovým jádrem přestanou fungovat forenzní nástroje typu Volatility.

Semínko, ze kterého se pořadí počítá, leží v souboru scripts/basic/randomize.seed. Přežije make clean, aby se s ním daly přeložit i externí moduly, a zveřejňovat se nemá: kdo ho má, dopočítá si rozložení sám. Clang umí randomizaci sám od sebe, GCC jen přes zásuvný modul.

Kruh v závislostech

S Rustem se randstruct zatím nesnese. Brown to v popisu shrnuje jednou větou, totiž že randstruct Rust nepodporuje, a v souboru init/Kconfig je to vidět na volbě CONFIG_RUST, která má mezi podmínkami depends on !RANDSTRUCT.

Potíž je v tom, co z toho plyne pro allmodconfig, tedy pro sestavení, které zapne co jde, aby se ověřilo, že se celý strom vůbec přeloží. Zapíná i volbu COMPILE_TEST, a právě na ní dosud viselo předvolené zapnutí randstructu. Rust se pak kvůli své vlastní podmínce vypnul a rustové ovladače se v běžné pokrývací sestavě nepřekládaly. Ojeda k tomu napsal, že přijetím patche se dá udržet Brownovo testování Rustu v linux-nextu.

Napsat rovnou, že randstruct nemá být předvolený při zapnutém Rustu, nešlo, protože závislost by se zacyklila. Podmínka se proto ptá oklikou, jestli je vůbec k dispozici rustový nástrojový řetěz a jestli má daná architektura pro Rust podporu:

-	default RANDSTRUCT_FULL if COMPILE_TEST && (GCC_PLUGINS || CC_HAS_RANDSTRUCT)
+	default RANDSTRUCT_FULL if !(RUST_IS_AVAILABLE && HAVE_RUST) && COMPILE_TEST && (GCC_PLUGINS || CC_HAS_RANDSTRUCT)

Sám autor přiznává, co z takové okliky plyne: může vzniknout i konfigurace, ve které nakonec není ani Rust, ani randstruct. Podmínka se ptá na dostupnost Rustu, ne na jeho zapnutí.

Distribuční jádra to nepocítí

Obě podoby té podmínky, stará i nová, začínají u COMPILE_TEST. Jádro stavěné bez ní, tedy jakékoli, co má někomu opravdu běžet, dostávalo v téhle volbě předvolené RANDSTRUCT_NONE před změnou i po ní. Kdo randstruct chce, zapíná si ho v konfiguraci sám, a na tom se nemění nic. Změna míří na sestavy, které vznikají kvůli pokrytí překladu a nikdy se nespustí.

Obejití, ne oprava

Cook se nad první verzí 10. června zeptal, jestli se randstruct s Rustem nedá místo obcházení rovnou povolit. Ojeda ho odkázal na vlastní sérii rust: allow Clang-native RANDSTRUCT configs z 23. března 2026. Ta stojí na zkoušce, ne na úvaze: bindgen si pod kapotou volá libclang, randomizaci tedy zdědí a vygenerované vazby vyjdou se stejným pořadím položek jako céčková strana. Ojeda to v popisu dokládá čtyřmi ukázkovými strukturami a tím, u kterých z nich se položky prohodí a u kterých ne.

Proti sobě má ale nestabilitu. Pořadí, které Clang vyrobí, není zaručené napříč verzemi ani platformami, LLVM si dokonce vrátil zpět vlastní test, který přesné pořadí polí kontroloval, a modul do GCC míchá úplně jiným generátorem náhodných čísel. Série proto randstruct v Rustu povoluje jen s Clangem. Výkonnostní stránku k ní změřil Andreas Hindborg na rustovém ovladači null block: průměr přes 120 úloh se statisticky významně nezměnil, jednotlivé konfigurace se hýbaly zhruba o desetinu, a to na obě strany.

V hlavní větvi ta série zatím není. Volba CONFIG_RUST má obě zakazující podmínky pořád na svém místě, takže do jádra se dostalo obejití příznaku, ne odstranění příčiny.

Tři měsíce, čtyři verze

Brown poslal první verzi 5. června 2026 a druhou ještě týž den; přibyl do ní dotaz na HAVE_RUST, tedy na architekturu. Třetí verze z 2. července a čtvrtá z 1. září pak měnily jen to, na jaký strom patch sedí. Cook si ji vzal jedenáct minut po odeslání té čtvrté, Torvalds si ji stáhl o den později.

Bezpečnost

Linux Rust Kconfig

← zpět na výpis