V repozitári balíkov RubyGems.org bola objavená kritická zraniteľnosť (CVE-2022-29176), ktorá umožňuje bez potrebných oprávnení zameniť niektoré cudzí balíky v repozitári iniciovaním vyňatia (yank) legitímneho balíka a nahradením ho iným súborom s rovnakým názvom a verziou.
Na úspešné zneužitie zraniteľnosti je potrebné splniť tri podmienky:
- Útok je možné uskutočniť iba na balíky, ktorých názov obsahuje znak pomlčky.
- Útočník musí mať možnosť umiestniť gem-balík s časťou názvu pred znakom pomlčky. Napríklad, ak je útok realizovaný na balík „rails-html-sanitizer“, útočník by mal v repozitári umiestniť vlastný balík „rails-html“.
- Balík, na ktorý sa útok vykonáva, musí byť vytvorený v posledných 30 dňoch alebo nebol aktualizovaný počas 100 dní.
Zraniteľnosť je spôsobená chybou v spracovateľovi akcie „yank“, ktorý interpretuje časť názvu po pomlčke ako názov platformy, čo umožňuje iniciovať odstránenie cudzích balíkov, ktoré sa zhodujú v časti názvu pred znakom pomlčky. Konkrétne, v kóde spracovateľa operácie „yank“ sa na vyhľadávanie balíkov používal príkaz ‘find_by!(full_name: „#{rubygem.name}-#{slug}“)’, pričom parameter „slug“ bol odovzdaný vlastníkom balíka na určenie odstraňovanej verzie. Vlastník balíka „rails-html“ namiesto verzie „1.2.3“ mohol uviesť „sanitizer-1.2.3“, čo by viedlo k vykonaniu operácie na cudzom balíku „rails-html-sanitizer-1.2.3.“
Problém bol identifikovaný bezpečnostným výskumníkom v rámci existujúcej programu vyplácania odmien na HackerOne za hľadanie problémov s bezpečnosťou v známych otvorených projektoch. Problém bol odstránený na RubyGems.org 5. mája a podľa vyhlásenia vývojárov zatiaľ nezistili stopy zneužitia zraniteľnosti v logoch za posledných 18 mesiacov. Zatiaľ bol vykonaný iba povrchný audit a plánuje sa vykonať hlbšia kontrola.
Pre analyzovaní svojich projektov sa odporúča preskúmať históriu operácií v súbore Gemfile.lock, kde sa škodlivá aktivita prejavuje prítomnosťou zmien so zachovaním mena a verzie alebo zmenou platformy (napríklad, keď je balík gemname-1.2.3 aktualizovaný na gemname-1.2.3-java). Ako obchádzkovú metódu ochrany pred skrytou výmenou balíkov v systémoch kontinuálnej integrácie alebo pri publikovaní projektov vývojárom sa odporúča používať Bundler s možnosťami „—frozen“ alebo „—deployment“ na zafixovanie závislostí.
Zdroj: opennet.ru
