În rețeaua de livrare a conținutului cdnjs, pusă la dispoziție de Cloudflare pentru a accelera livrarea bibliotecilor JavaScript, a fost descoperită o vulnerabilitate critică care permite executarea de cod arbitrar pe serverele CDN. Pericolul problemei este amplificat de faptul că aproximativ 12.7% din toate site-urile de pe internet folosesc acest serviciu pentru a descărca biblioteci JavaScript, iar compromiterea infrastructurii permite înlocuirea bibliotecilor livrate de oricare dintre aceste site-uri.
Serviciul cdnjs descarcă pachete din Git sau din depozitul NPM, oferind astfel oricărui site posibilitatea de a utiliza gratuit rețeaua de livrare a conținutului Cloudflare pentru a accelera descărcarea bibliotecilor JavaScript. În timpul examinării codului componentelor cdnjs, publicate pe GitHub, s-a constatat că pentru dezarhivarea pachetelor NPM din arhive tgz se folosește modulul standard archive/tar în limbajul Go, care returnează lista fișierelor exact așa cum sunt, fără normalizarea căilor. În cazul în care scriptul dezarhivează conținutul pe baza listei furnizate, prezența în arhivă a fișierelor de tip „..../..../..../..../..../..../..../tmp/test” poate duce la suprascrierea fișierelor arbitrare în sistem, în funcție de permisiunile de acces.
S-a presupus că un atacator ar putea solicita adăugarea bibliotecii sale în cdnjs și ar putea încărca în depozitul NPM un arhivă special pregătită, conținând fișiere cu caractere „../” în cale. Pe serverele cdnjs, operația „autoupdate” se efectuează periodic, în care procesatorul descarcă noi versiuni ale bibliotecii propuse și dezarhivează conținutul. Utilizând fișiere cu căi „../”, atacatorul ar putea obține suprascrierea fișierelor cu scripturi ale serviciului și executarea propriului cod pe server care a avut loc dezarhivarea.
În cazul descărcării actualizărilor din Git, s-a descoperit că procesatorul de actualizări nu lua în considerare link-urile simbolice atunci când copia fișiere din Git. Această caracteristică permitea citirea oricăror fișiere cu server prin adăugarea de link-uri simbolice în Git.
Experimentele cu demonstrarea unei breșe în cdnjs pentru a obține recompense pe HackerOne au început prin testarea unei ipoteze referitoare la citirea fișierelor. În depozitul Git al bibliotecii JavaScript distribuite prin CDN, a fost adăugată un link simbolic test.js, care face referire la fișierul /proc/self/maps. După publicarea unei noi versiuni a bibliotecii, procesatorul de actualizări a gestionat acest depozit și a publicat fișierul specificat în cdnjs (test.js a fost creat ca un link simbolic și, la solicitarea acestui fișier, se returna conținutul /proc/self/maps).
Înlocuind linkul simbolic cu fișierul /proc/self/environ, autorul cercetării a observat că datele returnate conțin valori pentru variabilele de mediu GITHUB_REPO_API_KEY și WORKERS_KV_API_TOKEN. Prima variabilă conținea cheia API pentru accesul cu drepturi de scriere în depozitul robocdnjs de pe GitHub. A doua variabilă conținea un token pentru stocarea KV în cdnjs. Folosind informațiile obținute, atacatorul ar fi putut face modificări în cdnjs și compromite complet infrastructura.
Sursa: opennet.ro
