Уразлівасць у cdnjs, якая дазволіла выканаць код на серверах Cloudflare

У прадастаўляемай кампаніяй Cloudflare сеткі дастаўкі кантэнту cdnjs, прызначанай для паскарэння дастаўкі JavaScript-бібліятэк, выяўлена крытычная ўразлівасць, якая дазваляе выканаць адвольны код на серверах CDN. Небяспека праблемы пагаршаецца тым, што для загрузкі JavaScript-бібліятэк сэрвісам карыстаецца каля 12.7% усіх сайтаў у інтэрнэце і кампраметацыя інфраструктуры дазваляе падмяніць бібліятэкі, якія аддаюцца любым з гэтых сайтаў.

Сэрвіс cdnjs ажыццяўляе загрузку пакетаў з Git або рэпазітара NPM, пасля чаго дае магчымасць любому сайту бясплатна скарыстацца сеткай дастаўкі кантэнту Cloudflare для паскарэння загрузкі JavaScript-бібліятэк. Пры вывучэнні кода кампанентаў cdnjs, апублікаваных на GitHub, было выяўлена, што для распакавання NPM-пакетаў у архівах tgz выкарыстоўваецца штатны модуль archive/tar на мове Go, якія выдае спіс файлаў як есць, без нармалізацыі шляхоў. У выпадку, калі скрыпт распакоўвае змесціва на падставе выдадзенага спісу, наяўнасць у архіве файлаў выгляду "../../../../../../../tmp/test" можа прывесці да перазапісу адвольных файлаў у сістэме, наколькі гэта дазваляюць правы доступу.

Было дапушчана, што атакавалы можа падаць заяўку на даданне сваёй бібліятэкі ў cdnjs і загрузіць у рэпазітар NPM адмыслова аформлены архіў, утрымоўвальны файлы з знакамі «../» у шляхі. На серверах cdnjs перыядычна выконваецца аперацыя "autoupdate", падчас якой апрацоўшчык загружае новыя версіі прапанаванай бібліятэкі і распакоўвае змесціва. Пры дапамозе файлаў з шляхамі «../» атакавалы можа дамагчыся перазапісы файлаў са скрыптамі сэрвісу і выкананні свайго кода на серверы на якім выраблялася распакаванне.

У выпадку загрузкі абнаўленняў з Git было высветлена, што які загружае абнаўленні апрацоўшчык не ўлічваў сімвалічныя спасылкі пры капіяванні файлаў з Git. Дадзеная асаблівасць дазваляла арганізаваць чытанне любых файлаў з сервера праз даданне ў Git сімвалічных спасылак.

Эксперыменты з дэманстрацыяй узлому cdnjs для атрымання прэміі на HackerOne было вырашана пачаць з праверкі гіпотэзы адносна чытанні файлаў. У Git-рэпазітар аддаецца праз CDN JavaScript-біблітэкі была дададзена сімвалічная спасылка test.js, якая паказвае на файл /proc/self/maps. Пасля публікацыі новай версіі бібліятэкі апрацоўшчык абнаўленняў апрацаваў дадзены рэпаізіторый і апублікаваў паказаны файл у cdnjs (test.js быў створаны як сімвалічная спасылка і пры запыце дадзенага файла выдавалася змесціва /proc/self/maps).

Падставіўшы сімвалічную спасылку на файл /proc/self/environ аўтар даследавання заўважыў, што ўсярэдзіне аддадзеных дадзеных прысутнічаюць значэнні зменных асяроддзі GITHUB_REPO_API_KEY і WORKERS_KV_API_TOKEN. У першай зменнай захоўваўся ключ да API для доступу з правам запісы ў рэпазітар robocdnjs на GitHub. У другой зменнай захоўваўся токен да сховішча KV у cdnjs. Скарыстаўшыся атрыманымі звесткамі зламыснік мог унесці змены ў cdnjs і поўнасцю скампраметаваць інфраструктуру.

Крыніца: opennet.ru

Дадаць каментар