Кампания по взлому GitHub-репозиториев использует Actions для атак на cPanel и кражу учётных данных

information security

С 12 по 13 июля 2026 года злоумышленники получили доступ к учётной записи легитимного PHP-разработчика на GitHub и через репозиторий пакетов Packagist распространили вредоносные версии десяти его библиотек. Однако атака оказалась необычной: сам код PHP-пакетов не содержал вредоносной логики, а вся опасность была скрыта в файлах автоматизации GitHub Actions, добавленных в исходные репозитории разработчика. Вместо традиционной инъекции в зависимости злоумышленники превратили чужие репозитории в распределённую инфраструктуру для сканирования интернета, эксплуатации уязвимостей и кражи данных.

Описание

Данные проведённого расследования показали, что в течение двух суток Packagist автоматически синхронизировал изменения из скомпрометированных GitHub-репозиториев разработчика. Все десять пакетов получили так называемые "версии для разработки" (dev-версии), в каждой из которых насчитывалось от 55 до 62 вредоносных сценариев GitHub Actions. В общей сложности злоумышленники добавили 583 файла автоматизации. Эти YAML-файлы предписывали GitHub при каждом отправке кода или ручном запуске создавать временный сервер на Ubuntu, загружать с управляющего сервера злоумышленников исполняемый файл-сканер и запускать его.

Работа вредоносных сценариев строилась по единому шаблону. После запуска временного сервера (так называемого "бегунка" GitHub) сценарий определял архитектуру процессора - 32-битную x86, 64-битную x86, 32-битную ARM или 64-битную ARM - и загружал подходящий Linux-эксплойт. Затем запускался процесс сканирования интернета: программа обходила случайные IP-адреса, проверяла открытые порты, связанные с панелями управления хостингом (порты 80, 443, 8080, 8443, 2082, 2083, 2086, 2087), и пыталась эксплуатировать уязвимость CVE-2026-41940 в системах cPanel и WHM. Эта уязвимость позволяла обойти аутентификацию и получить доступ к управлению сервером.

После успешной эксплуатации сканер собирал с атакованного сервера учётные данные: ключи доступа к облачным сервисам (AWS, Google), токены GitHub и GitLab, ключи платёжных сервисов (Stripe), учётные записи почтовых сервисов, данные баз данных, SSH-ключи, переменные окружения, конфигурационные файлы и результаты выполнения произвольных команд. Вся собранная информация немедленно отправлялась на сервер злоумышленников через HTTP-запросы с разбивкой на блоки. При этом каждый сценарий каждые 30 секунд отправлял "сердцебиение" - сигнал о том, что процесс выполняется, с последней строкой лога сканера.

Особенностью кампании стало то, что обычная установка PHP-пакетов через Packagist не приводила к активации вредоносных сценариев. Packagist помещает файлы пакета в каталог vendor проекта, где GitHub не обрабатывает вложенные workflow-файлы. Клонирование репозитория также не запускало атаку на компьютере разработчика. Активация происходила только тогда, когда в корне скомпрометированного репозитория оказывался каталог .github/workflows - при каждом push или ручном запуске сценария. Таким образом, атака не требовала действий со стороны пользователей пакетов: она работала исключительно на временных серверах GitHub, предоставленных для выполнения автоматизации.

Масштаб кампании оказался значительно шире, чем один скомпрометированный PHP-разработчик. Поиск по коду GitHub с использованием уникального идентификатора DNSHook, который злоумышленники применяли для подтверждения выполнения команд, выявил около 6 100 совпадающих workflow-файлов. Результаты включали репозитории с несвязанной историей разработки, в которых вредоносные сценарии уже были запущены. Более широкий поиск по адресу управляющего сервера, аргументам сканера и именам файлов с учётными данными вернул от 15 до 16 тысяч совпадений. Это доказывает, что атака не ограничилась одним пакетным набором, а представляла собой крупномасштабную операцию, в ходе которой злоумышленники взломали множество учётных записей и репозиториев GitHub.

Основной целью кампании были интернет-серверы, работающие под управлением панелей cPanel и WHM. cPanel предоставляет управление отдельным веб-сайтом хостинг-клиента, а WHM - административную панель для управления несколькими cPanel-аккаунтами. Взлом одного WHM мог дать доступ сразу к десяткам и сотням сайтов, их базам данных, почтовым ящикам, конфигурациям и секретам приложений. Украденные токены от систем контроля версий позволяли злоумышленникам проникать в другие репозитории, расширяя цепочку атаки на поставщики программного обеспечения.

Скомпрометированная учётная запись разработчика dinushchathurya была заблокирована, что остановило один из каналов распространения, но не ликвидировало угрозу полностью. Другие репозитории, форки, зеркала, сохранённые копии, а также уже украденные учётные данные могли оставаться активными. На момент публикации операцию следует считать продолжающейся.

Владельцам репозиториев рекомендуется немедленно отключить подозрительные workflow-сценарии, сохранить историю коммитов и логи Actions, сменить все учётные данные, а также настроить требование одобрения для изменений в каталоге .github/workflows. Пользователям Packagist следует избегать установки непроверенных версий для разработки, проверять ссылки на коммиты в lock-файлах и при необходимости заменить подозрительные версии на стабильные. Операторам cPanel и WHM необходимо установить исправления, выпущенные производителем, и проверить серверы на наличие признаков компрометации. Важно помнить, что сценарии автоматизации в системах непрерывной интеграции и доставки являются такими же компонентами цепочки поставки ПО, как и исходный код, и требуют тщательной проверки и контроля доступа.

Индикаторы компрометации

IPv4

  • 43.228.157.68

IPv4 Port Combination

  • 43.228.157.68:80

Domain

  • f5b0b742-240a-4811-8a5b-b0ba6060685d.dnshook.site

URL

  • http://43.228.157.68:80/api/dl/386
  • http://43.228.157.68:80/api/dl/amd64
  • http://43.228.157.68:80/api/dl/arm
  • http://43.228.157.68:80/api/dl/arm64
  • http://43.228.157.68:80/api/github-heartbeat
  • http://43.228.157.68:80/api/github-results

SHA256

  • 22f721fd3a81d2e27cbf90a122bb977f630c50b79daa98350f0e57b04dfa81f1

Affected Package

  • dinushchathurya/nationality-list
  • dinushchathurya/srilankan-divisional-secretariats
  • dinushchathurya/srilankan-gn-divisions
  • dinushchathurya/srilankan-local-authorities
  • dinushchathurya/srilankan-mobile-number-validator
  • dinushchathurya/srilankan-state-hospitals
  • dinushchathurya/srilankan-universities
  • dinushchathurya/uk-mobile-number-validator
  • dinushchathurya/uk-post-code
  • dinushchathurya/websmslk

Комментарии: 0