Subiecte

tls ssl ddt lsd

Internetul vuieste de bugul catastrofic din OpenSSL. OpenSSL este o componentă extrem de des folosită pentru comunicație criptată între calculatoare, de exemplu pentru trimiterea parolei atunci când încerci să îți verifici e-mailul sau să faci o plată pe site-ul băncii.

Cum se manifestă concret problema: oricine poate fura cât de des poftește din memoria calculatorului cu care e conectat câte 64KB arbitrari de date (atât clientul malițios de la un server cât și un server malițios de la client). Dacă furi destul de des câte 64KB din conținutul memoriei unui calculator ai toate șansele să găsești lucruri foarte interesante acolo cum ar fi parole, adrese, conturi, cod, te miri ce. Cireașa de pe tort e că toată manevra nu lasă niciun fel de urme deci acum când toată lumea vuiește, nimeni nu poate ști măcar dacă i s-au furat date prin această metodă, câte sau de când. Problema e și mai gravă dar mă rezum la atât.

 

Ce are special vinovatul OpenSSL?

În primul rând e gratis și open source, adică oricine o poate folosi cum vrea și poate studia codul să vadă cât e de perfect scris. Dogma spune că dacă e open source putem găsi bugurile și deci șansele ca ele să existe și să persiste sunt mai reduse. OpenSSL e o componentă critică, folosită pentru comunicații securizate în mai toate domeniile, de la comunicații (chat, e-mail) până la tranzacții bancare. În plus codul nici nu e foarte mare deci te-ai gândi că unele entități care toarnă miliarde prin conducte “asigurate” cu OpenSSL au plătit pentru ceva auditări de securitate dacă tot sunt disponibile sursele. Și poate chiar au făcut-o…

O altă trăsătură mai specială a OpenSSL este de multă vreme binecunoscută prin cercurile IT preocupate de problema open-source: autorul original al componentei buclucașe Eric Young a scris codul inițial ca să învețe algoritmul de împărțire pentru numere mari. Traiectoria ulterioară a personajului l-a dus spre RSA, companie care acum se știe că a primit bani de la NSA pentru a folosi algoritmi care fac vulnerabilă generarea de numere aleatoare, componentă esențială în criptare. Destin…

Când auzi așa ceva nu îți vine să te întrebi “de ce dracu’ folosim noi mizeria asta?”.

Mulți nici măcar nu sunt conștienți că folosesc OpenSSL, e posibil să o ai și tu acum în buzunar pe telefonul mobil, în router, în decodorul pentru cablu TV, în playerul media din sufragerie, în contorul de gaz sau curent de pe scara blocului.

 

Am văzut cum lumea se uită la codul scris prost și se dă cu părerea. Codul nici măcar nu e foarte vinovat. Vinovat e imbecilul care a scris specificația protocolului, imbecil care nu știu dacă întâmplător sau nu este și autorul codului. Din nefericire specificația mizerabilă practic imploră eroarea în cod.

 

Foarte pe românește, protocolul (regulile după care 2 calculatoare conversează) conține o parte neesențială care asigură un calculator că nu a pierdut legătura cu celălalt. Mai exact, regula spune așa: când calculatorul meu vrea să fie sigur că nu a pierdut legătura cu interlocutorul, îi transmite o propoziție și interlocutorul trebuie să o transmită înapoi. Dacă nu o transmite înapoi exact, conexiunea s-a întrerupt.

Ce spune mai concret protocolul imbecil: calculatorul meu dacă vrea să verifice conexiunea, trimite spre celălalt calculator CE VREA MUȘCHII LUI, lejer, chiar și o poveste de Ion Creangă, împreună cu numărul de caractere (litere) ale snoavei. Celălalt calculator primește povestea împreună cu numărul de litere și o transmite înapoi. Dacă la calculatoru meu se întoarce aceeași poveste, legătura e încă activă.

 

Când vezi ca programator specificația asta în protocol în primele 5 secunde îți pui niște întrebări: de ce să pot trimite date practic oricât de mari? De ce nu ajunge o dimensiune fixă specificată din start în protocol, să zicem 4 bytes? Pentru ce arbitrarul ăsta? Ca să pot greși la alocarea spațiului la recepție? Cui poate folosi să trimită 39345 bytes ca heartbeat? De ce complicația de a impune în implemenetarea codului să tratezi dimensiuni arbitrare pentru heartbeat? Doar ca să ai nevoie să transmiți în plus și dimensiunea pachetului? De ce redundața asta (o dată datele, încă o dată dimensiunea lor)? Ca să poți greși în declararea numărului de caractere? De ce toată logica pentru verificarea dimensiunii posibil greșite a datelor din pachetul heartbeat? Pentru ce să tratez eroarea și să comunic că pachetul este eronat și în ce fel e eronat? Implementarea pentru așa o specificație e condamnată la ineficiență și aproape condamnată la eroarea care chiar s-a… implementat. După mine ca privitor în urma trenului e dovadă de prostie sau de… lucrare la comandă.

Ce face greșit OpenSSL? Dacă i se trimite o cerere de verificare a conexiunii (heartbeat) care are 4 bytes DAR calculatorul care a solicitat pretinde că datele au 65535 bytes, OpenSSL răspunde cu… 65535 bytes, primii 4 fiind chiar cei primiți de la partea solicitantă (deci corecți) urmați de restul de 65531 de … ce dă dumnezeu să se afle prin memorie în continuare. Ați ghicit, e vorba de limbajul C.

Vina la implementare (presupunând că nu e rea intenție)? 20%. Restul de 80% după mine e vina specificației care ar fi trebuit scrisă de cineva infinit mai înțeleapt dar care întâmplător s-a dovedit a fi exact… programatorul. În total 100%. Pentru merite deosebite sper că respectivul a fost imediat decorat cu cea mai înaltă distincție pentru eroi încă în viață de către însuși Nașul Suprem American.

Dacă specialistul care a formulat specificația era mai plăvan, nu așa liberal în exercițiul imaginativ, ar fi spus clar și lipsit de poezie: pentru heartbeat se transmit 4 bytes. Partea corespondentă va răspunde cu… 4 bytes, de exemplu cu cei 4 bytes negați la nivel de bit sau XOR cu o constantă a conexiunii, orice prelucrare simplă așa încât să se poată EFICIENT verifica faptul că la celălalt capăt al firului nedezlipit e cineva atent nu un perete care reflectă ecou și că răspunsul corespunde acestei cereri și nu uneia vechi. Codul era semnificativ mai scurt, mult mai rapid, MULT mai sigur, bugul despre care povestim era practic imposibil. Dacă…

 

Lectură suplimentară recomandată (anteHeartbleed): despre NSA.

1 comentariu la tls ssl ddt lsd

  • Aburel

    Deci nu e vina lu ala ce a scris codul sau specificatia. Vina e a celor care s-au hotarit sa foloseasca manjeala asta.
    Si Lara (care are 4 ani) picteaza dar, pana acum, nimeni nu i-a expus oprerele intr-un muzeu. Si nu e vina ei.

Comentați

 

 

 

Puteţi folosi aceste etichete HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

captcha: * Time limit is exhausted. Please reload CAPTCHA.

WordPress Appliance - Powered by TurnKey Linux