A Cloudflare által biztosított cdnjs tartalomelosztó hálózatában, amely a JavaScript könyvtárak gyorsabb szállítására készült, kritikus biztonsági rés került felfedezésre, amely lehetővé teszi tetszőleges kód végrehajtását a CDN szerverein. A probléma súlyosságát fokozza, hogy a szolgáltatást az interneten található webhelyek körülbelül 12,7%-a használja a JavaScript könyvtárak betöltésére, és az infrastruktúra kompromittálása lehetővé teszi a könyvtárak helyettesítését bármelyik ilyen webhelyen.
A cdnjs szolgáltatás csomagok betöltését végzi a Git-ből vagy NPM-repozitóriumból, majd lehetőséget ad bármely webhelynek, hogy ingyenesen használja a Cloudflare tartalomelosztó hálózatát a JavaScript könyvtárak betöltésének felgyorsítására. A cdnjs komponenseinek kódjának a GitHub-on végzett vizsgálata során kiderült, hogy az NPM-csomagok tgz archívumokban való kibővítéséhez a Go nyelv archive/tar modulját használják, amely a fájlok listáját pontosan így adja vissza, anélkül hogy normalizálná az elérési utakat. Amikor a szkript az adott lista alapján kibővíti a tartalmat, az archívumban lévő „..\/..\/..\/..\/..\/..\/..\/tmp\/test” típusú fájlok jelenléte tetszőleges fájlok felülírásához vezethet a rendszerben, amennyiben azt a jogosultságok lehetővé teszik.
Feltételezték, hogy a támadó kérheti a saját könyvtárának hozzáadását a cdnjs-hez, és speciálisan kialakított archívumot tölthet fel az NPM-repozitóriumba, amely fájlokat tartalmaz „..\/” karakterekkel az elérési útvonalban. A cdnjs szerverein időszakosan végrehajtják az "autoupdate" műveletet, amely során a kezelő új verziókat tölt le a javasolt könyvtárból, és kibővíti a tartalmat. Az „..\/” elérési utakkal rendelkező fájlok segítségével a támadó elérheti a szolgáltatás szkriptjeinek felülírását és saját kódjának végrehajtását az szerveren amelyen a kibővítés történt.
A Git-ből történő frissítések letöltésekor kiderült, hogy a frissítéseket kezelő feldolgozó nem vette figyelembe a szimbolikus linkeket a fájlok Git-ből történő másolásakor. Ez a jelenség lehetővé tette bármilyen fájl olvasását a a szerver szimbolikus linkek Git-be történő hozzáadásával.
A cdnjs hack demonstration experiment for claiming a HackerOne bounty was initiated by testing a hypothesis related to file reading. A symbolic link test.js was added to the Git repository of the JavaScript library served via CDN, pointing to the file /proc/self/maps. After a new version of the library was published, the update handler processed this repository and published the specified file on cdnjs (test.js was created as a symbolic link and when this file was requested, the content of /proc/self/maps was returned).
By substituting the symbolic link to the file /proc/self/environ, the researcher noted that the returned data contained the values of the environment variables GITHUB_REPO_API_KEY and WORKERS_KV_API_TOKEN. The first variable stored the API key for write access to the repository robocdnjs on GitHub. The second variable stored the KV storage token in cdnjs. By utilizing this information, the attacker could make changes to cdnjs and completely compromise the infrastructure.
Forrás: opennet.ru
