Portál AbcLinuxu, 21. říjen 2017 18:16

Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku

27.7. | Redakce
Články - Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku  

Stav vydání jádra. Jak předcházet přeskakování ochranné stránky zásobníku.

Stav vydání jádra

Současné vývojové jádro je 4.12-rc6, vydané 19. června. Linus řekl: „Dobrou zprávou je, že rc6 je menší než rc5, myslím, že jsme zpět v obvyklém tempu a rc5 byla velká jen náhodou kvůli načasování. Uvidíme. Další víkend, až budu doma a udělám rc7, se rozhodnu, co dál. Stále doufám, že půjde o normální vývojový cyklus a rc7 bude posledním kandidátem na vydáním.“

Stabilní aktualizace: 4.11.6, 4.9.33 a 4.4.73 byly vydány 17. června.

Stabilní aktualizace 4.11.7, 4.9.34, 4.4.74 a 3.18.58 byly v době psaní tohoto článku v procesu revidování. Touto dobou již měly být dávno venku, možná se čekalo na odstranění problémů s řešením zranitelnosti „Stack Clash“. Skutečně vyšly 24., resp. 26. června.

Greg Kroah Hartman také oznámil, že příští řada vydání jádra s dlouhodobou podporou bude 4.14.

Jak předcházet přeskakování ochranné stránky zásobníku

Obvykle by člověk v testovacím vydání jádra -rc6 nečekal 900řádkovou změnu ve správě paměti. Ale jak už to tak bývá, byla právě taková změna v tichosti začleněna hned před vydáním 4.12-rc6. Možná, že právě to byl důvod, proč vydání vyšlo o pár hodin později, než mělo. Nicméně tato změna je důležitá, řeší totiž nově zveřejněnou bezpečnostní hrozbu, která je, zdá se, aktivně zneužívána.

Oblast zásobníku běžícího procesu je na většině architektur umístěna na relativně vysokou virtuální adresu a roste směrem dolů podle toho, jak se zvyšují požadavky zásobníku procesu. Oblast virtuální paměti, která automaticky roste kvůli výpadkům stránek, přináší jistá rizika. Zejména je třeba zabránit jí v růstu do jiných oblastí paměti umístěných pod ní. V procesu s jedním vláknem může být těžké dosáhnout přetečení potenciálně dost velkého adresního prostoru, který je zásobníku vyhrazen. Procesy s více vlákny ale obsahují více zásobníků. Ty jsou menší a pravděpodobně budou umístěny do oblasti mezi další oblasti virtuální paměti. Náhodné přetečení by mohlo poškodit oblast pod zásobníkem – záměrné přetečení, pokud se ho podaří dosáhnout, může být použito ke kompromitaci systému.

Oprava: Ben Hutchings upozornil, že analýza Qualys vychází ze zásobníku „hlavního vlákna“ a žádných jiných, které – aspoň s glibc – nemají dovoleno růst.

Jádro již dlouho umísťuje ochrannou stránku – stránku, která je nepřístupná nadřazenému procesu – pod každou oblast zásobníku. (Vlastně to není až tak dlouho, ochranná stránka byla přidána v roce 2010). Proces, který putuje ze spodní části zásobníku do hlídací stránky bude odměněn signálem poruchy segmentace, což pravděpodobně způsobí předčasný konec daného procesu. Svět obecně předpokládal, že hlídací stránka je dostatečná ochrana před přetečením zásobníku, ale zdá se, že se svět zmýlil.

19. června zveřejnila firma Qualys skupinu zranitelností, které jasně ukazují, že jediná ochranná stránka jako ochrana proti útokům pomocí přetečení zásobníků nestačí. Tyto chyby jsou přezdívány „Stack Clash“, přidružené domény, logo a řada designového spodního prádla zatím ještě nedorazily na trh. O tomto problému se již na neveřejných kanálech jistě nějaký čas mluvilo, protože řada distributorů byla okamžitě připravena s aktualizací jádra ve snaze situaci uklidnit.

Základní problém je v tom, že je ochranná stránka příliš malá. Existuje řada způsobů, jak lze zásobník rozšířit o více než jednu stránku najednou. Patří mezi ně místa v GNU C Library, která provádějí volání alloca() s požadavkem na hodně paměti, a programy s velkými poli proměnlivé délky nebo jinými velkými datovými strukturami na zásobníku. Ukazuje se, že pro útočníka je relativně snadné přimět program, aby generoval adresy zásobníku, které přeskočí ochrannou stránku a přistanou v jakékoliv paměti, která se nachází pod ním. Všechny důkazy proveditelnosti útoku zveřejněné firmou Qualys představují místní vykonání kódu, ale zdá se být nerozumné předpokládat, že neexistuje způsob, jak by se problém dal zneužít na dálku.

Oprava začleněná pro vydání 4.12 přišla od Hugha Dickinse s poděkování Olegu Nesterovovi a Michalu Hockovi. Jedná se o přímočarý způsob řešení problému, dá se říct hrubou silou. 4KB ochranná stránka se změní na 1MB ochrannou oblast v libovolné části automaticky rostoucí virtuální paměti. Jak stojí v poznámce seznamu změn patche: „Samozřejmě se nejedná o plnohodnotnou opravu, protože se jedná o inherentní problém, ale mělo by to hodně snížit prostor pro útoky.“ Velikost ochranné oblasti není za chodu konfigurovatelná (to počká do doby, kdy někdo ukáže, že to potřebuje), ale dá se změnit při zavádění systému pomocí parametru příkazového řádku stack_guard_gap.

Hlídací oblast o velikosti 1 MB by mělo být obtížné přeskočit. Jedná se (nebo mělo by se jednat) o vzácný program, který se snaží přidělit tolik paměti na zásobníku, a jiná omezení (například omezení délky příkazového řádku) by měla ztížit možnost oklamat programy, aby alokaci provedly. Na většině 64bitových systémů by mělo být možné – v případě, že se správce obává, že 1 MB paměti nestačí – vytvořit ochrannou oblast podstatně větší. Nepochybně existují útočníci, kteří horečnatě pracují na způsobech, jak se přes tyto oblasti dostat, ale aspoň na chvíli by mohli dojít k závěru, že jsou snazší způsoby, jak na příslušný systém zaútočit.

Skutečným problémem je samozřejmě to, že ukazatel na zásobník se dá zneužít k přístupu k paměti, která není součástí zásobníku. Možná jednou budeme mít paměťové typy v ukazatelích, které umožní hardwaru detekovat a blokovat takové útoky. Prozatím však musíme aktualizovat své systémy, abychom zvýšili laťku pro úspěšnou kompromitaci. Distributoři již aktualizovali a oprava je ve frontě pro další kolo stabilních aktualizací jádra, ke kterému došlo 21. června.

Odkazy a zdroje

LWN.net
Preventing stack guard-page hopping

Další články z této rubriky

Jaderné noviny – 28. 9. 2017: Poznámky z mikrokonference o trasování na LPC
Jaderné noviny – 21. 9. 2017: Zbytek začleňovacího okna 4.14
Jaderné noviny – 14. 9. 2017: První polovina začleňovacího okna 4.14
Jaderné noviny – 8. 9. 2017
Jaderné noviny – 31. 8. 2017: Statistiky vývojového cyklu 4.13

Diskuse k tomuto článku

27.7. 12:01 Sten
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku
Odpovědět | Sbalit | Link | Blokovat | Admin
Chápu to dobře, že ten 900řádkový patch jen mění velikost ochranné stránky? Nebo je tam ještě něco dalšího?
27.7. 17:17 chrono
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku
900 riadková záplata nemusí nutne znamenať (a v tomto prípade ani neznamená), že sa zmenilo 900 riadkov.

Každopádne tá zmena vyzerá takto mm: larger stack guard gap, between vmas a najväčšiu časť (okrem, pre jadro, obvyklého rozsiahleho popisu zmeny) zaberá kód, ktorý má za úlohu zabezpečiť, aby tá zmena nerozbila programy, ktoré bežia s obmedzenou veľkosťou zásobníka.
28.7. 10:47 tomo_tn
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku
Odpovědět | Sbalit | Link | Blokovat | Admin
Znamena to ze kazdy program bude zaberat v pamati minimalne 1 MB?
28.7. 11:13 chrono
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku
Nie, k tým stránkam nebude pripojená fyzická pamäť (a ak sa k ním niečo pokúsi pristupovať, nastane chyba o ktorej bude informované jadro).
30.7. 16:01 Jirka
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku
Odpovědět | Sbalit | Link | Blokovat | Admin
Tato bezpečnostní chyba se naštěstí netýká Windows 3.11 v 16-bitovém režimu (s vypnutým módem Enhanced 386), protože zásobník má svůj vlastní segment a při překročení jeho konce o jakoukoliv velikost (malou či velkou) vygeneruje procesor výjimku Segmentation Fault.

Už tu byla válka třicetiletá. Dnes jsou lidé o polovinu chytřejší, tak to máme 30 / 2 = 15.
31.7. 07:51 Ivan
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 6. 2017: Jak předcházet přeskakování ochranné stránky zásobníku
Odpovědět | Sbalit | Link | Blokovat | Admin
Tahle bezpecnostni oprava rozbiji Oracle RAC, JVM a dalsi veci. Zneuzitelne je to jen hypoteticky, podle me jde jen o PR firmy Qualis.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.