Sårbarhet i cdnjs som tillot kodekjøring på Cloudflare-servere

En kritisk sårbarhet er identifisert i Cloudflares cdnjs-nettverk for innholdslevering, som er designet for å øke hastigheten på leveringen av JavaScript-biblioteker, slik at vilkårlig kodeutførelse på CDN-servere. Faren for problemet forverres av det faktum at omtrent 12.7 % av alle nettsteder på Internett bruker tjenesten til å laste ned JavaScript-biblioteker, og kompromittering av infrastrukturen gjør det mulig å erstatte bibliotekene som tilbys av noen av disse nettstedene.

cdnjs-tjenesten laster ned pakker fra Git eller et NPM-depot, hvoretter den lar ethvert nettsted bruke Cloudflare innholdsleveringsnettverk gratis for å øke hastigheten på lasting av JavaScript-biblioteker. Når du studerte koden til cdnjs-komponenter publisert på GitHub, ble det avslørt at for å pakke ut NPM-pakker i tgz-arkiver, brukes standard archive/tar-modulen i Go-språket, som produserer en liste over filer som den er, uten banenormalisering. I tilfellet når skriptet pakker ut innholdet basert på den gitte listen, kan tilstedeværelsen av filer som "../../../../../../../tmp/test" i arkivet føre til overskriving av vilkårlige filer i systemet, så langt tilgangsrettighetene tillater det.

Det ble foreslått at en angriper kunne sende inn en forespørsel om å legge til biblioteket sitt til cdnjs og laste opp et spesialdesignet arkiv som inneholder filer med "../"-tegn i banen til NPM-depotet. På cdnjs-servere utføres det med jevne mellomrom en "autooppdatering"-operasjon, hvor behandleren laster ned nye versjoner av det foreslåtte biblioteket og pakker ut innholdet. Ved å bruke filer med stier "../", kan en angriper overskrive filer med tjenesteskript og kjøre koden deres på serveren som utpakkingen ble utført på.

Når det gjelder nedlasting av oppdateringer fra Git, ble det oppdaget at behandleren som lastet ned oppdateringene ikke tok hensyn til symbolske lenker ved kopiering av filer fra Git. Denne funksjonen gjorde det mulig å organisere lesingen av alle filer fra serveren ved å legge til symbolske lenker til Git.

Det ble besluttet å starte eksperimenter med en demonstrasjon av hacking av cdnjs for å motta en premie hos HackerOne ved å teste hypotesen angående fillesing. En symbolsk lenke test.js er lagt til Git-depotet til JavaScript-biblioteket servert via CDN, og peker til /proc/self/maps-filen. Etter å ha publisert en ny versjon av biblioteket, behandlet oppdateringsbehandleren dette depotet og publiserte den spesifiserte filen i cdnjs (test.js ble opprettet som en symbolsk lenke, og når denne filen ble forespurt, ble innholdet i /proc/self/maps returnert ).

Ved å erstatte en symbolsk lenke til filen /proc/self/environ, la forfatteren av studien merke til at de gitte dataene inneholdt verdiene til miljøvariablene GITHUB_REPO_API_KEY og WORKERS_KV_API_TOKEN. Den første variabelen lagret API-nøkkelen for skrivetilgang til robocdnjs-depotet på GitHub. Den andre variabelen lagret tokenet til KV-lagringen i cdnjs. Ved å bruke informasjonen som mottas, kan angriperen gjøre endringer i cdnjs og fullstendig kompromittere infrastrukturen.

Kilde: opennet.ru

Legg til en kommentar