Bezpečnost

Fedora odložila shadow stack na verzi 46, podmínkou jsou ovladače NVIDIA a PyPI

Výbor Fedory pro technická rozhodnutí schválil 28. července návrh zapnout ve výchozím stavu hardwarovou ochranu návratových adres na x86_64. Osm hlasů pro, nikdo proti – ale až pro Fedoru 46 místo navrhované 45. Podmínkou je, aby do uzávěrky vydání fungovaly ovladače NVIDIA a předpřeložené balíčky wheel z PyPI.

· 5 zhlédnutí

Výbor Fedory pro technická rozhodnutí (FESCo) schválil 28. července návrh zapnout na počítačích s x86_64 ve výchozím stavu shadow stack, tedy hardwarovou ochranu návratových adres. Hlasovalo pro osm členů, nikdo nebyl proti a nikdo se nezdržel. Návrh přitom mířil na Fedoru 45, která má podle harmonogramu vyjít 20. října 2026; výbor ho posunul na Fedoru 46 s cílovým datem 20. dubna 2027.

Procesor AMD Ryzen 5 5600X se sejmutým krytem, vidět jsou obě křemíkové destičky
Procesor AMD Ryzen 5 5600X jádra Zen 3 se sejmutým krytem; vlevo leží kryt se zbytky pájky. Shadow stack umí procesory AMD od Zenu 3 a Intelu od 11. generace. Foto: Fritzchens Fritz from Berlin, Wikimedia Commons (CC0)

Procesor si vede vlastní kopii návratových adres

Shadow stack je jedna ze dvou částí technologie Intel CET. Když program zavolá funkci, uloží se adresa, na kterou se má po jejím dokončení vrátit, nejen na běžný zásobník, ale ještě jednou do zvláštní oblasti paměti, kam smí zapisovat jen procesor. Při návratu se obě hodnoty porovnají a při neshodě proces skončí. Míří to na útoky typu return-oriented programming, které přepsanou návratovou adresou skládají škodlivou posloupnost z kousků kódu, jenž v programu už je. Druhá část CET se jmenuje Indirect Branch Tracking a návrh Fedory ji výslovně neřeší.

Potřebný hardware mají procesory Intelu od 11. generace a AMD od jádra Zen 3.

Zapíná to dynamický linker, ne uživatel

O zapnutí se stará dynamický linker, tedy část systému, která programu při startu doplní knihovny. Ochranu zapne jen tehdy, když značku SHSTK v hlavičce nese jak samotný program, tak všechny knihovny, které si při startu natáhne. Fedora překládá balíčky s přepínačem -fcf-protection od roku 2018, takže tu značku má většina binárek dávno. Programu, kterému chybí u jediné knihovny, se ochrana tiše nezapne a poběží jako dosud.

Nově rozbít se dá jediná věc: dlopen, tedy natažení knihovny až za běhu. Když taková knihovna značku nemá, dostane program chybu error: dlopen: /cesta/ke/knihovne.so: rebuild shared object with SHSTK support enabled.

V polovině července byli tři členové výboru proti

Právě natahování knihoven za běhu stálo za tím, že o návrhu výbor nehlasoval hned. Fabio Valentini upozornil, že rozsah dopadu je podhodnocený, protože kompilátor Rustu zatím kompatibilní binárky nedělá – a to se týká i knihoven s céčkovým rozhraním psaných v Rustu, jako je librpm-sequoia, librsvg2 nebo librav1e. Přes ně by se podle něj ochrana automaticky vypnula většině GNOME, celé správě balíčků a všemu, co se linkuje s ffmpegem. Neal Gompa doplnil, že totéž platí o části KDE.

Třetí hlas proti přišel od Maxwella G. Napsal, že dopad může být hodně velký – cizí providery OpenSSL, balíčky wheel z PyPI, ovladače NVIDIA – a že i software, který Fedora sama nedodává, nechce nikdo rozbít vědomě. V diskusi k návrhu na to Clemens Lang navázal moduly PKCS#11, které přicházejí s hardwarovým tokenem a překládat je nejde, a běžným pip install ve virtuálním prostředí Pythonu.

Odpověď navrhovatele: přeložit Rust znovu a nechat vypínač

Arjun Shankar z Red Hatu, který návrh vede, odpověděl 21. července čísly. Rustový kompilátor se shadow stackem už existuje v testovacím repozitáři COPR a Fedora s ním zkusmo přeložila své rustové balíčky: z více než 3 500 se jich nepřeložilo asi 30 a u všech se ukázalo, že s ochranou nesouvisejí. Tým kolem Rustu podle něj souhlasil, že po schválení návrhu chování kompilátoru změní.

Vypnout ochranu jde dvěma způsoby. Proměnnou prostředí GLIBC_TUNABLES="glibc.cpu.x86_shstk=off" pro jedno spuštění, nebo systémově pro konkrétní program – soubor /etc/tunables.conf, který přibyl v glibc 2.44, umí ladicí přepínače knihovny nastavit i podle cesty ke spustitelnému souboru:

[proc:/usr/bin/app]
glibc.cpu.x86_shstk=off

Balíček s vadnou závislostí si takový soubor přinese s sebou a po opravě ho zase odinstaluje. Ostatní programy ochranu neztratí.

Schváleno s podmínkou, wiki o tom zatím neví

Na schůzi 28. července výbor návrh přijal a v zápisu stojí, že je schválený pro Fedoru 46 a že kompatibilita ovladačů NVIDIA a balíčků wheel z PyPI musí být vyřešená před uzávěrkou, do které se změna dá ještě vzít zpátky (překlad náš). Druhým bodem zápisu je úkol pro koordinátorku změn převést návrh z Fedory 45 na 46; ke 31. červenci stránka návrhu na wiki pořád uvádí Fedoru 45.

Zapnutí bude stát Fedoru vlastní záplatu do glibc, protože upstream shadow stack v knihovně naopak vypnul. Kdo si nechce počkat do dubna 2027, může sáhnout po repozitáři COPR, ve kterém navrhovatel glibc se zapnutým shadow stackem dodává pro Fedoru 44 a Rawhide.

Zdroje: tiket FESCo 3636, diskuse k návrhu, stránka návrhu na wiki Fedory, zápis ze schůze FESCo, harmonogramy Fedory 45Fedory 46.

Bezpečnost

Diskuse

Zatím tu nikdo nediskutuje.

Diskutovat mohou přihlášení čtenáři – přihlaste se nebo si založte účet.

← zpět na výpis