Bashdoor (také anglicky Shellshock [1] ) je série softwarových zranitelností objevených v programu GNU Bash v září 2014 a veřejně uvolněných 24. září [2] . Mnoho internetových služeb , včetně webových serverů , může používat Bash ke zpracování určitých požadavků, například při spouštění skriptů CGI . Tato zranitelnost umožňuje útočníkovi provádět libovolné příkazy a získat tak neoprávněný přístup k počítačovým systémům [3] .
Zranitelnost spočívá v tom, že Bash na rozdíl od deklarovaných schopností provádí příkazy při příjmu některých nestandardních hodnot proměnných prostředí ( environment ) [1] [4] . Několik dní po zveřejnění původní chyby zabezpečení bylo objeveno několik podobných chyb, které zabránily rychlému vydání opravené verze.
Původní chybu objevil Stéphane Chazelas [1] ( francouzsky Stéphane Chazelas ) 12. září 2014 [1] , který ji navrhl nazývat „bashdoor“ (souhláska se zadními vrátky ) [1] . Zranitelnost získala v databázi MITER číslo CVE-2014-6271 a zůstala nezveřejněna (bylo na ni uvaleno embargo ) do 24. září 14:00 UTC, aby si autoři programu, tvůrci distribucí a další zainteresované organizace mohli vzít potřebné opatření [5] .
Analýza zdrojového kódu Bash ukazuje, že zranitelnost byla zavedena do kódu kolem verze 1.13 v roce 1992 nebo dříve [6] a od té doby zůstala nezjištěna pro širokou veřejnost a nedeklarována [4] . Autorský tým Bash má potíže s určením přesného času zavedení chyby kvůli nedostatečně podrobnému changelogu ( changelog ) [1] .
25. září 2014 již byly na základě zranitelnosti vytvořeny botnety pro provádění DoS a DDoS útoků a také pro skenování zranitelností [7] [8] . Odhaduje se, že miliony systémů jsou zranitelné. Chyba získala maximální hodnocení na stupnici závažnosti a je porovnávána s hodnotou Heartbleed – chybou v OpenSSL (duben 2014) [9] [10] .
Zranitelnost Shellshock (bashdoor) odkazuje na program bash (vyvinutý projektem GNU ) používaný v mnoha unixových operačních systémech a distribucích jako interpret příkazového řádku a pro spouštění skriptů shellu. Často nastaven jako výchozí systémový interpret.
V operačních systémech typu Unix a dalších podporovaných bash má každý program seznam párů název-hodnota nazývaných proměnné prostředí . Když jeden program spustí jiný, předá se také počáteční seznam proměnných prostředí [11] . Kromě proměnných prostředí bash také udržuje interní seznam funkcí, pojmenovaných skriptů, které lze volat ze spustitelného skriptu bash [12] . Při spouštění nových instancí bash z existujícího bashe je možné předat ( exportovat ) hodnoty existujících proměnných prostředí a definic funkcí do vytvořeného procesu [13] . Definice funkcí se exportují tak, že se zakódují jako nové proměnné prostředí speciálního formátu, počínaje prázdnými závorkami "()", za kterými následuje definice funkce jako řetězec. Nové instance bash skenují při spuštění všechny proměnné prostředí, detekují daný formát a převádějí jej zpět na definici interní funkce [14] . Tato transformace se provádí vytvořením fragmentu bash kódu založeného na hodnotě proměnné prostředí a jeho provedením, tedy „za běhu“. Dotčené verze bash nekontrolují, zda spustitelný soubor obsahuje pouze definici funkce [14] . Pokud má tedy útočník schopnost dodat libovolnou proměnnou prostředí pro spuštění bash, pak bude možné provádět libovolné příkazy.
27. září byl zveřejněn kvalitní patch, který přidává speciální prefix všem exportovaným a importovaným funkcím při jejich převodu na proměnné prostředí a naopak [15] .
Ve stejný den, kdy byly zveřejněny informace o původní zranitelnosti a opravách, které ji opravují, objevil Tavis Ormandy novou související chybu CVE-2014-7169 [3] . Aktualizované opravy byly k dispozici 26. září [3] [16] [17] [18] [19] [20] .
Při práci na opravě původní chyby Shellshock objevil výzkumník Red Hat Florian Weimer další dvě chyby: CVE-2014-7186 a CVE-2014-7187 [21] [22] .
26. září 2014 si dva open-source vývojáři, David A. Wheeler a Norihiro Tanaka, všimli, že existují další problémy, které v té době dostupné záplaty stále neopravují. Ve svém e-mailu do e-mailových konferencí „oss-sec“ a „bash bug“ Wheeler napsal:
Tento patch pouze pokračuje v práci "zabít krtka" ( whac-a-mole ) [23] na opravě různých chyb při analýze, které začaly s prvním patchem. Bash parser samozřejmě obsahuje mnoho mnoho mnoho dalších zranitelností.
Původní text (anglicky)[ zobrazitskrýt] Tato oprava jen pokračuje v „práce na mol“ při opravě chyb při analýze, která začala s prvním patchem. Je jisté, že Bashův analyzátor má mnoho, mnoho dalších zranitelností — [24]27. září 2014 Michal Zalewski oznámil, že objevil několik dalších chyb v bash [25] [26] , z nichž jedna využívá toho, že bash je často kompilován bez použití ochranné techniky ASLR ( Address Space Layout Randomization ) [27 ] . Zalewski také požadoval naléhavou opravu od Floriana Weimera [25] [26] [27] .
Původní bashdoor: Zvláštní druh proměnné prostředí se skládá z definice exportované funkce následované libovolnými příkazy. Zranitelné verze Bash provádějí tyto libovolné příkazy během spouštění [28] . Příklad chyby:
env x = '() { :;}; echo Vulnerable' bash -c "echo Test print"Na zranitelných systémech tento test vypíše frázi "Vulnerable" provedením příkazu z proměnné prostředí x [29] .
K 29. září nebyly podrobnosti o zranitelnosti zveřejněny [25] [27] [30] .
K 29. září nebyly podrobnosti o zranitelnosti veřejně zveřejněny [25] [31] .
Objevil Tavis Ormandy při práci na CVE-2014-6271 :
env X='() { (a)=>\' sh -c "echo date"; cat echo
Test způsobí, že se "echo" stane názvem souboru pro přesměrování výstupu a "datem" se provede. Chyba dostala číslo CVE-2014-7169 [3] .
Příklad chyby 7169 v systému, který obdržel opravu chyby CVE-2014-6271 , ale nikoli chybu CVE-2014-7169 [32] $ X = '() { (a)=>\' bash -c "datum odezvy" bash: X: řádek 1 : chyba syntaxe poblíž neočekávaného tokenu ` = ' bash: X: řádek 1: `' bash: chyba při importu funkce definice pro ` X ' [ root@ ec2-user ] # cat echo Pá 26. září 01:37:16 UTC 2014Oprava CVE-2014-6271 i CVE-2014-7169 test přeruší:
$ X = '() { (a)=>\' bash -c "datum odezvy" datum $ kočičí ozvěna cat: echo: Žádný takový soubor nebo adresářChyba je způsobena podobnými problémy v kódu Bash [33] , ale je ovlivněna opakovaným "<<EOF"
Test bash -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF' || echo "Vulnerable by CVE-2014-7186, redir_stack" Dotčený systém zobrazí text „Vulnerable by CVE-2014-7186, redir_stack“.Chyba je způsobena podobnými problémy v kódu Bash [33] , ale je ovlivněna vícenásobným opakováním "hotovo"
Test ( pro x v { 1 ..200 } ; do echo "for x $x in ; do :" ; hotovo ; pro x v { 1 ..200 } ; do echo hotovo ; hotovo ) | bash || echo "Zranitelné od CVE-2014-7187, word_lineno" Dotčený systém zobrazí text „Vulnerable by CVE-2014-7187, word_lineno“.Do hodiny po zveřejnění zranitelnosti Bash se objevily zprávy o hacknutí počítačových systémů s její pomocí. 25. září byly potvrzeny různé útoky „ve volné přírodě“, od jednoduchých útoků DoS až po nasazení serverů pro příkazy a řízení prostřednictvím škodlivého systému „BASHLITE“ [34] [35] . Společnost Kaspersky Labs oznámila, že některé z infikovaných počítačů zahájily útok DDoS proti třem cílům [8] . 26. září byl objeven botnet „wopbot“, složený ze serverů infikovaných přes bashdoor a používaný v DDoS proti CDN Akamai Technologies a ke skenování sítí amerického ministerstva obrany [7] .
Existuje několik potenciálních způsobů, jak může útočník předat libovolné proměnné prostředí bash běžícímu na napadeném serveru:
Webové servery spouštějící skripty Common Gateway Interface (CGI) předávají podrobnosti uživatelského požadavku prostřednictvím proměnných prostředí, jako je HTTP_USER_AGENT. Pokud je požadavek zpracován programem Bash, nebo jiným programem, který interně volá bash, pak může útočník nahradit řetězec User-Agent přenášený přes http spouštěčem útoku Shellshock přidáním vlastních příkazů [36] . Jako takový příkaz lze zadat například instrukci „ping“ s adresou útočníka. Z příchozích požadavků ping bude útočník vědět, zda útok fungoval.
Přestože je CGI starším rozhraním s jinými bezpečnostními riziky [37] , stále se používá. Například jeden ze standardních skriptů cPanel je zranitelný [38] , odhaduje se, že zranitelný cPanel lze použít na 2–3 % webů [39] .
OpenSSH SSH server vám umožňuje omezit uživatele na pevnou sadu dostupných příkazů (volba "ForceCommand"). Pevný příkaz se provede, i když uživatel požádal o provedení jiného příkazu. Požadovaný příkaz je v tomto případě uložen v proměnné prostředí "SSH_ORIGINAL_COMMAND". Pokud je v prostředí Bash spuštěn pevný příkaz (pokud je interpret uživatele nastaven na Bash), GNU Bash při spuštění zjistí hodnoty SSH_ORIGINAL_COMMAND vložené do prostředí a v případě zranitelnosti Bashdoor spustí tam vložené příkazy. Útočník s přístupem pouze k omezenému prostředí tedy získá neomezený přístup [3] .
Klient DHCP obvykle požaduje adresu IP od serveru DHCP. Server však může odeslat několik dalších možností, které mohou být zapsány do proměnných prostředí a způsobit zneužití Shellshocku na počítači nebo notebooku připojeném k místní síti [40] [41] .
Program s nastaveným bitem setuid může volat bash přímo nebo nepřímo pomocí systémových volání system(3) , popen a dalších, bez resetování proměnných prostředí. Útok Shellshock by v takových případech umožnil místnímu uživateli povýšit svá vlastní oprávnění na vlastníka programu podobného setuid, často až na root (superuživatele).
Chyba by se mohla potenciálně dostat k systémům, které nejsou připojeny k internetu během offline zpracování s bash [42] .