Vulnerabilitatea în cdnjs care a permis executarea codului pe serverele Cloudflare

O vulnerabilitate critică a fost identificată în rețeaua de livrare de conținut cdnjs a Cloudflare, care este concepută pentru a accelera livrarea bibliotecilor JavaScript, permițând executarea de cod arbitrar pe serverele CDN. Pericolul problemei este agravat de faptul că aproximativ 12.7% din toate site-urile de pe Internet utilizează serviciul pentru a descărca biblioteci JavaScript, iar compromisul infrastructurii face posibilă înlocuirea bibliotecilor furnizate de oricare dintre aceste site-uri.

Serviciul cdnjs descarcă pachete din Git sau dintr-un depozit NPM, după care permite oricărui site să folosească gratuit rețeaua de livrare de conținut Cloudflare pentru a accelera încărcarea bibliotecilor JavaScript. La studierea codului componentelor cdnjs publicate pe GitHub, s-a dezvăluit că pentru despachetarea pachetelor NPM din arhivele tgz se folosește modulul standard arhivă/tar în limbajul Go, care produce o listă de fișiere așa cum sunt, fără a normaliza căile. . În cazul în care scriptul despachetează conținutul pe baza listei date, prezența în arhivă a fișierelor precum „../../../../../../../tmp/test” poate duce la suprascrierea fișierelor arbitrare în sistem, în măsura în care drepturile de acces permit.

S-a sugerat că un atacator ar putea aplica pentru a-și adăuga biblioteca la cdnjs și pentru a încărca o arhivă special concepută care conține fișiere cu caractere „../” în calea către depozitul NPM. Pe serverele cdnjs se efectuează periodic o operațiune de „actualizare automată”, timp în care handlerul descarcă versiuni noi ale bibliotecii propuse și despachetează conținutul. Folosind fișiere cu căile „../”, un atacator poate suprascrie fișiere cu scripturi de serviciu și poate executa codul acestora pe serverul pe care a fost efectuată despachetarea.

În cazul descărcării actualizărilor din Git, s-a descoperit că handlerul care descarca actualizările nu a ținut cont de legăturile simbolice la copierea fișierelor din Git. Această caracteristică a făcut posibilă organizarea citirii oricăror fișiere de pe server prin adăugarea de legături simbolice la Git.

S-a decis să se înceapă experimente cu o demonstrație de hacking cdnjs pentru a primi un premiu la HackerOne prin testarea ipotezei privind citirea fișierelor. Un link simbolic test.js a fost adăugat la depozitul Git al bibliotecii JavaScript deservite prin CDN, indicând fișierul /proc/self/maps. După publicarea unei noi versiuni a bibliotecii, handlerul de actualizare a procesat acest depozit și a publicat fișierul specificat în cdnjs (test.js a fost creat ca o legătură simbolică și când acest fișier a fost solicitat, conținutul /proc/self/maps a fost returnat ).

Înlocuind un link simbolic la fișierul /proc/self/environ, autorul studiului a observat că datele date conțin valorile variabilelor de mediu GITHUB_REPO_API_KEY și WORKERS_KV_API_TOKEN. Prima variabilă a stocat cheia API pentru accesul la scriere la depozitul robocdnjs de pe GitHub. A doua variabilă a stocat jetonul în stocarea KV în cdnjs. Folosind informațiile primite, atacatorul ar putea face modificări la cdnjs și poate compromite complet infrastructura.

Sursa: opennet.ru

Adauga un comentariu