Код-ревью Senior CI: пайплайны и артефакты обновлено
Код-ревью: workflow GitHub Actions
Вопрос
Workflow запускается на пул-реквесты, в том числе из форков публичного репозитория. Найдите проблемы.
name: build
on:
pull_request_target:
permissions: write-all
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: some-org/setup-tool@master
- run: npm install
- run: npm test
- run: echo "Deploy token ${{ secrets.DEPLOY_TOKEN }}"
- run: |
docker build -t registry.example.ru/app:latest .
docker push registry.example.ru/app:latest
Коротко
Главная дыра: связка pullrequesttarget и checkout кода PR. Этот триггер нужен для узких задач вроде проставления меток, где код PR не исполняется.
Что должен найти ревьюер
- Безопасностьстрока 3
pull_request_targetвыполняется в контексте базового репозитория с доступом к секретам. Вместе с checkout кода из PR (строка 11) это исполнение чужого кода с вашими секретами. - Безопасностьстрока 11Checkout головы PR из форка в
pull_request_target: тесты и скрипты атакующего запустятся с правами и секретами репозитория. Для проверки PR нуженpull_request. - Безопасностьстрока 4
permissions: write-allдаёт токену запись во всё. Нужен минимум:contents: read, остальное точечно. - Безопасностьстрока 7Self-hosted раннер для PR из форков: чужой код выполнится на вашей машине и в вашей сети.
- Безопасностьстрока 12Сторонний action по ветке
@master: любое изменение в нём выполнится у вас. Фиксировать по SHA коммита. - Ошибкастрока 13
npm installможет обновить lock-файл, сборка не воспроизводима. В CInpm ci. - Безопасностьстрока 15Печать секрета в лог. GitHub маскирует точное значение, но любое преобразование (часть строки, base64) уже не скрывается. Секреты не выводят.
- Ошибкастрока 17Тег
latest: непонятно, что задеплоено, откат невозможен. Тегировать SHA коммита. - Безопасностьстрока 18Публикация образа в реестр из непроверенного PR: в реестр попадает код, который никто не ревьюил.
Разбор
Главная дыра: связка pull_request_target и checkout кода PR. Этот триггер нужен для узких задач вроде проставления меток, где код PR не исполняется. Для сборки и тестов PR из форков используют pull_request: секретов там нет, токен только на чтение.
Остальное это гигиена: минимальные permissions, actions по SHA, npm ci, не печатать секреты, тег по SHA, публикация образов только из main после ревью, облачные одноразовые раннеры для недоверенного кода.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.