RubyGems.org paketite hoidlas avastati kriitiline haavatavus (CVE-2022-29176), mis võimaldab volitusi omamata asendada mõningaid kolmandate osapoolte pakette hoidlas, algatades legaalse paketi tagasivõtmise (yank) ja laadides selle asemel üles teise faili sama nime ja versiooninumbriga.
Haavatavuse edukaks ära kasutamiseks on vajalik kolme tingimuse täitmine:
- Rünnak võib toimuda ainult pakettide puhul, mille nimes kasutatakse sidekriipsu.
- Ründajal peab olema võimalik laadida gem-pakett, mille nimi sisaldab osa enne sidekriipsu. Näiteks, kui rünnak toimub paketi 'rails-html-sanitizer' vastu, peab ründaja hoidlas andma oma paketi 'rails-html'.
- Pakett, mille vastu rünnak toimub, peab olema loodud viimase 30 päeva jooksul või mitte värskendatud 100 päeva jooksul.
Haavatavus tuleneb vea olemasolust "yank" toiminguhalduris, mis tõlgendab nimeosa pärast sidekriipsu platvormi nimeks, võimaldades käivitada teiste pakettide kustutamise, mille nimed kattuvad sidekriipsuni. Eelkõige kasutati "yank" toimingu haldajakoodis paketide otsimiseks kutsumust ‘find_by!(full_name: "#{rubygem.name}-#{slug}")’, samas kui parameetri „slug” edastas paketi omanik, et määrata kustutatav versioon. Paketi "rails-html" omanik oleks võinud määrata versiooniks „sanitizer-1.2.3” asemel „sanitizer-1.2.3”, mis oleks viinud operatsiooni rakendamiseni valesse paketti "rails-html-sanitizer-1.2.3".
Probleem tuvastas turvauurija aktiivse HackerOne programmi raames, mis annab preemiaid avatud projektide turvaprobleemide leidmise eest. Probleem on lahendatud RubyGems.org-is 5. mail ja arendajate väitel ei ole nad viimase 18 kuu logides avastanud jälgi haavatavuse ära kasutamisest. Samuti on tehtud seni vaid pinnapealne audit, tulevikus on plaanis teha põhjalikum ülevaatus.
Projekti kontrollimiseks soovitatakse analüüsida tehingute ajalugu failis Gemfile.lock. Kahjonaline tegevus väljendub muudatustes, mis säilitavad nime ja versiooni või platvormi vahetamisel (näiteks kui gemname-1.2.3 on uuendatud gemname-1.2.3-java). Kaitseks peidetud pakettide asendamise vastu pideva integreerimise süsteemides või projektide avaldamisel soovitatakse arendajatel kasutada Bundlerit koos valikutega „—frozen” või „—deployment” sõltuvuste fikseerimiseks.
Allikas: opennet.ru
