GitHub Actions `pull_request_target` 보안 강화

by DD
6시간 전
조회수 0

`pull_request_target` 이벤트의 잘못된 사용으로 인한 보안 취약점이 다수 발생하며 공급망 공격의 근본 원인으로 지목됨

`actions/checkout` v7에서 포크(fork) PR 코드 체크아웃 기본 차단으로 'pwn request' 패턴 방지

2026년 7월 16일부터 지원되는 모든 주요 버전에 보안 강화 기능 백포트 예정

`pull_request_target` 이벤트의 보안 위험성

본문에서는 `pull_request_target` 이벤트가 GitHub Actions에서 가장 흔하게 오용되는 트리거 중 하나로, 워크플로우의 보안 취약점을 야기한다고 지적합니다. 이 이벤트는 기본 저장소의 `GITHUB_TOKEN`, 비밀(secrets), 기본 브랜치 캐시 접근 권한을 가지고 실행됩니다. 검토되지 않은 포크(fork)의 풀 리퀘스트(pull request) 헤드(head)를 체크아웃하는 과정에서 공격자가 제어하는 코드가 워크플로우의 모든 권한으로 실행될 수 있습니다. 이러한 패턴은 'pwn request'로 알려져 있으며, 공급망 공격(Supply Chain Attack)의 주요 원인으로 작용해왔습니다.

`actions/checkout` v7의 기본 보안 강화 메커니즘

새롭게 출시된 `actions/checkout` v7은 포크(fork) 풀 리퀘스트(pull request) 코드 체크아웃을 기본적으로 거부하여 'pwn request' 패턴을 방지합니다. 특히, `pull_request_target` 및 `workflow_run` 워크플로우에서 포크로부터 온 풀 리퀘스트의 코드를 가져오려 할 때, 해당 요청이 포크 저장소의 리포지토리(`repository`)를 가리키거나, `refs/pull/<pr_number>/head` 또는 `refs/pull/<pr_number>/merge`와 같은 `ref`를 사용하거나, 포크 풀 리퀘스트의 헤드 또는 머지 커밋 SHA를 참조할 경우 체크아웃을 실패 처리합니다. 이는 가장 일반적인 'pwn request' 시나리오를 차단하는 데 중점을 둡니다.

보안 강화 기능의 백포트 및 영향 범위

GitHub은 2026년 7월 16일부터 현재 지원되는 모든 주요 버전에 이 보안 강화 기능을 백포트(backport)할 예정입니다. `actions/checkout@v4`와 같이 유동적인 메이저 태그(floating major tag)에 고정된 워크플로우는 변경 사항을 자동으로 적용받게 됩니다. 그러나 특정 SHA, 마이너(minor), 또는 패치(patch) 버전으로 고정된 워크플로우는 이 백포트의 영향을 받지 않으므로, Dependabot 또는 기존 업그레이드 프로세스를 통해 수동으로 업그레이드해야 합니다. 동일 저장소 내 풀 리퀘스트나 `pull_request` 이벤트 자체는 변경되지 않습니다.

보호 기능 옵트아웃(Opt-out) 메커니즘 및 주의사항

일부 워크플로우는 보안상의 이유로 포크 풀 리퀘스트 코드를 체크아웃해야 할 필요가 있으며, 이를 위해 `actions/checkout` 스텝에 `allow-unsafe-pr-checkout: 'true'` 입력을 추가하여 보호 기능을 옵트아웃(opt-out)할 수 있습니다. 이 옵션은 의도적으로 보안 위험을 내포하고 있음을 명확히 하기 위해 해당 이름으로 지정되었습니다. 옵트아웃을 결정하기 전에, 보안 가이드라인을 숙지하고 해당 이벤트가 워크플로우에 필수적이며 안전하게 사용되는지 확인해야 합니다. 이 기능은 의도적인 보안 결정으로 간주되어야 합니다.

보안 강화 범위 외의 잠재적 위험

이번 변경 사항은 `actions/checkout`을 통한 포크 풀 리퀘스트 헤드 및 머지 커밋 체크아웃만 차단하며, 다른 경로를 통한 'pwn request'는 여전히 존재할 수 있습니다. 예를 들어, `run` 블록에서 `git` 또는 `gh CLI`를 사용하여 신뢰할 수 없는 헤드(HEAD) 리프(ref)를 가져와 실행하는 경우, 또는 `issue_comment`와 같은 다른 이벤트 유형에서 발생하는 'pwn request'는 이 변경으로 차단되지 않습니다. 또한, 신뢰할 수 없는 타사 리포지토리 체크아웃 자체는 차단되지 않으므로, 이러한 시나리오에서는 여전히 코드 실행에 대한 검토가 필요합니다.

Safer pull_request_target defaults for GitHub Actions checkout