Ang kahinaan sa mga cdnj na nagpapahintulot sa pagpapatupad ng code sa mga server ng Cloudflare

Natukoy ang isang kritikal na kahinaan sa network ng paghahatid ng nilalaman ng cdnjs ng Cloudflare, na idinisenyo upang pabilisin ang paghahatid ng mga library ng JavaScript, na nagpapahintulot sa arbitrary na pagpapatupad ng code sa mga server ng CDN. Ang panganib ng problema ay pinalala ng katotohanan na ang tungkol sa 12.7% ng lahat ng mga site sa Internet ay gumagamit ng serbisyo upang mag-download ng mga aklatan ng JavaScript, at ang kompromiso ng imprastraktura ay ginagawang posible na palitan ang mga aklatan na ibinigay ng alinman sa mga site na ito.

Ang serbisyo ng cdnjs ay nagda-download ng mga pakete mula sa Git o isang imbakan ng NPM, pagkatapos nito ay pinapayagan ang anumang site na gamitin ang network ng paghahatid ng nilalaman ng Cloudflare nang libre upang mapabilis ang pag-load ng mga library ng JavaScript. Kapag pinag-aaralan ang code ng mga bahagi ng cdnjs na inilathala sa GitHub, ipinahayag na upang i-unpack ang mga pakete ng NPM sa mga tgz archive, ginagamit ang karaniwang archive/tar module sa wikang Go, na gumagawa ng isang listahan ng mga file kung saan, nang hindi na-normalize ang mga path. . Sa kaso kapag na-unpack ng script ang mga nilalaman batay sa ibinigay na listahan, ang presensya sa archive ng mga file tulad ng "../../../../../../../tmp/test" ay maaaring humantong sa pag-overwrite ng mga arbitrary na file sa system, hangga't pinapayagan ng mga karapatan sa pag-access.

Iminungkahi na maaaring mag-apply ang isang attacker upang idagdag ang kanyang library sa mga cdnjs at mag-upload ng isang espesyal na idinisenyong archive na naglalaman ng mga file na may "../" na mga character sa path patungo sa repositoryo ng NPM. Sa mga server ng cdnjs, pana-panahong ginagawa ang isang "autoupdate" na operasyon, kung saan ang handler ay nagda-download ng mga bagong bersyon ng iminungkahing library at ina-unpack ang mga nilalaman. Gamit ang mga file na may mga path na "../", maaaring i-overwrite ng isang attacker ang mga file gamit ang mga script ng serbisyo at i-execute ang kanilang code sa server kung saan isinagawa ang pag-unpack.

Sa kaso ng pag-download ng mga update mula sa Git, natuklasan na ang handler na nag-download ng mga update ay hindi isinasaalang-alang ang mga simbolikong link kapag kinopya ang mga file mula sa Git. Ang tampok na ito ay naging posible upang ayusin ang pagbabasa ng anumang mga file mula sa server sa pamamagitan ng pagdaragdag ng mga simbolikong link sa Git.

Napagpasyahan na simulan ang mga eksperimento sa isang pagpapakita ng pag-hack ng mga cdnj upang makatanggap ng premyo sa HackerOne sa pamamagitan ng pagsubok sa hypothesis tungkol sa pagbabasa ng file. Ang isang simbolikong link na test.js ay naidagdag sa Git repository ng JavaScript library na inihatid sa pamamagitan ng CDN, na tumuturo sa /proc/self/maps file. Pagkatapos mag-publish ng bagong bersyon ng library, pinoproseso ng handler ng update ang repository na ito at nai-publish ang tinukoy na file sa cdnjs (ginawa ang test.js bilang simbolikong link at kapag hiniling ang file na ito, ibinalik ang mga nilalaman ng /proc/self/maps ).

Ang pagpapalit ng simbolikong link sa file /proc/self/environ, napansin ng may-akda ng pag-aaral na ang ibinigay na data ay naglalaman ng mga halaga ng mga variable ng kapaligiran na GITHUB_REPO_API_KEY at WORKERS_KV_API_TOKEN. Ang unang variable ay nag-imbak ng API key para sa write access sa robocdnjs repository sa GitHub. Ang pangalawang variable ay nag-imbak ng token sa KV storage sa cdnjs. Gamit ang impormasyong natanggap, ang umaatake ay maaaring gumawa ng mga pagbabago sa mga cdnj at ganap na ikompromiso ang imprastraktura.

Pinagmulan: opennet.ru

Magdagdag ng komento