Tych zranitelnosti suvisiacich s Stack Clash bude viacej:
glibc: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000366
sudo: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000367
exim: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000369
libffi: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-1000376
gcc -fstack-check urcite pomaha, ale ma urcite obmedzenia
https://gcc.gnu.org/ml/gcc-patches/2017-06/msg01343.html
GCC upstream ma plan urobit novu variantu -fstack-check=<something>
Bude zaujimave pozriet ako sa s touto "Memory Management vulnerability" vysporiadaju jednotlive distribucie. Neviem si dost dobre predstavit ako prekompiluju vsetky balicky (snad jedine Gentoo to bude mat bez problemov).
"Unika mi neco? Kde je problem v tom zmenit buildscript, povysit versi, zbuildit, prohnat pres QA a releasovat?"
No zober si napr najnovsi Debian Stretch, ktory ma 51 687 balickov. Teraz si toto cislo vynasob poctom architektur ktore su zranitelne (x86 amd64 arm?). Dalej zoberme ze 1% balickov bude mat nejaky problem s -fstack-check (optimisticky odhad), na ktory treba zasah vyvojara a upravu zdrojoveho kodu daneho balicku. Myslim ze prave toto moze byt ten problem, kde nepomoze ani to, ze mame super vykonne build servery a tinderboxy ;)
ta cast o openbsd je hooodne teoreticka, jejich workaround je trochu nerealisticky:
LD_PRELOAD
A colon separate list of library names to load before any of the
regular libraries are loaded. This variable is ignored for set-
user-ID and set-group-ID executables.
proto museli zmenit prava na 'at' a udelat si adresar s joby writable...
Pokud jsem to pochopil správně, tak ve zmíněných operačních systémech se v případě, že "dojde" zásobník (což je detekováno tak, že dojde k výpadku stránky na adrese pod jeho dnem (stack start)), jádro jej prodlouží (alokováním stránky, která vypadla, popř. dalších).
Pokud k výpadku stránky nedojde, jádro nedetekuje nic. Což je právě klíčové (stejně jako fakt, že zásobník může růst "donekonečna", což je rozdíl např. oproti Windows). Zásobník pak "přeteče" do něčeno jiného (obvykle haldy). Pak již tam jsou hlavně detaily o tom, jak daného chování docílit.
Pochybuji, že se dělá explicitní probe při každé implicitní alokaci lokálních proměnných. Obvykle se pouze sníží hodnota ukazatele na vrchol zásobníku (ESP na ia32, RSP na amd64/x64). Neznám bohužel detaily z linuxového či BSD světa (jen něco z WIndows).
Ano, ale ve Windows se guard page používá trochu jinak – ohraničuje aktuálně alokovnou oblast zásobníku (dno). Když se na ní narazí, alokuje se další stránka/y a guard page se posouvá dále. Z čehož vyplývá, že guard page se používá ke stejnému účelu jako page fault v *NIXech/BSD. Pokud se tedy alokuje větší část na zásobníku, je nutné onu guard page nepřeskočit.
není to nic složitého, pokud jsi kernel a máš zabránit, aby data nepřetekla z stacku či třeba nepřepsala jeho část (jiné proměnné, návratovou adresu či jiný program), dáš na konec stacku (či před chráněný prostor) page, u které nastavíš právo pouze pro čtení, pokud nějaký program do téhle page zapíše, skončí na seg fault.
Tuhle speciální readonly page najdeš často pod termínem guard page. Celá slabina, o které se tady píše je právě o tom, že program zapíše až za samotnou guard page, tj. přeskočí jí, proto jako řešení se nabízí právě zvětšení dané page, což je jak sám tušíš jen obezlička, nic lepšího ale zatím nemáme.
Tahle chyba se samozřejmě ošetřuje v samotném kódu, jedná se o tzv. bounds checking. Úloha kernelu ale není v kontrole spouštěných programů, jestli mají všude bounds checking nebo jestli došlo k přetečení, kernel se pouze snaží, aby daný program neovlivnil někoho jiného a to přesně zajišťuje tahle guard page.
Teď se přišlo na to, že jistá konstelace nalinkovaných knihoven může přetéct stack, řešením je přidat do programů přímou kontrolu a to právě zajišťuje ten přepínač u glibc pro kompilaci, jen má zatím pár nevýhod, proto není ve výchozím nastavení zapnutý, ale po objevení těhle chyb se na tom pracuje. Podrobnosti jsou poté napsané v odkazech v samotné zprávičce.
Zaujimava analyza z dielne grsecurity:
https://grsecurity.net/an_ancient_kernel_hole_is_not_closed.php
Na tuto zranitelnost vydal Andrea Arcangeli v roku 2004 patch, ktory ale nebol zahrnuty do kernelu.
No a v roku 2005 bola Davidom Howellsom omylom pridany do kernelu riadok
int heap_stack_gap = 0
ktory sa prvy krat objavil v prave v patchi od AA: http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-09/7904.html
To jsme to soudruzi rozmrdali aneb kvalitní testování... :-/
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=865311
https://community.ubnt.com/t5/UniFi-Wireless/IMPORTANT-Debian-Ubuntu-users-MUST-READ/m-p/1968252#M233999
Vidím, že spolek mínusujících kreténů opět úřaduje.
Rozbité mraky dalších věcí v Javě: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=865343
Rozbitý LibreOffice: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=865303
Prostě výtečné testování stabilního jádra. Zvláště vhodné to narvat i do předchozí stable verze a vůbec tu celou zabugovanou sračku vypustit v době releasu nového Debianu.
a četl jsi si ty issue? Namátkou to poslední s libreoffice, kdy v posledním příspěvku autor píše:
After removing the suspect LibreOffice extension, re-installing the
updates, and re-booting, it appears that LibreOffice starts without
problem.
Nějak nečekám, že mi distribuce bude podporovat všech binární (či bajt) kód, který si někde postahuji. Všechno se točí kolem javy a spouštění kód v hlavní threadu, asi tam něco hnije.