BlueKeep este o vulnerabilitate a computerului din implementarea Microsoft Remote Desktop Protocol care permite executarea de cod de la distanță . BlueKeep afectează toate versiunile neactualizate de Windows din linia Windows NT , de la Windows 2000 la Windows Server 2008 R2 și Windows 7 . În septembrie 2019, exploit- ul BlueKeep a fost făcut disponibil public ca parte a proiectului Metasploit [1] .
Potrivit NSA și Microsoft , BlueKeep are potențialul de a fi exploatat de viermi de computer , Microsoft afirmând, pe baza unei estimări de 1 milion de dispozitive vulnerabile, că un astfel de atac ar putea fi la o scară comparabilă cu atacurile EternalBlue precum NotPetya și WannaCry. [2] [3] [2] [3] [4] .
Vulnerabilitatea a fost evidențiată de CVE -ID CVE-2019-0708 [5] .
Vulnerabilitatea BlueKeep a fost descoperită în implementarea protocolului RDP în unele versiuni ale sistemului de operare Windows în mai 2019. RDP este un protocol proprietar care oferă acces de la distanță la computerele care rulează Windows. BlueKeep nu are nimic de-a face cu mecanismul protocolului în sine și afectează doar implementarea acestuia. În special, vulnerabilitatea afectează partea din cod responsabilă cu gestionarea așa-numitelor canale virtuale . RDP utilizează diferite circuite virtuale pentru a transporta diferite tipuri de date. De exemplu, canalul „rdpsnd” transmite audio, în timp ce canalul „cliprdr” este folosit pentru a transmite conținutul clipboard-ului . Circuite virtuale suplimentare pot fi utilizate pentru a oferi extensii ale protocolului RDP la nivelul aplicației utilizator. În Windows 2000 , erau disponibile doar 32 de canale virtuale statice și, prin urmare, pentru a evita această limitare, a fost propus mecanismul canalelor virtuale dinamice, care permite transmiterea mai multor canale dinamice într-unul static. Canalele statice sunt create atunci când o sesiune RDP este creată și există până când aceasta este închisă, în timp ce canalele dinamice pot fi create și șterse la cererea clientului. De asemenea, spre deosebire de canalele statice, care sunt numerotate cu un număr întreg de la 0 la 31, canalele dinamice sunt identificate prin numele șirului lor . Windows leagă numele canalelor dinamice la numerele canalelor statice în funcțiile _IcaBindVirtualChannels și _IcaRebindVirtualChannels conținute în driverul termdd.sys [6] .
În mod implicit, RDP rezervă numărul 31 pentru un circuit virtual intern, nedirecționat de utilizator, numit „MS_T120”. Cu toate acestea, driverul nu verifică existența unui canal virtual personalizat cu același nume. Astfel, un atacator poate crea un alt canal dinamic numit „MS_T120” și îl poate lega de un canal static cu un număr diferit. În acest caz, un pointer către o instanță deja existentă a canalului dinamic „MS_T120” va fi asociat cu noul număr. Când canalul creat de atacator este închis, memoria este eliberată , după care indicatorul suspendat către canalul „MS_T120” asociat cu numărul 31 rămâne în sistem, ceea ce poate duce la erori de acces la memorie [6] . Situația este agravată de faptul că crearea de canale virtuale dinamice poate avea loc înaintea etapei de autentificare a utilizatorului , ceea ce permite ca BlueKeep să fie folosit de viermii informatici . Această problemă este parțial rezolvată prin utilizarea Network Level Authentication (NLA) , care a apărut în Windows Vista , o opțiune a protocolului RDP care necesită autentificarea utilizatorului înainte de stabilirea unei conexiuni [7] .
Microsoft a lansat o actualizare de securitate (inclusiv pentru mai multe versiuni de Windows a căror perioadă de suport a ajuns la sfârșit, în special pentru Windows XP ) pe 14 mai 2019 [4] . Versiunea corectată a driverului termdd.sys nu permite alocarea altor numere decât 31 unui canal numit „MS_T120”.
Numele „BlueKeep” pentru această vulnerabilitate a fost dat de expertul în securitate informatică Kevin Beaumont în postarea sa pe Twitter .
BlueKeep a fost menționat pentru prima dată de Centrul Național de Securitate Cibernetică din Marea Britanie [8] , raportul Microsoft a fost lansat pe 14 mai 2019 împreună cu o actualizare de securitate care remediază această vulnerabilitate. Ulterior, pe 4 iunie 2019, NSA și-a emis avizul de securitate [3] .
În aceeași zi în care a fost lansat avizul NSA, o echipă de cercetători de la centrul de informații CERT a raportat o altă vulnerabilitate legată de protocolul RDP în Windows 10 May 2019 Update și Windows Server 2019 . În special, cercetătorii au remarcat faptul că acreditările de autentificare la nivel de rețea sunt stocate în cache pe sistemul client, iar utilizatorul își poate reaccesa automat conexiunea RDP dacă se întrerupe. Microsoft a respins această vulnerabilitate ca fiind un comportament intenționat, argumentând că poate fi dezactivată folosind mecanismul Politicii de grup [9] .
Începând cu iunie 2019, au fost depuse mai multe PoC -uri de lucru pentru a exploata această vulnerabilitate. În special, McAfee [6] și Sophos [10] [11] și-au prezentat versiunile . Pe 22 iulie 2019, în cadrul conferinței au fost prezentate mai multe informații despre BlueKeep de către un vorbitor de la o companie chineză de securitate a informațiilor [12] . Pe 25 iulie 2019, experții au declarat că o versiune comercială a exploit- ului ar fi putut fi disponibilă la acel moment [13] .
Pe 13 august 2019, a fost raportat DejaBlue , un nou grup de vulnerabilități legate de BlueKeep. Pe lângă versiunile mai vechi de Windows, DejaBlue a fost afectat și de versiunile mai noi ale sistemului de operare până la Windows 10 [14] .
Pe 6 septembrie 2019, un exploit pentru vulnerabilitatea BlueKeep ca parte a Metasploit [1] a apărut în domeniul public . Cu toate acestea, versiunea inițială a exploit-ului sa dovedit a fi extrem de nesigură din cauza apariției frecvente a unei erori BSoD . O versiune revizuită a devenit disponibilă mai târziu [15] .
Pe 2 noiembrie 2019, a fost raportat primul atac masiv al hackerilor BlueKeep legat de criptomoneda Monero [ 16] [17] . Pe 8 noiembrie 2019, Microsoft a confirmat atacul și a îndemnat utilizatorii să își actualizeze versiunile de Windows cât mai curând posibil [18] .
Cel mai simplu mod de a exploata vulnerabilitatea BlueKeep este implementarea unui atac DoS pe baza acesteia. Când un client se conectează, pe server este creat automat un canal „MS_T120” asociat cu numărul static 31. Utilizând MCS Connect Initial PDU cu cererea GCC Conference Create Request RDP, clientul poate crea canale dinamice suplimentare la alegere, în timp ce serverul returnează numărul de canale statice asociate în mesajul de răspuns RDP. Deoarece această solicitare are loc înainte de pasul de autentificare a utilizatorului , atacatorul nu trebuie să aibă un cont în sistem pentru a efectua cu succes atacul. Dacă clientul specifică „MS_T120” în lista de canale, serverul, apelând din nou funcția _IcaBindVirtualChannels , va lega o instanță existentă a structurii canalului la un număr diferit de 31. Când sesiunea se termină, serverul va elibera mai întâi memorie alocată la închiderea canalului creat de atacator, după care va încerca să elibereze aceeași memorie în sine atunci când încearcă să închidă canalul numărul 31. Astfel, există o dublă eliberare de memorie în interiorul driverului termdd.sys . Deoarece eroarea apare în spațiul kernelului , blochează sistemul de operare într-un BSoD [19] [20] .
Mult mai periculoasă este utilizarea BlueKeep pentru executarea codului de la distanță (RCE) . Structurile de date cu informații despre canalele dinamice sunt stocate în pool-ul nepaginat . Memoria pentru mesajele stocate în coada de canale este, de asemenea, alocată în pool-ul nepaginat. Memoria alocată unui anumit mesaj este eliberată numai atunci când este citită de pe canal, adică dacă canalul nu este citit, atunci memoria va fi eliberată doar în momentul în care conexiunea este închisă [21] .
Pentru a efectua RCE, un atacator trebuie să realoce și să suprascrie memoria la adresa la care se afla structura canalului „MS_T120” înainte ca memoria să fie eliberată. Pentru a efectua execuția codului rău intenționat, este suficient să schimbați valoarea pointerului către tabelul de metode virtuale din această structură la valoarea dorită. Această sarcină este mult facilitată de absența unui mecanism de prevenire a executării datelor (DEP) în pool-ul nepaginat în versiunile de Windows anterioare Windows 7 . Aceasta înseamnă că codul rău intenționat poate fi plasat la aceeași adresă ca tabelul de metode virtuale false. Atât schimbarea pointerului, cât și plasarea directă a codului rău intenționat se pot face prin mecanismul menționat mai sus de trimitere a mesajelor pe un canal care nu va fi citit din [21] .