Инженерное руководство MiniRent

Утечка секретов GitHub Actions на self-hosted Mac Runner: руководство по проверке 2026

Утечка секретов GitHub Actions на self-hosted Mac Runner: руководство по проверке 2026

Подозрительная задача или предупреждение о секрете → приостановите затронутый workflow, изолируйте Runner, затем отзовите или замените возможные учетные данные и проверьте права доступа. Не возвращайте узел к выполнению задач, пока не выясните, что произошло, и не завершите очистку и проверку доверенным кодом.

Руководство подходит независимым разработчикам, запускающим сборки собственных репозиториев; фрилансерам, которым нужно разделить ответственность за проект клиента; и небольшим удалённым командам, получившим сигнал о подозрительном workflow или pull request.

Сначала определите, что именно означает сигнал

Сообщение о возможной утечке — повод остановить рискованное выполнение и начать проверку, но само по себе оно ещё не доказывает, что секрет был раскрыт. Разделите наблюдения на три категории: подтверждённая публикация значения, подозрение на доступ к секрету и общая аномалия, например неожиданная задача или неизвестное изменение Runner. Дальнейшие действия зависят от доказательств, но при неопределённости разумнее временно ограничить доступ, чем продолжать сборки на потенциально изменённом узле.

В качестве исходных признаков проверьте:

  • попало ли значение учётных данных в логи, артефакты, вывод тестов или опубликованные файлы;
  • запускался ли workflow после изменения, сделанного в pull request или другом недоверенном источнике;
  • появились ли необычные команды, процессы, сетевые обращения или изменения конфигурации на Mac;
  • какие секреты и разрешения были доступны именно этому запуску;
  • совпадает ли время события с запуском workflow, изменением кода или выдачей доступа.

Сопоставляйте логи выполнения с историей изменений и настройками workflow, а не только с уведомлением. Официальное руководство GitHub по просмотру логов workflow описывает, как открыть логи запуска и изучить шаги. Сохраните относящиеся к расследованию сведения по правилам вашей организации: идентификатор запуска, commit, ветку, инициатора, имя Runner и последовательность событий. Не копируйте значения секретов в тикеты, чаты и заметки расследования.

Что сделать, если self-hosted Runner мог раскрыть секреты? В первую очередь остановите новые запуски подозрительного workflow, ограничьте доступ к затронутому Runner и определите, какие учётные данные могли быть доступны. Не начинайте с удаления логов или повторного запуска: это может уничтожить полезные следы либо снова передать секрет недоверенному коду.

Контрольная точка: остановить выполнение и сохранить контекст

При подозрении на инцидент приостановите или отключите затронутый workflow согласно процедурам репозитория и организации. Если вы не можете гарантировать, что Runner не примет новую задачу, ограничьте его доступ к очереди штатными средствами и эскалируйте вопрос ответственному за инфраструктуру. Не пытайтесь обходить правила одобрения pull request или организационные ограничения: они являются частью защиты и должны оставаться включёнными во время проверки.

До любых изменений зафиксируйте доступные сведения о событии, но не делайте это за счёт повторного исполнения подозрительного кода. В частности, отметьте:

  • какой workflow и какой шаг запускались;
  • из какой ветки, commit или pull request пришёл код;
  • какие типы учётных данных могли быть переданы процессу;
  • кто мог одобрить или запустить workflow;
  • использовался ли тот же Mac для других проектов или задач.

Дальше разделите область инцидента. Если проблема ограничена выводом одного шага, это не доказывает компрометацию всего Mac; если же на Runner исполнялся недоверенный код, нельзя предполагать, что риск ограничен только одним секретом. GitHub предупреждает, что self-hosted Runner не гарантирует чистую изолированную среду для каждого запуска и что недоверенный код может угрожать среде Runner и доступным ей данным. Границы этого риска описаны в документации GitHub по безопасному использованию Actions.

Нужно ли заново зарегистрировать Mac Runner после выполнения недоверенного кода? Простая повторная регистрация сама по себе не является очисткой. Если вы не можете подтвердить целостность узла, прекратите выдачу ему задач и выполните предусмотренную ответственным лицом очистку или восстановление системы. После этого решите, требуется ли удалить старую регистрацию и зарегистрировать Runner заново; порядок удаления описан в официальной инструкции GitHub. Решение о регистрации принимайте после проверки среды, а не вместо неё.

Таблица помогает выбрать следующий шаг по наблюдаемому признаку. Это инструмент первичной сортировки, а не заключение о факте компрометации.

Наблюдение Что можно заключить Действие до возобновления задач
Секрет виден в опубликованном логе или артефакте Есть подтверждение раскрытия конкретного значения; доступ к нему следует считать скомпрометированным Ограничить использование, отозвать или заменить значение, проверить связанные разрешения и публикации
Workflow получил код из pull request, а затем выполнил команды Код мог исполняться в контексте доступных ему разрешений; сам факт запуска не определяет, какие секреты были доступны Проверить событие-триггер, настройки одобрения, права токена и переданные секреты
На Mac замечены неизвестные изменения или процессы Есть основание подозревать изменение среды Runner, но источник и область воздействия требуют проверки Изолировать узел, сохранить нужный контекст и не направлять ему новые задания
Получено только общее предупреждение без подтверждённого доступа Утечка не установлена, однако предупреждение требует проверки конфигурации и журналов Сопоставить событие с workflow и изменениями кода; не объявлять инцидент закрытым без проверки

Проверка кода pull request и контекста секретов

Вопрос о том, могли ли секреты попасть к коду из pull request, решается по фактической конфигурации workflow и событию, которое его запустило. Проверьте, принимался ли код из fork, требовалось ли одобрение перед запуском и выполнял ли workflow непроверенный код в контексте, где были доступны секреты или привилегированный токен. Не делайте вывод только по названию триггера: изучите полный файл workflow и связанные настройки репозитория.

Особое внимание уделите pull_request_target. Этот триггер работает в контексте базового репозитория, поэтому опасная конфигурация может сочетать доступ к привилегированному контексту с выполнением кода из недоверенного pull request. В документации GitHub о безопасном использовании pull_request_target объясняется граница риска. Проверьте, не проверяет ли workflow код pull request и не запускает ли его команды или скрипты в таком контексте. Не отключайте одобрение ради удобства и не меняйте триггеры, пока не поняли, как это повлияет на доверие к исходному коду.

Отдельно изучите права GITHUB_TOKEN. Доступные операции зависят от разрешений, заданных для workflow или отдельной задачи; не предполагайте, что токен имеет только минимальные права. Сверьте конфигурацию с описанием модели разрешений GITHUB_TOKEN и синтаксисом управления правами workflow. Если права шире необходимых, зафиксируйте это как отдельный риск и исправьте конфигурацию перед восстановлением.

Как определить, были ли секреты доступны коду из pull request? Проследите цепочку целиком: событие-триггер → источник кода → требование одобрения → контекст, в котором выполнялись команды → секреты и разрешения, доступные задаче. Если логи не показывают значения, это ещё не доказывает, что код не мог получить их во время выполнения. При сомнении относитесь к потенциально доступным секретам как к затронутым, пока не установите обратное.

Секрет виден в логе — проверьте не только строку

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

При этом отсутствие видимой строки не подтверждает, что секрет не был раскрыт. GitHub старается автоматически маскировать секреты в логах, но маскирование не является гарантией: форматирование, преобразование или составление значения по частям могут помешать обнаружению. Правила и ограничения маскирования описаны в документации GitHub по Secrets. Поэтому проверьте, какие значения передавались процессу и какие действия мог выполнять код, а не только ищите точное совпадение в тексте лога.

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

План восстановления: от ротации к проверенному запуску

После ограничения доступа переходите к восстановлению по очереди. Ротация решает проблему использования старого значения, но не подтверждает, что Runner чист, что workflow безопасен или что к учётной записи не добавили посторонние разрешения. Записывайте, кто выполнил действие и какой компонент оно затронуло, не сохраняя сами секреты.

  1. Составьте перечень затронутых данных. Сопоставьте логи, настройки workflow, историю изменений и контекст запуска. Для каждого секрета отметьте, был ли он явно раскрыт, был ли доступен выполнявшемуся коду или связь пока только подозревается.
  2. Ограничьте дальнейшее использование. Отзовите доступ либо временно остановите выдачу подозрительных учётных данных в соответствии с процедурой владельца. Для токена проверьте не только его значение, но и выданные права и действия, которые могли быть выполнены.
  3. Замените или отзовите учётные данные. Действуйте в системе, которая выдала конкретный ключ или токен, а затем обновите безопасное хранилище проекта. Не считайте обновление записи в Secrets достаточным, если старое значение по-прежнему принимается внешним сервисом.
  4. Проверьте связанные разрешения и изменения. Ищите не только новый секрет, но и неожиданные изменения workflow, веток, среды, настроек доступа и разрешений интеграций. Удалите неподтверждённые изменения только по процедуре организации и сохраните сведения, нужные для расследования.
  5. Очистите или восстановите Runner. Если среда могла быть изменена недоверенным кодом, не возвращайте её в очередь на основании одного факта, что ключи уже сменены. Согласуйте очистку, переустановку или восстановление с ответственным за Mac и инфраструктуру.
  6. Перепроверьте конфигурацию workflow. Убедитесь, что код недоверенного источника не выполняется с лишними секретами или правами, а ограничения и одобрения соответствуют модели доступа команды.
  7. Проведите контролируемый тест. После подтверждения целостности запускайте доверенный workflow с ограниченными разрешениями. Убедитесь, что сборка проходит, нужные секреты доступны только предусмотренным шагам, а старые значения больше не принимаются выдавшими их системами.

Как проверить, что после ротации старые GitHub Actions secrets больше не работают? Проверяйте их в системе-источнике, которая выдала ключ или токен: отзовите старое значение и выполните безопасную проверку допустимым для этой системы способом. Обновлённое значение в настройках GitHub не доказывает, что прежнее значение отозвано у внешнего поставщика. Не выводите ключ в логи и не проверяйте его запуском недоверенного workflow.

Ситуация после проверки Можно ли возвращать Runner в очередь Что ещё должно быть подтверждено
Секрет раскрыт, но целостность Mac подтверждена ответственным лицом Только после отзыва или замены значения и проверки workflow Старый ключ отозван у источника; права и публикации проверены
На Mac исполнялся недоверенный код, состояние узла неизвестно Нет, пока среда не очищена или не восстановлена по принятой процедуре Ответственный подтвердил состояние узла; старые регистрации и доступы проверены
Обнаружено лишь предупреждение, доказательств исполнения или доступа пока нет Не автоматически; сначала ограничьте подозрительный запуск и завершите проверку Проверены событие, источник кода, доступные секреты и разрешения
Восстановленный Runner прошёл контролируемую проверку Да, если ответственный за среду разрешил возврат Тест выполнен доверенным кодом, область секретов ограничена, результат зафиксирован

Практический критерий закрытия — не просто «ключи обновлены». Вы должны иметь подтверждение, что старые учётные данные отозваны там, где они выдавались; подозрительный workflow больше не выполняет рискованный путь; права соответствуют нужной задаче; а состояние Mac проверено ответственным за инфраструктуру. Если часть этих условий нельзя проверить, сохраняйте ограничение на запуск и передайте вопрос владельцу соответствующей системы.

Снизьте вероятность повторения

После восстановления разберите первопричину отдельно от срочного устранения последствий. Ограничивайте GITHUB_TOKEN теми действиями, которые реально нужны workflow; разделяйте секреты по репозиториям и средам; не передавайте секреты задачам, которые выполняют непроверенный код. Проверяйте источник и разрешения сторонних Actions, а изменения workflow рассматривайте как изменение границы доверия, а не как обычную правку скрипта.

Для self-hosted Runner важно учитывать постоянство среды. Не планируйте обработку недоверенных задач так, будто каждый запуск гарантированно получает полностью чистую машину. Разделите доверенные сборки и задачи с недоверенным кодом, а доступ Runner к репозиториям, ключам и сети согласуйте с ответственными за них. Конкретная схема зависит от архитектуры команды: одна и та же настройка не подходит одинаково для личного проекта и клиентской инфраструктуры.

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

Когда имеет смысл менять способ размещения Runner

Собственный Mac даёт прямой контроль над физической машиной, но требует самостоятельно обеспечивать её доступность, обновление, мониторинг и восстановление после подозрительных запусков. В поездках добавляются зависимость от доступности домашней сети и необходимость поддерживать удалённый доступ. Удалённая среда снимает часть задач с физическим устройством, но сама по себе не гарантирует изоляцию workflow, правильную ротацию ключей или чистое состояние Runner. За эти границы нужно отвечать отдельно и сверять их с фактическими условиями обслуживания.

Если после завершения инцидента вам нужен временный или удалённо доступный Mac для сборок, сначала сопоставьте права доступа, порядок изоляции, ответственность за восстановление и обработку данных с требованиями вашего проекта. Для короткой работы macminirent может быть удобнее, чем постоянно обслуживать собственный Mac в поездке, но аренда не заменяет безопасную настройку GitHub Actions и не должна использоваться как способ обойти разбор уже случившейся утечки. Перед переносом сборок изучите условия удалённой среды и убедитесь, что разделение ответственности подходит вашей команде.

Читайте также

Выделенное физическое устройство

Выделенный Mac для вашего CI Runner

Арендуйте у macminirent физический Mac mini для сборок и автоматизированных задач в отдельной среде.

Выбрать конфигурацию и арендовать