Это руководство поможет оценить, стоит ли вашему рабочему процессу использовать это pull_request_target событие и понять связанные с этим риски безопасности. В нем также объясняется, что GitHub защита, которая применяется к этим рискам по умолчанию, и как отказаться от этих защиты при необходимости.
Риски pull_request_target
Рабочие процессы, запускаемые pull_request_target с повышенным доверием: задание получает базовые репозитории GITHUB_TOKEN и доступ к секретам репозитория и организации. Это то же доверие, которое оказывается подобным событиям push , которое могут активировать только соавторы, и именно оно полезно pull_request_target для автоматизации, отвечающей на pull запросы с форков, такие как маркировка, триаж или публикация аутентифицированных проверок состояния.
Чтобы понять, почему это безопасно по умолчанию и как эта защита часто нарушается, ознакомьтесь pull_request_target с pull_request.
Событие pull_request (вместе с pull_request_review и pull_request_review_comment) необычно: оно запускает файл рабочего процесса из коммита слияния pull request. Для pull-запроса, открываемого из форка, этот коммит контролируется кем-то без доступа к записи в базовый репозиторий. Для безопасного запуска кода ненадёжного рабочего процесса эти GitHub события ограничиваются только для чтения GITHUB_TOKEN, запрещают доступ к другим секретам и применяют политики одобрения форка для предотвращения злоупотреблений вычислительной системой. По умолчанию actions/checkout в pull_request workflow также проверяется коммит слияния pull request, так что код проверен, и рабочий процесс, который запускается, остаются последовательными.
pull_request_target Вносит одно важное и тонкое изменение: рабочий процесс и любой последующий actions/checkout вызов, не указанный ref, берутся из стандартной ветки базового репозитория, а не из pull-запроса. Поскольку работает только доверенный код из стандартной ветки, безопасно предоставлять секреты и токен чтения/записи. По умолчанию код с форка не выполняется.
Возникает риск, когда автор рабочего процесса переопределяет это по умолчанию для запуска кода форка. Разработчики часто выбирают pull_request_target это, потому что хотят запускать pull request форка через CI и иметь доступ к секретам, например, для тестирования, требующего приватного реестра. Для этого они указывают actions/checkout на заголовок pull request, а не на стандартную ветку, которая небезопасна:
# INSECURE. Provided as an example only.
on:
pull_request_target:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Test
run: make test
Сам шаг проверки не выполняет недоверенный код. Сам файл рабочего процесса всё равно взят из стандартной ветки. Уязвимость завершается следующим шагом, который запускает код, проверенный в текущей рабочей директории. Здесь make test выполняется Makefile захват с головы запроса на вытяжение. Злоумышленнику достаточно открыть pull request от форка, чей Makefile (или скрипт сборки, тестовая команда, файл зависимостей или конфигурации) содержит вредоносные команды. Эти команды затем запускаются с секретами и токена базового репозитория.
Эта схема известна как «pwn-запрос» и стала коренной причиной множества компромиссов в цепочке поставок. Для получения дополнительной информации см . раздел «Предотвращение запросов pwn из GitHub Security Lab. Распространённые уязвимые формы включают:
- Проверка головы pull-запроса или коммита слияния в
actions/checkout(ref: ${{ github.event.pull_request.head.sha }},ref: refs/pull/${{ github.event.pull_request.number }}/merge) и затем сборка, тестирование или иным способом выполнения результата. - Установка
repository:на вилку (repository: ${{ github.event.pull_request.head.repo.full_name }}) для прямого оттягивания ветви вилки. - Получение кода pull-запроса вне (
actions/checkoutнапример, сgit fetch,gh pr checkoutили скачивание артефакта из запускаpull_requestфорка) и его запуск.
Запросы Pwn также не уникальны для pull_request_target. Любое событие с секретами может вводить запрос pwn, если он проверяется или скачает и выполняет ненадёжный код. Например, рабочий процесс OR issue_comment``workflow_run , который загружает и запускает код pull-запроса форка, уязвим аналогично. Рабочий workflow_run процесс должен рассматривать артефакты, загруженные другими рабочими процессами, как ненадёжные данные, поскольку их содержимое может быть получено из форка.
Политика по умолчанию для pull_request_target
Чтобы защитить рабочие процессы от недоверенных запросов на вытягивание, предоставляет политику событий по умолчанию, GitHub которая блокирует pull_request_target событие в общедоступных репозиториях.
Как работает политика по умолчанию
Для общедоступных репозиториев, которые еще не имеют применимой политики событий Actions, GitHub добавляет политику по умолчанию, которая блокирует рабочие процессы, активируемыеpull_request_target. Дополнительные сведения о политиках см. в разделе О политиках Actions.
Политика по умолчанию:
- Не применяется к частным или внутренним репозиториям.
- Не заменяет соответствующую политику событий, которую вы уже настроили.
- В настоящее время выполняется в режиме оценки . В этом режиме рабочий процесс продолжается, но вы можете использовать аналитические сведения о политиках для выявления запусков, которые будут заблокированы после принудительного применения.
2 ноября 2026 г. GitHub будет применять политику по умолчанию для затронутых репозиториев, которые использовали политику по умолчанию pull_request_target до общей доступности.
Проверка влияния перед применением
Хотя политика находится в режиме оценки, просмотрите аналитические сведения о политике, чтобы определить рабочие процессы, которые используются pull_request_target и будут заблокированы при применении политики.
Для каждого затронутого рабочего процесса определите, требуется ли pull_request_target :
- Если рабочий процесс не нужен
pull_request_target, обновите его, чтобы использовать безопасное событие, напримерpull_request. - Если рабочий процесс должен продолжать использовать
pull_request_target, создайте или обновите соответствующую политику событий Actions, которая явно разрешаетpull_request_target. - Если вы не хотите разрешить
pull_request_target, оставьте политику по умолчанию. После принудительного применения будет блокировать рабочие процессы, GitHub активированные этим событием.
Предупреждение
Разрешить pull_request_target только в том случае, если это необходимо. Рабочие процессы, активируемые этим событием, не должны извлекать, создавать или запускать код из ненадежного запроса на вытягивание с доступом к секретам репозитория или привилегированным GITHUB_TOKEN.
Дополнительные сведения о настройке политик событий и просмотре аналитических сведений см. в разделе Управление тем, кто может выполнять GitHub Actions рабочие процессы. Сведения о программном управлении политиками см. в разделе Конечные точки REST API для политик GitHub Actions.
Определение того, следует ли использовать pull_request_target
Некоторые рабочие процессы требуют проверки fork-pull request-кода с повышенным доверием, и именно поэтому pull_request_target он был создан изначально. Например, генерация отчетов о покрытии, требующих приватного реестра артефактов, или создание и проведение аутентифицированных проверок изменений, введённых в pull request. Рассмотрите вопросы ниже перед использованием pull_request_target или подключением allow-unsafe-pr-checkout к флагу в actions/checkout.
-
Можете ли вы использовать
pull_requestвместо этого?pull_requestтриггерирует на тех же событиях, чтоpull_request_targetи запускает код рабочего процесса изpull_requestветки слияния. Он делает это безопасно при pull request-запросах с форков с описанными выше защитой. Если дополнительный секретный доступ не требуется, используйтеpull_request. Более сложные рабочие процессы можно реструктурировать, чтобы отделить потенциально опасные обработки pull request-кода от доступа к секретам. Для получения дополнительной информации см . раздел «Предотвращение запросов pwn из GitHub Security Lab. -
Выполняется ли когда-нибудь проверенный код? Это уязвимость, которая вводит уязвимости при запросе pwn. Чаще всего это вводится
actions/checkoutчерез запуск головы pull request в рабочую директорию и его запуск. Еслиpathвход не установлен,actions/checkoutон записывает код в$GITHUB_WORKSPACEкаталог, который обычно является рабочей директорией, где выполняются последующие команды. Выполнение не ограничивается вашими собственными этапами: команды сборки и тестирования, такие какnpm installиnpm run build, а также конфигурационные файлы и зависимости, которые код приносит с собой, могут запускать код, управляемый злоумышленниками. Реализация не требует очевидного этапа сборки. Вы должны убедиться, что снятый код проверяется только как данные и никогда не выполняется до использованияpull_request_targetсобытия.
Ужесточение pull_request_target рабочего процесса
Если вы подтвердили, что это pull_request_targetнужно, примените эти меры контроля, чтобы ограничить влияние этого высокорискового события. Они применимы независимо от того, соответствует ли ваш рабочий процесс коду pull request.
-
Ограничьте секреты. Убедитесь, что установленные на них права
GITHUB_TOKENимеют наименьшее количество привилегий и что для рабочего процесса используются только необходимые секреты репозитория и организации. Дополнительные сведения см. в разделе Использование GITHUB_TOKEN для проверки подлинности в рабочих процессах. -
Понимайте влияние кэширования. Чтобы снизить риск отравления кэша, рабочие процессы, заработанные
pull_request_targetим, имеют доступ только для чтения к кэшу в области стандартной ветки. Эти рабочие процессы могут восстанавливать существующие записи кэша, но не могут их создавать или перезаписывать, поэтому не могут влиять на выполнение других, не связанных между собой рабочих процессов через общий кэш. Если такой рабочий процесс пытается сохранить кэш, сохранение не проходит, но шаг и задание продолжаются, и сбой сообщается в журнале рабочего процесса как предупреждение. Если рабочий процесс должен заполнить кэш, сохраните его из рабочего процесса, работающего на доверенном триггере, напримерpush. Рабочий процесс или задание может отказаться от этого ограничения только для чтения, явно объявив возможностьcache-modeзаписи, но при этомpull_request_targetрабочий процесс повторно создает риск отравления кэшем, что это ограничение предназначено для предотвращения. Дополнительные сведения см. в разделе Справочник по кэшированию зависимостей. -
Убедитесь, что исходные вычисления являются изолированными и эфемерными. Если используются самостоятельные бегуны, необходимо убедиться, что среда для бегунов надлежащим образом ограничена от внутренних ресурсов и не используется повторно на протяжении GitHub Actions всех забегов. Дополнительные сведения см. в разделе Справочник по безопасному использованию.
-
Соблюдайте GitHub Actions лучшие практики безопасности. Помимо специфических рисков pwn-запросов, могут существовать и другие распространённые уязвимости, такие как инъекция команд, которые влияют на код, выполняемый в этом привилегированном событии. Для получения дополнительной информации см. раздел «Сохранить безопасность ваших GitHub Actions and workflows: Ненадёжный ввод от GitHub Security Lab. Для выявления и проактивной защиты от распространённых GitHub Actions уязвимостей включите CodeQL .GitHub Actions Дополнительные сведения см. в разделе Настройка настройки по умолчанию для сканирования кода.
Отказ от встроенных средств защиты
Если вы выполнили приведенные выше вопросы и подтвердили, что рабочий процесс требуется pull_request_target и использует его безопасно, вы можете отказаться от политики событий и actions/checkout защиты по умолчанию.
Настройка allow-unsafe-pr-checkout: true как actions/checkout вход позволяет проверять ссылки на головы pull request с форков. Сделайте это только после подтверждения того, что проверенный код так и не выполнен. Входные данные специально названы так, чтобы его было легко заметить при проверке кода и статическом анализе.
Эта защита покрывает только ссылки на pull request fork. Проверка другого ненадёжного кода, например, не связанного стороннего репозитория, получение кода с git fetch помощью или gh pr checkout, или запуск загруженного артефакта, не подпадает под эти actions/checkout проверки.