POODLE bei Logjam pažeidžiamumai


POODLE

Po daug dėmesio sulaukusio Heartbleed pažeidžiamumo OpenSSL projektas vis dažniau sulaukia liūdnų naujienų. 2014 m. Rugpjūčio 14 d. Google tyrėjai publikavo naują SSL pažeidžiamumą pavadinimu POODLE, kuris išnaudoja seną bei skylėtą SSL 3.0 protokolą. Šis protokolas daugumoje bibliotekų buvo pakeistas saugesniais TLS 1.0, TLS 1.1 bei TLS 1.2 variantais, tačiau dėl suderinamumo su senais įrenginiais SSL 3.0 yra vis dar plačiai palaikoma kaip atsarginė komunikacijos priemonė. Realistiškame POODLE išnaudojimo scenarijuje įsilaužėlis, turėdamas prieigą prie tinklo kanalo, priverčia kliento naršyklę vykdyti Javascript kodą, siunčianti HTTPS užklausą į pasirinktą puslapį SSL 3.0 protokolu. Tokiu atveju HTTPS užklausoje esantys konfidencialūs duomenys, tokie kaip „saugūs“ sausainėliai (pvz. prisijungimų sesijos) gali būti nesunkiai nugvelbti.

Rekomendacijos

Apsisaugojimui nuo POODLE užtenka visiškai išjungti suderinamumą su SSL 3.0 protokolu. Daugumai vartotojų tai reiškia programinės įrangos (naršyklių) atnaujinimą. Pasitikrinti ar naršyklė yra pažeidžiama galima apsilankius puslapyje – https://www.poodletest.com/. TLS klientams užmezginėjant saugų ryšį taip pat rekomenduojama naudoti TLS_FALLBACK_SCSV mechanizmą, kuris vykstant perėjimui prie žemesnės protokolo versijos įspėja serverį apie galimą ataką ir leidžia nutraukti susijungimą.

Administratoriams reikėtų įsitikinti, kad SSL 3.0 yra išjungtas visuose OpenSSL biblioteką naudojančiuose servisuose. Kadangi tai yra pačio protokolo pažeidžiamumas alternatyvių sprendimų nėra. Apache atveju konfigūracijos eilutė atrodytų taip:

SSLProtocol all -SSLv3 -SSLv2

Postfix pašto serveriui:

smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3

Logjam

Kitas TLS pažeidžiamumas pavadinimu Logjam pasiekė naujienas 2015 Gegužės mėn. Šis pažeidžiamumas išnaudoja nesaugius Diffie-Hellman raktų apsikeitimo protokolo parametrus. Diffie-Hellman – bene labiausiai žinoma raktų kriptografijos sistema, leidžia dviem pašnekovams sutarti naudoti tą patį šifravimo raktą per nesaugų tinklo kanalą. DH saugumas yra paremtas matematiškai sudėtinga diskrečiojo logaritmo problema: bk = g lygties sprendimas su nežinomuoju „k“, kuomet „b“ ir „g“ priklauso baigtinėms grupėms. DHE (paprastasis Diffie-Hellman) atveju šios grupės yra dauginamieji su pirminio skaičiaus, dar vadinamu DH parametru „p“ moduliu.

Pažeidžiamumo centre vėl atsiduria suderinamumas su senomis sistemomis, tačiau šį kartą ne senąja protokolo versija, o nesaugiais Diffie-Hellman parametrais (export ciphersuite arba DHE-EXPORT). Šie parametrai yra užsilikimas nuo 1990 m. kuomet JAV buvo nelegalu stiprias kriptografijos sistemas išvežti iš šalies (eksportuoti). Konkrečiai DHE naudojamas pirminis skaičius turėjo būti ne didesnis nei 512 bitų, kas šių dienų standartais yra nesaugu. Diskrečiojo logaritmo problema yra labai sunkiai išsprendžiama, ypač kuomet naudojamas pirminis skaičius (modulis) yra sudarytas iš 2048 bitų ar daugiau, tačiau su mažesniais moduliais yra teoriškai (ir kai kuriais atvejais praktiškai) įveikiama. Besidomintys šiek tiek daugiau techninių detalių apie Logjam ir POODLE ras apačioje, o dabar norėtumėm pateikti apsisaugojimo rekomendacijas.

Rekomendacijos

Paprasčiausias būdas apsisaugoti yra DHE-EXPORT draudimas, ką vartotojams ir garantuoja populiarių naršyklių atnaujinimai. Serverių administratoriams siūloma pasitikrinti ir naudoti šiame puslapyje skirtingiems servisams rekomenduojamus TLS nustatymus – https://weakdh.org/sysadmin.html. Pateikiamos trys pagrindinės rekomendacijos:

1) Stiprių ir unikalių DH parametrų sugeneravimas. Rekomenduojama sugeneruoti 2048 bitų DH grupę (modulio dydį):

openssl dhparam -out dhparams.pem 2048

2) DHE-EXPORT išjungimas. Apache atveju prie anksčiau minėto SSLv2 ir SSLv3 išjungimo reikėtų pridėti:

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on

Tai išjungs nesaugius šifravimo algoritmus.

Taip pat reikėtų nepamiršti nurodyti sugeneruotus DH parametrus. Apache 2.4.8 ir naujesnėm versijom:

SSLOpenSSLConfCmd DHParameters "{kelias iki dhparams.pem}"

3) Naudoti elipsinių kreivių grupes. Viršuje aprašyta Apache konfigūracija teikia pirmenybę būtent šiems algoritmams. Elipsinių kreivių metodas diskrečiojo logaritmo problemai suteikia stipresnes saugumo garantijas net ir su trumpesniais raktais (ypač efektyvu mažiau galingiems įrenginiams).

 

Rekomenduojama daugiau dėmesio skirti ir bendriems kriptografiniams nustatymams. Internete sklando keletas projektų, kurie siūlo saugias ir patikrintas rekomendacijas, vienas iš tokių projektų – https://bettercrypto.org/.

 

LITNET CERT tarnyba taip pat atlieka standartines kompiuterių, sistemų, tinklų saugumo patikras, kurių metu gali būti nustatomos šios saugumo spragos bei pateikiama išsami ataskaita. Patikros užsakymo nuoroda – https://cert.litnet.lt/saugumo-patikra/.

 

Technical

POODLE pažeidžiamumas, dar kategorizuojamas kaip „padding oracle“ ataka, remiasi nesaugiai naudojamu užpildymo (padding) mechanizmu blokiniame šifravime. Šifruojant duomenis blokais siunčiamos informacijos kiekis dažniausiai nesutampa su bloko ilgio daugikliu, tokiais atvejais protokolas yra numatęs užpildymo schemas, tokias kaip PKCS#5, kurios metu į paskutinio bloko „n“ baitų kiekį yra įrašoma ta pati reikšmė „n“. Tokiu atveju dešifruojant duomenis tiesiog ignoruojami „n“ užpildo baitai. Atakos modelis remiasi prielaida, kad egzistuoja „orakulas“, t.y sistema, kuri gali priimti šifruotus blokus ir grąžinti klaidą kuomet užpildas yra neteisingai suformuotas (paskutiniai „n“ baitai nėra lygūs „n“). Kadangi SSL 3.0 protokolas naudoja autentifikuotą CBC šifravimą, tačiau užpildas yra neautentifikuotas, įsilaužėlis turėdamas prieigą prie tinklo kanalo gali jį modifikuoti. CBC šifravimo schemos grafikas pateiktas žemiau[1]:

 

CBC_encryption

 

Dešifravimas vykdomas analogiškai, tik XOR ir blokinio šifravimo raktu operacijos yra sukeistos vietomis.

Standartinė „padding oracle“ ataka veikia bandant atspėti paskutinio bloko (plaintext) baitų reikšmes. Kadangi CBC schemoje dešifruojant „i“ bloką pabaigoje yra vykdoma XOR operacija su prieš tai einančiu šifro bloku, įsilaužėlis keisdamas priešpaskutinio šifro bloko baitus gali manipuliuoti „orakulu“ tol kol įvyksta teisingas spėjimas, tuomet bandoma su sekančiu baitu ir t.t. Situacija tampa dar paprastesnė kuomet užpildas yra visas paskutinis blokas. Tuomet įsilaužėlis žino jo reikšmę, nes bloko dydis yra taip pat žinomas. Besidomintiems puikų techninį aprašymą galima rasti InfoSec Institute puslapyje.

Realiame POODLE išnaudojimo scenarijuje įsilaužėliui turint prieigą prie tinklo kanalo aukos naršyklė yra priverčiama vykdyti Javascript kodą, siunčiantį saugią (HTTPS) užklausą į norimą puslapį. Kontroliuojant šį Javascript kodą galima manipuliuoti užklausos parametrais ir priversti aukos naršyklę visą paskutinį užklausos bloką panaudoti kaip užpildą. Tuomet naudodamas serverį kaip „orakulą“ savo spėjimams įsilaužėlis gali nesunkiai nuspėti konfidencialius HTTPS užklausos duomenis (jau minėti „saugūs“ sausainėliai).

 

Logjam, kaip ir POODLE, išnaudojimas yra pradedamas per MITM (Man in the Middle) ataką TLS susijungimo, dar vadinamo rankų paspaudimu, etape. Įsilaužėlis, turėdamas prieigą prie tinklo kanalo, modifikuoja protokolų pasirinkimo žinutes taip, kad tiek serveris, tiek klientas yra priversti naudoti DHE-EXPORT (512-bit Diffie-Hellman modulį)[2]:

 

https-weakdh-org-imperfect-forward-secrecy-pdf-2015-05-21-01-19-48

 

Prieš baigiant rankų paspaudimo etapą sėkmingam atakos veikimui įsilaužėlis turi išspręsti 512 bitų DH problemą (dlog funkcija viršuje). Net ir su 512 bitų moduliu ši užduotis yra ganėtinai komplikuota – greičiausias žinomas sprendimo algoritmas užtruktų apie porą metų. Situaciją palengvina tai, kad dauguma sistemų naudoja tuos pačius fiksuotus pirminius DH skaičius (kriptografiniui saugumui naudojant pakankamą bitų kiekį tai įtakos nedaro), o tokiu atveju galima iš anksto suskaičiuoti diskrečiojo logaritmo problemai reikalingus parametrus. Šių pirminių parametrų skaičiavimas būtent ir užima didžiąją laiko dalį tokiuose algoritmuose kaip GNFS, taigi galima pasiekti kompromisą tarp vietos atmintyje ir procesoriaus darbo laiko. Tyrimo metu buvo prieita prie išvadų, kad naudojant per dviejų savaičių išankstinius skaičiavimus sukurtas lenteles šią ataką galima įvykdyti per keletą minučių, o to TLS sesijos užmezgimui turėtų pakakti

 

 

[1]: http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#CBC

[2]: https://weakdh.org/imperfect-forward-secrecy.pdf