Articol bazat pe: RedHat Security Blog.
 

Bash, sau Bourne again shell, este un shell UNIX, ce este probabil unul din cele mai instalate utilitare pe orice sistem Linux. Din 1980 de când a fost creat, bash a evoluat dintr-un interpretor simplu de comenzi într-un utilitar complex.

În Linux, variabilele de mediu reprezintă o modalitate prin care funcționarea utilitarelor din sistemul de operare poate fi influențată. În mod uzual aceste variabile au un nume și o valoare asociată acestuia și sunt folosite de mai multe aplicații și utilitare, inclusiv de către shell-uri. Este de asemenea uzual pentru mai multe programe să folosească în fundal un shell, pentru a oferi funcționalități precum parsarea script-urilor CGI sau suport limitat pentru executarea anumitor comenzi (ex: git).

Vulnerabilitatea CVE-2014-6271 este derivată din faptul că se pot crea variabile de mediu ce conțin anumite valori, înainte de a lansa în execuție shell-ul. Aceste variabile pot conține cod ce va fi executat de îndată ce shell-ul este pornit. Nu este necesar ca variabilele de mediu să aibă o denumire specială, în schimb este necesar ca valoarea acestora să fie într-o anumită formă pentru a permite executarea codului. Din această cauză, vulnerabilitatea poate fi exploatată în mai multe contexte, de exemplu:

  • parametrul ForceCommand este folosit în configurarea serviciului ssh pentru a pune la dispoziție anumitor utilizatori execuția de comenzi specifice, limitate. Vulnerabilitatea poate fi folosită pentru a ocoli restricțiile impuse și pentru a putea executa orice comenzi pe un sistem. În anumite cazuri, serverele ce oferă servicii folosind Git sau Subversion pot folosi astfel de shell-uri. Serviciile oferite prin SSH (OpenSSH, SSH, etc) nu sunt afectate întrucât utilizatorii ce se conectează de la distanță au oricum posibilitatea de a rula orice comenzi;
  • serverele web Apache ce au activate modulele mod_cgi sau mod_cgid sunt afectate dacă pe acestea există script-uri CGI ce folosesc bash pentru execuție sau pentru a oferi alte funcționalități (execută comenzi externe în background, folosind bash). Astfel de funcționalități sunt folosite implicit de system/popen în C, os.system/os.popen în Python, system/exec în PHP (atunci când este rulat în mod CGI) și open/system în Perl dacă este folosit un shell (acest lucru depinde de comanda ce trebuie executată);
  • clienții de DHCP (la nivelul sistemului de operare) folosesc script-uri shell pentru a configura diverși parametri ai sistemului de operare. Un atacator ce are acces la un server de DHCP, se poate folosi de acesta pentru a trimite odată cu parametrii necesari și variabile de mediu construite astfel încât îi permit acestuia să execute comenzi arbitrare cu drepturi administrative (derivate din drepturile programului client de DHCP) pe sistemul client;
  • alte servicii și programe cu acces privilegiat (programe și aplicații ce au setat flag-ul SUID) pot folosi diverse script-uri shell pentru oferirea de funcționalități;
  • orice altă aplicație ce folosește un shell sau rulează script-uri shell folosind bash.

Nu sunt vulnerabile:

  • script-urile PHP ce sunt executate folosind mod_php nu sunt afectate chiar dacă execută bash în background;
  • script-urile shell ce nu exportă variabilele de sistem nu sunt vulnerabile chiar dacă lucrează cu variabile ce conțin cod malițios.

Detalii tehnice ale vulnerabilității

Precum limbajele de programare “reale”, Bash are funcții. Deși acestea sunt limitate ca funcționalități, este posibil ca aceste funcții să fie folosite în variabilele de mediu. Vulnerabilitatea este declanșată atunci când se adaugă comenzi la sfârșitul definirii acestor funcții (în interiorul unei variabile de mediu). De exemplu:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" vulnerable this is a test

În momentul de față majoritatea distribuțiilor de Linux au inclus în actualizările de securitate un patch ce adresează acestă vulnerabilitate și se asigură că nu este permisă includerea de comenzi la sfârșitul definirii unei funcții bash. Prin urmare, dacă rulați comanda de mai sus pe un sistem ce are toate actualizările, mesajul primit de la bash ar trebui să fie similar cu:

$ env x='() { :;}; echo vulnerable’ bash -c “echo this is a test”
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x’
this is a test

Aplicarea patch-ului pe sistemele afectate de acestă vulnerabilitate nu afectează în nici un fel aplicațiile și utilitarele ce folosesc script-uri shell. Desigur, acele script-uri ce sunt scrise ca în exemplu vor fi afectate de aplicarea patch-ului însă definirea funcțiilor ca în exemplu este oricum considerată o practică greșită în programarea aplicațiilor.

Alte articole și date relevante:

  1. National Vulnerability Database
  2. Alertă US-CERT
  3. Listă de email Bash
Tagged with:
 

Comments are closed.