V repozitáři RubyGems.org byla odhalena kritická zranitelnost (CVE-2022-29176), která umožňuje nahradit některé cizí balíčky v repozitáři bez náležitého oprávnění zahájením stáhnutí (yank) legitimního balíčku a nahráním jiného souboru se stejným názvem a číslem verze.
Pro úspěšnou exploataci zranitelnosti je třeba splnit tři podmínky:
- Útok může být proveden pouze na balíčky, jejichž název obsahuje pomlčku.
- Útočník musí mít možnost umístit gem-balíček s částí názvu před pomlčku. Například pokud je útok prováděn na balíček „rails-html-sanitizer“, útočník musí umístit do repozitáře svůj vlastní balíček „rails-html“.
- Balíček, na který je útok zaměřen, musí být vytvořen v posledních 30 dnech nebo nebyl aktualizován po dobu 100 dnů.
Zranitelnost byla způsobena chybou v zpracovateli akce „yank“, který interpretoval část názvu po pomlčce jako název platformy, což umožnilo iniciovat odstranění cizích balíčků, které se shodovaly v části názvu před pomlčkou. Konkrétně v kódu zpracovatele akce „yank“ byl použit příkaz ‘find_by!(full_name: „#{rubygem.name}-#{slug}”)’, přičemž parametr „slug“ byl předáván vlastníkem balíčku pro určení odstraňované verze. Vlastník balíčku „rails-html“ mohl místo verze „1.2.3“ uvést „sanitizer-1.2.3“, což by vedlo k provedení akce na cizím balíčku „rails-html-sanitizer-1.2.3“.
Problém byl odhalen bezpečnostním výzkumníkem v rámci programového odměňování na HackerOne za nalezení bezpečnostních problémů v známých otevřených projektech. Problém byl odstraněn v RubyGems.org 5. května a podle prohlášení vývojářů zatím neobjevili stopy exploatace zranitelnosti v protokolech za posledních 18 měsíců. Dosud byl proveden pouze povrchní audit a v budoucnu se plánuje provedení hloubkovějšího prověření.
Pro analýzu svých projektů se doporučuje prověřit historii operací v souboru Gemfile.lock. Zlovolná aktivita se projevuje změnami, které uchovávají jméno a verzi, nebo změnou platformy (například když je balíček gemname-1.2.3 aktualizován na gemname-1.2.3-java). Jako obranou metodou proti skrytým nahrazením balíčků v systémech průběžné integrace nebo při publikování projektů se doporučuje vývojářům použít Bundler s možnostmi „—frozen“ nebo „—deployment“ pro zafixování závislostí.
Zdroj: opennet.ru
