도구 및 익스플로잇치명적

GitHub Actions 워크플로 인젝션 공격 방지: 탐지 및 완화 가이드

3분 읽기출처: GitHub Blog - Security
Bar chart showing OWASP Top 10 vulnerabilities detected by CodeQL in 2024, highlighting injection attacks as the most common risk

GitHub Actions 워크플로 인젝션 공격의 기술적 원인과 영향을 분석하고, 환경 변수 활용, 최소 권한 원칙, CodeQL 스캔 등 실질적인 완화 전략을 제시합니다.

GitHub Actions 워크플로 인젝션 공격 방지 가이드

GitHub의 2024 Octoverse 보고서에 따르면, GitHub Actions 워크플로 인젝션은 GitHub 저장소에서 가장 흔한 보안 취약점 중 하나로 꼽힙니다. 이러한 공격은 워크플로에서 신뢰할 수 없는 입력을 악용하여, 위협 행위자가 워크플로 수준의 권한으로 악성 명령을 실행할 수 있게 합니다. 보안 전문가는 GitHub의 내장 도구, 안전한 코딩 관행, 자동화된 스캔을 통해 이러한 위험을 완화할 수 있습니다.

워크플로 인젝션의 기술적 세부 사항

GitHub Actions 워크플로 인젝션은 공격자가 이슈 제목이나 브랜치 이름과 같은 악의적인 입력을 제출했을 때 발생하며, 이는 워크플로에 의해 실행됩니다. 이 취약점은 워크플로 전처리 중에 신뢰할 수 없는 입력을 확장하는 ${{}} 구문에서 비롯됩니다. 예를 들어:

- name: print title
  run: echo "${{ github.event.issue.title }}"

공격자는 `touch pwned.txt`와 같은 이슈 제목을 작성할 수 있으며, 이는 워크플로가 실행될 때 명령어로 실행됩니다. 워크플로는 종종 높은 권한을 상속받기 때문에, 이는 무단 접근이나 데이터 유출로 이어질 수 있습니다.

주요 공격 벡터

  • 신뢰할 수 없는 입력 확장: run 명령에서 ${{}}를 직접 사용.
  • 권한 상승: 과도한 권한(예: write 접근 또는 비밀 노출)으로 실행되는 워크플로.
  • pull_request_target 트리거: 기본 보안 제한을 우회하여 포크된 PR에 비밀 및 쓰기 권한을 부여.

영향 분석

성공적인 워크플로 인젝션은 다음과 같은 결과를 초래할 수 있습니다:

  • 코드 실행: 워크플로 권한으로 악성 명령 실행.
  • 데이터 유출: 저장소 비밀 또는 민감한 파일의 노출.
  • 저장소 침해: 코드 또는 CI/CD 파이프라인에 대한 무단 수정.

이 위험은 main 브랜치뿐만 아니라 취약한 워크플로가 있는 모든 공개 브랜치를 대상으로 할 수 있습니다.

완화 전략

1. 환경 변수를 통한 신뢰할 수 없는 입력 처리

run 명령에서 신뢰할 수 없는 입력을 직접 확장하지 마십시오. 대신 데이터를 환경 변수를 통해 전달하십시오:

- name: print title
  env:
    TITLE: ${{ github.event.issue.title }}
  run: echo "$TITLE"

이 방법은 입력을 정화하지는 않지만, 명령 인젝션을 방지하여 공격 표면을 제한합니다.

2. 최소 권한 원칙

GITHUB_TOKEN에 대해 permissions 키를 사용하여 워크플로 권한을 제한하십시오:

permissions:
  contents: read
  issues: write

쓰기 권한이 명시적으로 필요한 경우가 아니면 읽기 전용 접근을 기본으로 설정하십시오.

3. pull_request_target 사용 피하기

포크된 PR이 비밀 또는 쓰기 권한에 접근하지 못하도록 pull_request_target 대신 pull_request를 사용하십시오. pull_request_target 사용이 불가피한 경우, 워크플로의 인젝션 위험을 감사하고 권한을 제한하십시오.

4. CodeQL을 통한 워크플로 스캔

GitHub의 CodeQL은 이제 GitHub Actions 워크플로를 자동으로 스캔할 수 있습니다. 다음을 통해 활성화하십시오:

  • 기본 설정: 보호된 브랜치를 자동으로 스캔.
  • 고급 설정: CodeQL 구성에서 대상 언어로 actions를 추가.

CodeQL의 테인트 추적(taint tracking) 기능은 신뢰할 수 없는 데이터 흐름을 식별하여 미묘한 인젝션 위험을 발견합니다.

권장 사항

  • 모든 브랜치 스캔: main 브랜치가 안전하더라도 기능 브랜치의 취약점은 악용될 수 있습니다.
  • 도구와 수동 검토 병행: 어떤 도구도 100% 효과적이지 않으므로, 보안 우선 사고방식을 유지하십시오.
  • 팀 교육: GitHub의 워크플로 강화 4부작 보안 시리즈를 공유하십시오.

다음 단계

저장소에서 CodeQL 코드 스캔을 활성화하여 워크플로 인젝션을 사전에 탐지하십시오. 고급 구성의 경우, CodeQL 설정에서 대상 언어로 actions를 포함하십시오.

자세한 내용은 GitHub의 워크플로 보안 문서를 참조하십시오.

공유

TwitterLinkedIn