GitHub заблокировал 73 репозитория Microsoft за 105 секунд: повторная компрометация пакета Durable Task остановила CI/CD пайплайны

information security

5 июня 2025 года в экосистеме GitHub произошёл инцидент, который затронул тысячи команд разработчиков по всему миру. В течение 105 секунд платформа автоматически отключила доступ к 73 репозиториям Microsoft, расположенным в четырёх организациях: Azure, Azure-Samples, microsoft и MicrosoftDocs. Причиной стала повторная компрометация пакета Durable Task - ключевого механизма для построения долговременных фоновых задач на платформе Azure. Все метки времени отключений попадают в интервал между 16:00:50 и 16:02:35 по всемирному координированному времени. Такая синхронность исключает ручное вмешательство: блокировку выполнила автоматическая система борьбы со злоупотреблениями. GitHub применяет подобную меру только при явных нарушениях условий использования, обычно связанных с вредоносным кодом или утечкой учётных данных.

Описание

Под удар прежде всего попали репозитории, связанные с Azure Functions. Среди них среда выполнения, языковые адаптеры для Node.js, Python, Java, PowerShell, .NET и Go, а также инструменты сборки и контейнерной упаковки. Особенно болезненным оказалось отключение репозитория functions-action, который используется в действиях GitHub (GitHub Actions) для развёртывания функций. Любой пайплайн, ссылавшийся на Azure/functions-action@v1, перестал работать. В организации microsoft были заблокированы все репозитории семейства Durable Task: реализации на .NET, Go, Java, JavaScript, а также драйверы для MSSQL и Netherite. В Azure-Samples пострадали 13 проектов, в основном демонстрационные приложения с искусственным интеллектом и агентами. В число отключённых попали даже репозитории, не связанные напрямую с Azure - например, инструмент для производительности под macOS и драйверы для сетевого оборудования SONiC.

Важно отметить, что это не первый случай компрометации пакета Durable Task. 19 мая злоумышленники загрузили на Python Package Index (PyPI) три вредоносные версии (1.4.1, 1.4.2 и 1.4.3) официального пакета Microsoft, используя похищенные секреты действий GitHub (GitHub Actions). Тогда пакеты были удалены в течение нескольких часов, однако, как выяснилось, нападавшие сохранили доступ к учётным данным. Повторное отключение репозиториев в июне свидетельствует о том, что угроза не была полностью устранена - злоумышленники, удерживавшие контроль над секретами в мае, вероятно, так и не потеряли его.

В обсуждении на форуме Microsoft Learn разработчики сообщили, что их пайплайны непрерывной интеграции сломаны, и потребовали объяснений. Представитель Microsoft сначала предположил, что блокировка связана с нарушением условий использования (вредоносный код, фишинг, нарушение авторских прав или экспортные ограничения), а затем уточнил: речь идёт о "внутренней проблеме управления". Компания рекомендовала временно перейти на альтернативные методы развёртывания - например, интерфейс командной строки Azure (Azure CLI), Azure DevOps или Zip Deploy.

Аналитики связывают инцидент с активностью открытого червя Miasma. В мае нападавшие опубликовали код набора инструментов Mini Shai-Hulud, а в начале июня появилась его модификация Miasma, которая добавила сборщики учётных данных Azure и GCP. Червь создаёт публичные репозитории с похищенными секретами, что и могло спровоцировать автоматическую блокировку со стороны GitHub. Хотя прямое подтверждение этой версии отсутствует (червя обнаружили в экосистеме npm у Red Hat, а не в репозиториях Microsoft), она хорошо объясняет масштаб и скорость реакции платформы.

Последствия инцидента ощутили многие компании: нарушилась работа непрерывной интеграции и доставки. Разработчикам пришлось срочно менять пайплайны и искать обходные пути. Ситуация продемонстрировала уязвимость подхода с использованием плавающих тегов в действиях GitHub (GitHub Actions). Плавающий тег @v1 указывает на версию, которая может меняться, - когда исходный репозиторий исчезает, пайплайн просто перестаёт работать. Фиксация по полному хешу коммита хотя бы гарантирует предсказуемый сбой или успех.

Специалисты рекомендуют в первую очередь прекратить использовать плавающие теги для Azure и всех подобных действий, закрепив версии по SHA коммита. Необходимо немедленно ротировать все учётные данные, которые могли быть скомпрометированы: токены интерфейса командной строки Azure (Azure CLI), управляемые удостоверения (managed identities), а также ключи публикации для PyPI и npm, доступные из рабочих процессов. Рекомендуется также проверить свои организации на предмет подозрительных публичных репозиториев, особенно тех, в названии которых встречается "Miasma: The Spreading Blight", и поискать секреты, записанные в формате JSON на неожиданных аккаунтах. Кроме того, стоит проанализировать скрипты предварительной установки в пакетах - червь Miasma использует вызов Bun к обфусцированному загрузчику _index.js.

Этот инцидент стал одним из крупнейших случаев нарушения цепочки поставок в облачной экосистеме за последнее время. Он показывает, насколько хрупкой может быть зависимость от одного репозитория и как быстро автоматизированные механизмы безопасности способны изменить ландшафт разработки. Компаниям стоит пересмотреть свои практики управления зависимостями, предусмотреть резервные каналы развёртывания и серьёзно отнестись к защите секретов, используемых в пайплайнах непрерывной интеграции. Повторная компрометация одного пакета привела к остановке сборок по всему миру - и это тревожный сигнал для всей отрасли.

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

Repositories

  • azure-ai-content-understanding-python
  • azure-container-apps-multi-agent-workflow
  • azure-container-apps-sandboxes
  • azure-functions-agents-runtime
  • azure-functions-connector-extension
  • azure-functions-core-tools
  • azure-functions-docker
  • azure-functions-dotnet-extensions
  • azure-functions-dotnet-worker
  • azure-functions-durable-extension
  • azure-functions-durable-js
  • azure-functions-durable-powershell
  • azure-functions-durable-python
  • azure-functions-extension-bundles
  • azure-functions-golang-worker
  • azure-functions-host
  • azure-functions-java-flex-consumption-azd
  • azure-functions-java-library
  • azure-functions-java-worker
  • azure-functions-kafka-extension
  • azure-functions-language-worker-protobuf
  • azure-functions-mcp-extension
  • azure-functions-nodejs-e2e-tests
  • azure-functions-nodejs-library
  • azure-functions-nodejs-opentelemetry
  • azure-functions-nodejs-opentelemetry-samples
  • azure-functions-nodejs-worker
  • azure-functions-openai-extension
  • azure-functions-powershell-library
  • azure-functions-powershell-opentelemetry
  • azure-functions-powershell-worker
  • azure-functions-python-extensions
  • azure-functions-python-library
  • azure-functions-python-worker
  • azure-functions-rabbitmq-extension
  • azure-functions-skills
  • azure-functions-sql-extension
  • azure-functions-templates
  • azure-functions-tooling-feed
  • azure-functions-vs-build-sdk
  • azure-search-openai-demo-purviewdatasecurity
  • azure-webjobs-sdk
  • azure-webjobs-sdk-extensions
  • azure-websites-security
  • checkaccess-v2-go-sdk
  • Connectors-NET-LSP
  • Connectors-NET-Samples
  • Connectors-NET-SDK
  • Connectors-NodeJS-SDK
  • connectors-python-sdk
  • DurableFunctionsMonitor
  • durabletask
  • durabletask-dotnet
  • durabletask-go
  • durabletask-java
  • durabletask-js
  • durabletask-mssql
  • durabletask-netherite
  • durabletask-protobuf
  • functions-action
  • functions-connectors-python
  • functions-connectors-typescript
  • functions-container-action
  • homebrew-functions
  • llm-fine-tuning
  • Microsoft-Performance-Tools-Apple
  • openai-chat-app-entra-auth-builtin
  • openai-chat-app-entra-auth-local
  • rag-postgres-openai-python
  • secure-azureai-agent
  • sonic-gnmi.msft
  • tutor
  • windows-driver-docs

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