«

»

postřehy ohledně BASHe

Při dění kolem Bashe v nedávné aféře jsem byl donucen aktualizovat všechny svoje nainsatalované distribuce od Mandrivy po Ubuntu. Ty novější  (např Ubuntu 12.04 LTS a samozřejmě nejnovější 14 ) šly aktualizovat automaticky z repozitářů.

Ale u některých postarších (konkrétně třeba Mandriva 2010, Ubuntu 13.04) už jejich tvůrcům na bezpečnosti asi tolik nezáleží , takže nezbylo než v těchto případech kompilovat ze zdrojového kódu 

Pominu fakt, že patche přibývaly téměř každým dnem po dobu zhruba dvou týdnů. Když už tahle zranitelnost vydržela více jak 10 let, potom myslím, že ten týden zdržení na vydání jedné kumulativní záplaty by se asi dal vydržet ale budiž…

Zaujalo mne však, že ani po aplikaci všech záplat jsem se s verzí 3.2.57 nedostal přes všech 5 testů bez ztráty květinky. Zkrátka mi na jednom stroji zranitelnost 7187 (nested loops) stále zůstává a nejde opravit.

Toto jsem vyřešil tak, že jsem vyměnil shelly a místo bashe mám teď pro všechny defaultně sh. Jediný účet s bashem používám jenom já pro správu. Mohl jsem si to dovolit, protože se jedná o backend server bez lokálního přístupu běžných uživatelů .

Nicméně, zjistil jsem, že se mezi sebou verze BASHe poměrně zásadně liší i mezi dvěma minoritními verzemi, konkrétně neopatchovaná 3.2.48 vs 3.2.57:

Totiž původní neopatchovaná verze byla benevolentní co se týče deklarace funkcí, zatímco opatchovaná je v tomto striktní. Vzhledem k povaze objevených zranitelností by se to dalo očekávat, nicméně pro nepřipravené to znamená komplikace a nepříjemnosti spojené s laděním nutným po opatchování.

Skripty odladěné na přechozí verzi po opatchování začaly najednou kravit a vyhazovat chyby, které jsem nikdy předtím nezaznamenal. Poněkud mne zarazilo že to nedělaly ani tak moje vlastní skripty, ale často i poměrně zásadní součásti systému, zejména rd (init) skritpy.

Zjistil jsem, že zatímco původní neopatchovaná verze bashe umožňovala deklarovat funkci minimálně třemi způsoby:

standartně:

function function_name {
command
}

 zkráceně ( C++ like ):

function_name () {
command
}

a navíc také tolerovala sémanticky chybný zápis ve formě:

function function_name () { 
command… 

což už ale opatchovaná striktní verze nezkousne !!  

Bylo nutné tyto nestandartní zápisy ručně opravit. 

Nejsem odborník na nastavení bashe, možná že by se dala pomocí nějaké proměné nastavit citlivost parseru na takto chybné zápisy. Vzhledem k aféře se zranitelností shellshock si ale spíš myslím, že zpřísnění a “striktní mód” je na místě. Myslím, že jinak než úpravou kódu se těmto nepříjemnostem asi nelze vyhnout.