GitHub Actions 시크릿 누설은 CI/CD 워크플로가 저장된 배포 키·클라우드 자격증명을 로그·아티팩트·포크 PR·OIDC 토큰 경로로 외부에 노출하는 공급망 보안 결함이다.
CI/CD 파이프라인은 클라우드 루트 권한급 자격증명을 다루므로, 시크릿 한 번의 누설이 인프라 전체 장악으로 직결된다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. 포크에서 온 PR이 왜 위험한가요? A. pull_request_target 트리거는 베이스 저장소 컨텍스트에서 시크릿 접근이 가능한데, 여기서 포크의 코드를 체크아웃해 실행하면 외부 기여자의 코드가 시크릿을 읽을 수 있습니다. Q. 서드파티 액션은 어떻게 고정하나요? A. 이동 가능한 태그(@v4)가 아니라 커밋 SHA로 핀 고정해야 합니다. 2025년 tj-actions(CVE-2025-30066) 사고처럼 태그가 악성 커밋으로 재지정되면 태그 참조는 그대로 오염됩니다. Q. OIDC를 쓰면 시크릿이 필요 없나요? A. 장기 클라우드 키를 없앨 수 있지만, 클라우드 측 신뢰 정책에서 sub·audience 조건을 좁히지 않으면 다른 저장소가 토큰을 발급받아 역할을 탈취할 수 있습니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | echo/set-output으로 시크릿 값을 로그에 출력 | 치명 |
| 2 | pull_request_target + 포크 코드 체크아웃 동시 사용 | 치명 |
| 3 | 서드파티 액션을 태그(@v4)로만 참조 — SHA 미고정 | 치명 |
| 4 | OIDC 클라우드 신뢰 정책에 sub·aud 조건 미설정(repo:*) | 치명 |
| 5 | self-hosted 러너를 공개 저장소에 연결 — 포크 PR이 러너 오염 | 높음 |
표준 구현 코드
name: ci
on:
pull_request: # pull_request_target 대신 pull_request 사용
permissions:
contents: read # 워크플로 기본 권한을 최소로
jobs:
build:
runs-on: ubuntu-latest
steps:
# 서드파티 액션은 태그가 아니라 커밋 SHA로 핀 고정
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: build
env:
TOKEN: ${{ secrets.DEPLOY_TOKEN }} # 필요한 스텝에만 주입
run: ./build.sh # echo "$TOKEN" 금지 — 로그로 새어나감
핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·CI 게이트로 모든 경로에 일괄 적용하는 것이 표준이다.
30초 자가진단
# 1. 위험 트리거 검색
grep -rn "pull_request_target" .github/workflows/
# 2. SHA 미고정(이동 태그 참조) 액션 검색
grep -rnE "uses:.*@v[0-9]" .github/workflows/
# 3. 시크릿 로그 노출 흔적
grep -rnE "echo .*(secrets|TOKEN|KEY|PASSWORD)" .github/workflows/
# 하나라도 걸리면 결함
위 시그널이 발견되면 결함이다. GitHub Actions 보안 하드닝 공식 가이드를 함께 참조하라.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | pull_request_target 제거 또는 포크 코드 체크아웃 분리 |
| 2 | 모든 서드파티 액션을 커밋 SHA로 핀 고정 |
| 3 | 워크플로/스텝 permissions 최소화(contents: read 기본) |
| 4 | OIDC 신뢰 정책에 repository·ref·audience 조건 명시 |
| 5 | self-hosted 러너는 비공개 저장소 전용 + 격리 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검 후 우선순위대로 패치.
CISO·임원: 조직 전체 점검·규제 대응은 SENTRIX 30분 1:1 상담으로.
결함은 발견 즉시, 늦어도 24시간 안에 패치하는 것이 표준이다.