Nota editorului: Elastic si-a unit fortele cu Endgame in octombrie 2019 si a migrat o parte din continutul blogului Endgame catre elastic.co. Consultati Elastic Security pentru a afla mai multe despre solutiile noastre de securitate integrate.

In ultimii ani, atacurile de documente bazate pe macro au crescut in popularitate. Avand in vedere costurile crescande ale exploatarii bazate pe coruptia memoriei, datorita nivelului de expertiza si resurse solicitate, atacatorii inteleg ca pot realiza rezultate similare doar convingand utilizatorii sa faca clic pe o caseta de dialog. In consecinta, acest lucru a condus la cresterea furnizorilor de securitate din ce in ce mai multi, adaugand protectii si detectari impotriva acestor atacuri de documente bazate pe macro

Intra in schimbul de date dinamice (DDE).

Aceasta tehnica recent publicata care utilizeaza o caracteristica veche a fost adoptata rapid de diferite grupuri precum Fin7 si a fost folosita in campanii malware, precum Vortex ransomware si Hancitor.

Cea mai buna parte a acestui nou vector de atac DDE este faptul ca are toate caracteristicile unui atac de documente bazat pe macro, fara documentul bazat pe macro. Pentru a lansa cu succes atacul, un atacator trebuie sa convinga pur si simplu un utilizator sa faca clic pe cateva dialoguri si, deodata, se sustrag de la aceste atenuari recente ale documentelor bazate pe macro. In ciuda acestui fapt, Microsoft a spus ca nu va aborda aceasta problema in versiunile actuale, deoarece este o caracteristica, si nu o eroare.

Exploatarile bazate pe macro continua sa persiste datorita functionalitatii utilizatorului si a argumentului ca „este o caracteristica, nu o eroare”. Cu toate acestea, am dorit sa aruncam o privire mai profunda asupra acestui nou vector de atac bazat pe DDE pentru a stabili daca aceasta calitate este valabila si pentru atacurile bazate pe DDE. Am constatat ca, desi DDE are o utilizare valida ca o caracteristica, aspectele care o fac o problema de securitate se indeparteaza un pic de modul in care documentatia descrie designul propus. Mai mult, spre deosebire de macros-urile Office, aceasta problema ar putea fi rezolvata pentru a rezolva aspectele de securitate fara sa afecteze capacitatea de utilizare a utilizatorului final. Vom oferi recomandarile noastre atat pentru o solutie, cat si pentru ceea ce se poate face pentru a ajuta la protejarea impotriva acestei probleme.

fundal

Postarea excelenta de SensePost a adus atentia pentru prima data a bug-ului DDEAUTO. Pentru a intelege eroarea, este important sa discutati pe scurt despre schimbul de date dinamic (DDE).

Array

DDE este un mecanism mostenitor de comunicare inter-proces (IPC) care dateaza din 1987. Ca toate comunicarile IPC, acesta consta intr-un protocol conceput pentru a transmite mesaje intre doua aplicatii. In cazul DDE, aceasta este imbunatatita in continuare, permitand accesul la memoria comuna, fie ca transferuri de date unice sau continue, cat si apeluri de tip evenimente, cand date noi ajung la fiecare capat. Paginile MSDN contin informatii suplimentare despre arhitectura DDE.

Blogul SensePost explica modul de reproducere a erorii DDEAUTO – demonstrand ca executarea comenzii ar putea fi realizata prin DDE intr-un document Word. Microsoft Office ofera o extensie pentru a utiliza DDE in documente pentru a comunica cu procesele externe. DDEAUTO este campul Word specific abuzat de SensePost. Acesta este unul dintre numeroasele tipuri de camp Word definite in MS-DOC, Sectiunea 2.9.90 (flt). Mai mult, DDEAUTO este un cuvant cheie de procesare a cuvintelor definite in ECMA-376, sectiunea 3.1.3.2.2 (DDEAUTO).

De la Microsoft:

„Pentru informatiile copiate dintr-o alta aplicatie, acest camp (DDEAUTO) leaga informatiile respective cu fisierul sursa original folosind DDE si este actualizat automat.

Numele aplicatiei trebuie specificat in camp-argument-1; aceasta aplicatie trebuie sa fie executata”.

Sa descompunem un exemplu canonic al campului DDEAUTO intr-un document:

{DDEAUTO excel „C: \\ Documentele mele \\ Profits.xls” „Foaie1! R1C1: R4C4” \ p}

Aceasta declaratie WordprocessingML va importa o parte a foii 1 a foii de calcul Profits.xls in documentul Word curent prin comunicarea DDE catre procesul EXCEL.EXE, care se presupune ca este deschis.

SensePost a descoperit ca in loc de a specifica o aplicatie precum Excel, ei ar putea specifica o cale absoluta catre o alta aplicatie ca prim parametru pentru DDEAUTO si au citat argumente ca al doilea parametru.

{DDEAUTO c: \\ windows \\ system32 \\ cmd.exe „/ k calc.exe”}

Un atacator este liber sa specifice parametrii arbitrari, cu unele restrictii pe care le vom identifica ulterior. Un element de atentie de care trebuie sa tineti cont este ca atunci cand instructiunea DDEAUTO incearca sa se incarce, utilizatorul este solicitat de mai multe ferestre pop-up (care nu sunt legate de securitate). In acest moment, nu cunoastem o ocolire pentru acest prompt, dar nu am exclus posibilitatea datorita naturii complexe a structurilor de documente. In plus, este important de mentionat ca Microsoft a incurajat dezvoltatorii sa renunte la DDE pentru mecanisme IPC mai moderne, datorita faptului ca DDE este considerata o caracteristica veche si nu mai este utilizat pe scara larga. In blogul SensePost, se precizeaza ca Microsoft a refuzat sa remedieze eroarea pentru versiunile curente, considerand-o o caracteristica, probabil din cauza a ceea ce ei considera ca o interactiune excesiva cu utilizatorii. Avand in vedere utilizarea deja in crestere in campaniile APT in the wild,

In ciuda acestei analize excelente, mai raman mai multe intrebari: care este cauza, cum poate fi prevenita si aceasta este o caracteristica fara nimic de rezolvat?

Eroare sau caracteristica?

Cele mai multe scrieri ale acestei probleme s-au concentrat asupra modului in care este declansat in mod rau si pe marea varietate de comenzi care pot fi executate printr-un document rau intentionat. Am vrut mai intai sa ne scufundam in codul de baza si sa intelegem mai bine ce anume a fost capabil aplicatia cu DDE si ce limitari ar putea intampina un atacator atunci cand incearca sa utilizeze aceasta problema. Va rugam sa retineti, toate numele simbolurilor au fost deduse din codul sursa Word 1.1a disponibil public.

Implementarea DDE reala in Word la wwlib! FGetAppTopicItemPffb va incepe prin configurarea primelor, a doua si a treia argumente de camp DDEAUTO in tabelul Atom global (GAT) prin wwlib! AtomAddSt, un invelis pentru kernel32! GlobalAddAtomW. Aceasta inseamna ca fiecare argument DDEAUTO este limitat la dimensiunea unui ATOM, care nu poate depasi 255 octeti.

In continuare, este apelat wwlib! DclInitiate. Aceasta functie primeste mai intai o referinta de structura globala pentru urmarirea starii actuale a negocierii DDE. Aceasta structura a fost initializata astfel incat primul membru de la offset 0 este un HWND al unei ferestre detinute de winword.exe. Al doilea membru de la offset 4 este initializat la NULL si ar trebui sa reprezinte HWND-ul unei ferestre cu care negociem DDE. Aceasta referinta struct este obtinuta apeland wwlib! PdcldDcl.

In continuare, in wwlib! DclInitiate, USER32! SendMessageTimeoutW este chemat sa transmita mesajul WM_DDE_INITIATE la toate ferestrele de nivel superior ale programelor care ruleaza pe aparat. Fiecare fereastra va primi uTimeout de timp pentru a raspunde la acest mesaj de initiere DDE (0x3e8 sau 1000 milisecunde).

Daca o aplicatie care ruleaza decide sa raspunda la aceasta solicitare de initiere DDE, atunci trimite un mesaj WM_DDE_ACK. Word asculta acest mesaj WM_DDE_ACK in timp ce SendMessageTimeoutW blocheaza inca executia si asteapta expirarea. La primirea acestui mesaj WM_DDE_ACK, structura de comunicare DDE globala este actualizata, iar cel de-al doilea membru al struct este setat la HWND al respondentului. Dupa ce al doilea membru al structului a fost stabilit de primul mesaj WM_DDE_ACK, raspunsurile ulterioare WM_DDE_ACK primesc un mesaj WM_DDE_TERMINATE.

Odata ce SendMessageTimeoutW se intoarce, ia o alta trimitere la structurile de comunicatii DDE si verifica al doilea membru al struct pentru a vedea daca un alt proces a raspuns la difuzare. Daca aceasta valoare este setata, atunci este utilizata ca HWND a celeilalte aplicatii cu care DDE va ​​efectua comunicarea IPC. In acest moment, executia continua normal si continutul este schimbat intre aplicatii pe acest canal DDE. Daca niciun proces nu a raspuns la mesajul WM_DDE_INITIATE si al doilea membru al struct nu este inca setat, atunci Word stabileste ca procesul tinta pentru solicitarea DDE nu este in curs de executie si nu este disponibil pentru comunicarea IPC.

Documentatia de pe MSDN pentru DDE precizeaza ca aplicatia tinta pentru o solicitare DDE ar trebui sa fie deja executata atunci cand se face cererea. In acest moment al codului, daca niciun proces de executie nu a raspuns la mesajul WM_DDE_INITIATE, atunci intregul proces DDE ar trebui sa se opreasca. Pentru a face acest lucru mai usor de utilizat, Word detecteaza ca utilizatorul nu a inceput procesul tinta si incearca sa inceapa procesul pentru ei. Aceasta este situatia in care lucrurile se descurca si se abat de la documentatia MSDN.

In cazul in care nu ati primit un raspuns dintr-un alt proces, executia se incadreaza intr-un apel catre functia Wwlib! FLaunchAppTopic. Aceasta functie este apelata cu ID-urile Atom corespunzatoare din mesajul difuzat. Invelisul wwlib! StFromAtom este chemat sa extraga sirurile din atomii specificati prin intermediul API-ului kernel32! GlobalGetAtomNameW. Aceste siruri de atom sunt apoi combinate in tamponul WCHAR var_414_wstr_cmd prezentat in esantioanele de cod.

Un spatiu este anexat la aceasta variabila WSTR inainte ca cel de-al doilea argument de camp sa fie tras de la tabelul atomului si anexat la sir.

Al doilea atom este apoi citit prin wwlib! StFromAtom. Nota – al treilea atom pe care l-am vazut inregistrat in wwlib! FGetAppTopicItemPffb este aruncat.

Dupa ce atomii sunt folositi pentru a construi sirul var_414_wstr_cmd, wwlib! FOurRunApp este apelat cu sirul construit trecut in registrul ECX.

FOurRunApp atribuie valoarea pointerului unei variabile locale lpCommandLine, care este numita automat de IDA prin propagarea tipului.

In cele din urma, CreateProcessW este apelat cu lpCommanLine, ceea ce duce la executarea comenzii.

Exemplele MSDN DDE mentioneaza ca tinta unei solicitari DDE ar trebui sa fie deja executata, ceea ce are sens, deoarece acesta este un mecanism IPC. Abaterea de la acest lucru pentru imbunatatiri de utilizare este ceea ce permite abuzurilor acestei caracteristici.

Aceasta este o eroare specifica implementarii WDE de la DDE si ar putea fi remediata urmand regulile DDE pe MSDN, solicitand utilizatorilor sa inceapa ei insisi procesul tinta, mai degraba decat sa il faca automat pentru ei. In plus, prompturile oferite de Word ar putea fi inlocuite cu o formulare mai orientata spre securitate, cum ar fi dialogul folosit de Excel inainte de a porni o aplicatie vizata prin DDE.

Dezavantajul acestui lucru este ca elementul cheie in atacurile bazate pe macro ne spune ca unii utilizatori vor face mereu clic pe orice dialog, indiferent de formulare. Corectia corecta aici ar fi sa le solicitati utilizatorilor sa inceapa singuri aplicatia inainte de a face clic pe dialog, apoi sa lasati Word sa incerce din nou cererea.

Detectare

De-a lungul anului 2017, am observat un model foarte comun in randul atacurilor care exploateaza vulnerabilitatile Office si capabilitatile fara documente. In majoritatea acestor atacuri, atacul initial este folosit ca un stager, urmatorul pas executand powershell.exe sau mshta.exe cu o descarcare / executare a sarcinii utile pe linia de comanda. Pe baza cercetarilor noastre anterioare si a ingineriei inverse a acestei erori, putem adopta doua abordari diferite de detectare si prevenire – o abordare whack-a-mole care vizeaza acest bug specific sau o abordare de prevenire mai holistica care vizeaza aceasta clasa de atacuri.

Prima abordare consta in instrumentarea aplicatiilor Office cu cod pentru a detecta incalcari specifice ale comportamentului preconizat. Intrucat DDE este menit sa fie utilizat in mod generic pentru orice aplicatie pentru a comunica cu o alta persoana, aceasta problema nu poate fi detectata prin simpla listare a listelor cu care se poate vorbi cu Word. In acest caz, am putea lua o cale mai simpla de a adauga pur si simplu o protectie in functia de prevenire a exploatarii Endgame care detecteaza instantele in care un nume de proces creat recent si argumente provin atat din mesajele ferestrei DDE de mai sus.

Aceasta abordare este eficienta pentru acest bug, dar este concentrata. In schimb, urmatoarea versiune a platformei Endgame ofera o capacitate de detectie mai generala care foloseste analize comportamentale pentru a detecta produsele Office care executa procese suspecte de copil, cum ar fi mshta.exe sau powershell.exe. De asemenea, putem stabili daca acel proces copil realizeaza conexiuni de retea externe. Combinam aceste doua abordari, oferind un mod robust de a detecta vulnerabilitati si atacuri diferite pe mai multe produse Office.

CONCLUZIE

Utilizarea in crestere a atacurilor cu documente fara macro este cu siguranta ceva ce vom urmari pentru viitorul prevazut. Este nefericit faptul ca Microsoft nu va lucra in continuare pentru a rezolva aceasta problema, avand in vedere implementarea sa din ce in ce mai mare in randul APT-urilor. Asa cum am demonstrat, DDEAUTO este un tip specific de vulnerabilitate din cadrul acestei clase mai largi de atacuri de documente fara macro. In loc sa creeze o solutie unica, cercetarea noastra a identificat un mijloc de protectie nu numai impotriva erorii DDEAUTO, ci impotriva intregii clase de atacuri.