Chyba zabezpečenia v cdnj, ktorá umožňovala spustenie kódu na serveroch Cloudflare

V sieti na doručovanie obsahu cdnjs spoločnosti Cloudflare bola identifikovaná kritická zraniteľnosť, ktorá je navrhnutá tak, aby urýchlila doručovanie knižníc JavaScriptu, čo umožňuje spúšťanie ľubovoľného kódu na serveroch CDN. Nebezpečenstvo problému zvyšuje skutočnosť, že približne 12.7 % všetkých stránok na internete využíva službu na sťahovanie JavaScriptových knižníc a kompromitácia infraštruktúry umožňuje nahradiť knižnice poskytované ktoroukoľvek z týchto stránok.

Služba cdnjs sťahuje balíčky z Git alebo úložiska NPM, po čom umožňuje ľubovoľnej stránke bezplatne využívať sieť na doručovanie obsahu Cloudflare na urýchlenie načítania JavaScriptových knižníc. Pri štúdiu kódu komponentov cdnjs publikovaných na GitHub sa zistilo, že na rozbalenie balíkov NPM v archívoch tgz sa používa štandardný modul archív/tar v jazyku Go, ktorý vytvára zoznam súborov tak, ako je, bez normalizácie cesty. V prípade, že skript rozbalí obsah na základe daného zoznamu, prítomnosť súborov ako „../../../../../../../tmp/test“ v archíve môže viesť k prepisovaniu ľubovoľných súborov v systéme, pokiaľ to prístupové práva umožňujú.

Bolo navrhnuté, že útočník by mohol požiadať o pridanie svojej knižnice do cdnjs a nahrať špeciálne navrhnutý archív obsahujúci súbory so znakmi „../“ v ceste do úložiska NPM. Na serveroch cdnjs sa periodicky vykonáva operácia „autoupdate“, počas ktorej obsluha stiahne nové verzie navrhovanej knižnice a rozbalí obsah. Pomocou súborov s cestami „../“ môže útočník prepísať súbory servisnými skriptami a spustiť ich kód na serveri, na ktorom sa vykonalo rozbalenie.

V prípade sťahovania aktualizácií z Gitu sa zistilo, že obsluha sťahujúca aktualizácie nebrala do úvahy symbolické odkazy pri kopírovaní súborov z Gitu. Táto funkcia umožnila organizovať čítanie ľubovoľných súborov zo servera pridaním symbolických odkazov na Git.

Bolo rozhodnuté začať experimenty s demonštráciou hackovania cdnj, aby sme získali cenu na HackerOne testovaním hypotézy týkajúcej sa čítania súborov. Symbolický odkaz test.js bol pridaný do úložiska Git knižnice JavaScriptu poskytovanej prostredníctvom CDN, ktorá ukazuje na súbor /proc/self/maps. Po zverejnení novej verzie knižnice spracovateľ aktualizácie spracoval tento repozitár a zverejnil zadaný súbor v cdnjs (test.js bol vytvorený ako symbolický odkaz a keď bol tento súbor vyžiadaný, obsah /proc/self/maps bol vrátený ).

Nahradením symbolického odkazu na súbor /proc/self/environ si autor štúdie všimol, že dané údaje obsahujú hodnoty premenných prostredia GITHUB_REPO_API_KEY a WORKERS_KV_API_TOKEN. Prvá premenná uložila kľúč API na prístup k zápisu do úložiska robocdnjs na GitHub. Druhá premenná uložila token do úložiska KV v cdnjs. Pomocou získaných informácií by útočník mohol vykonať zmeny v cdnj a úplne ohroziť infraštruktúru.

Zdroj: opennet.ru

Pridať komentár