FlawOpen

flawopen.com/GitHub Actions 보안/Workflow 스크립트 인젝션

GitHub Actions 스크립트 인젝션은 어떻게 발생하고 예방할까요?

권한이 높으면 영향이 큼 CWE-78 CI/CD workflow 보안
쉽게 설명하면

Bash가 시작되기 전에 issue 제목이나 pull request 필드를 스크립트에 넣으면 데이터가 shell 문법으로 바뀔 수 있습니다. 이름을 지시로 오해하는 명찰 프린터와 같습니다. 환경 변수로 값을 전달하고 데이터로 쓸 때 확장을 따옴표로 감싸면 Bash는 스크립트와 분리된 값으로 받습니다. 영향은 토큰, 비밀값, runner, 이벤트에 달려 있습니다.

신뢰할 수 없는 컨텍스트제목, 본문, 브랜치명, 레이블, 커밋 메시지 등 GitHub 이벤트 필드입니다. 외부 사용자가 제어할 문자열로 취급합니다.
표현식 치환GitHub는 shell 실행 전에 ${{ ... }}를 평가합니다. run: 입력이 스크립트 소스에 들어갈 수 있습니다.
환경 변수 전달env:로 전달하면 프로세스 데이터가 됩니다. shell 확장은 인용하고 eval 및 동적 스크립트를 피합니다.
권한 경계이벤트와 workflow가 토큰 권한, 비밀값과 runner 접근을 결정합니다. 영향은 job이 접근 가능한 리소스에 제한됩니다.

근본 원인: shell 분석 전에 데이터가 삽입됨

GitHub는 run 단계의 shell을 시작하기 전에 표현식을 확장합니다. 신뢰할 수 없는 제목을 직접 넣으면 문자가 shell 프로그램을 바꿀 수 있습니다. env: 값은 스크립트 본문과 분리되며 인용하면 일반 명령의 인수로 유지됩니다. 이후 eval, 다른 인터프리터, 인수를 코드로 해석하는 도구에 전달하는 것은 여전히 안전하지 않습니다. GitHub는 이벤트 필드를 공격자가 제어할 수 있는 입력으로 봅니다.

.github/workflows/triage.yml (위험한 삽입)위험
# 위험: 이벤트 데이터가 생성된 shell 스크립트에 포함됨
name: Issue Triage
on:
  issues:
    types: [opened]

permissions:
  contents: read

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
      - name: Print issue title
        run: |
          printf 'Title: %s\n' "${{ github.event.issue.title }}"
.github/workflows/triage.yml (데이터 분리)보강됨
# 더 안전: 이벤트 값을 환경 변수로 전달
name: Issue Triage
on:
  issues:
    types: [opened]

permissions:
  contents: read

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
      - name: Print issue title
        env:
          ISSUE_TITLE: ${{ github.event.issue.title }}
        run: |
          printf 'Title: %s\n' "$ISSUE_TITLE"

공격 경로 요약

Step 1

사용자가 이벤트 필드를 제어

공개 issue나 pull request 제목 또는 브랜치명이 workflow 입력이 될 수 있습니다.

Step 2

Workflow가 shell 소스에 삽입

run:의 직접적인 ${{ github.event... }}는 Bash가 스크립트를 파싱하기 전에 평가됩니다.

Step 3

Shell이 바뀐 프로그램을 해석

값이 shell 문법을 바꾸면 job 프로세스 권한으로 명령이 실행될 수 있습니다. 인용된 인수 데이터로 남으면 인젝션은 발생하지 않습니다.

Step 4

Job 권한이 영향 범위를 결정

침해된 job은 해당 실행에 열린 리소스만 접근합니다. GITHUB_TOKEN 권한, 제공된 비밀값, runner를 확인하고 issue 이벤트와 pull_request_target을 검토하세요.

보안 강화 체크리스트

1차 자료

관련 보안 주제와 분석 살펴보기:전체 보안 디렉터리 →
함께 보기 Cosign GHSA-fx35-mq7g-6g98: Bundle 검증 우회 Dependency Confusion: 위험과 방어 Docker 소켓 노출: 위험과 방어