Уразлівасць у RubyGems.org, якая дазваляе падмяніць чужыя пакеты.

У рэпазітары пакетаў RubyGems.org выяўлена крытычная ўразлівасць (CVE-2022-29176), якая дазваляе без наяўнасці належных паўнамоцтваў падмяніць некаторыя чужыя пакеты ў рэпазітары шляхам ініцыявання выняткі (yank) легітымнага пакета і загрузкі замест яго іншага файла.

Для паспяховай эксплуатацыі ўразлівасці неабходна выкананні трох умоў:

  • Атака можа быць здзейснена толькі на пакеты, у імя якіх выкарыстоўваецца сімвал злучка.
  • Атакуючы павінен мець магчымасць размясціць gem-пакет з часткай імя да знака злучка. Напрыклад, калі напад вырабляецца на пакет "rails-html-sanitizer", атакавалы павінен размясціць у рэпазітары ўласны пакет "rails-html".
  • Пакет, на які здзяйсняецца напад, павінен быць створаны ў апошнія 30 дзён ці не абнаўляцца на працягу 100 дзён.

Уразлівасць выклікана памылкай у апрацоўшчыку дзеяння «yank», які трактуе частку імя пасля злучка як назва платформы, што дазваляла ініцыяваць выдаленне чужых пакетаў, якія супадаюць у частцы імя да знака злучка. У прыватнасці, у кодзе апрацоўшчыка аперацыі "yank" для пошуку пакетаў выкарыстоўваўся выклік 'find_by!(full_name: "#{rubygem.name}-#{slug}")', пры тым, што параметр "slug" перадаваўся ўладальнікам пакета для вызначэння выдаляемай версіі. Уладальнік пакета "rails-html" замест версіі "1.2.3" мог паказаць "sanitizer-1.2.3", што прывяло б да прымянення аперацыі да чужога пакета "rails-html-sanitizer-1.2.3".

Праблема была выяўлена даследчыкам бяспекі ў рамках дзейнай на HackerOne праграмы выплаты ўзнагарод за пошук праблем з бяспекай у вядомых адкрытых праектах. Праблема ўхіленая ў RubyGems.org 5 траўня і па заяве распрацоўнікаў яны пакуль не выявілі слядоў эксплуатацыі ўразлівасці ў логах за апошнія 18 месяцаў. Пры гэтым пакуль праведзены толькі павярхоўны аўдыт і ў далейшым плануецца правядзенне глыбейшай праверкі.

Для праверкі сваіх праектаў рэкамендуецца прааналізаваць гісторыю аперацый у файле Gemfile.lock, шкоднасная актыўнасць выяўляецца ў наяўнасці змен з захаваннем імя і версіі ці зменай платформы (напрыклад, калі пакт gemname-1.2.3 абноўлены да gemname-1.2.3-java). У якасці абыходнага метаду абароны ад утоенай падмены пакетаў у сістэмах бесперапыннай інтэграцыі або пры публікацыі праектаў распрацоўнікам рэкамендавана выкарыстоўваць Bundler з опцыямі "-frozen" або "-deployment" для фіксацыі залежнасцяў.

Крыніца: opennet.ru

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