Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-39866 — # GitHub Actions 워크플로 디스패치의 명령 주입을 시연하는 개념 증명 랩 (CVE-2026-39866) 교육용 분석을 위해 취약한 버전과 패치된 버전을 나란히 실행합니다. | Kitploit
도구/GitHubGitHub/abhayclasher/cve-2026-39866
Vulnerability AnalysisExploitationWeb Application ExploitationCommand and ControlLearning & EducationLabs & Practice
GitHubabhayclasher/cve-2026-39866

CVE-2026-39866

# GitHub Actions 워크플로 디스패치의 명령 주입을 시연하는 개념 증명 랩 (CVE-2026-39866) 교육용 분석을 위해 취약한 버전과 패치된 버전을 나란히 실행합니다.

저장소 보기
4개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-39866 — 따옴표 없는 워크플로 디스패치 입력을 통한 명령 주입

CVE GHSA CWE-78 Patched

GitHub Actions 워크플로 디스패치의 명령 주입을 위한 개념 증명 랩


목적

CVE-2026-39866은 Lawnchair의 GitHub Actions 릴리스 워크플로에서 발생하는 명령 주입 버그입니다. release_update.yml 파일은 사용자 입력을 따옴표 없이 bash에 직접 전달하므로, 공격자가 명령을 주입할 수 있습니다. 이 저장소는 취약한 버전과 패치된 버전을 나란히 실행합니다.

빠른 요약

필드값
CVE IDCVE-2026-39866
GHSAGHSA-9prc-pp2c-3427
CWECWE-78 (OS 명령에 사용되는 특수 요소의 부적절한 중화)
제품LawnchairLauncher/lawnchair
영향 범위fcba413 미만의 모든 버전
패치 버전fcba413
발견자Abhay Kumar (@abhayclasher)

취약점 상세 정보

이 취약점은 release_update.yml 워크플로 파일에 존재합니다. 해당 액션은 artifactName 매개변수를 받아 따옴표 없이 bash 명령에 직접 전달합니다.

root@kitploit:~
- name: Rename artifact
  run: mv ${{ inputs.artifactName }}.zip lawnchair.zip

GitHub Actions는 셸이 실행하기 전에 변수 값을 문자열에 대체합니다. ${{ inputs.artifactName }} 주위에 따옴표가 없으면 셸은 공백과 세미콜론을 명령 구분자로 해석합니다.

공격자가 artifactName으로 file.zip; touch pwned.txt #를 제공하면:

GitHub Actions가 이를 파싱하는 방식: ${{ inputs.artifactName }} → file.zip; touch pwned.txt #

셸이 이를 실행하는 방식:

root@kitploit:~
mv file.zip; touch pwned.txt #.zip lawnchair.zip

셸은 mv file.zip을 실행한 다음 touch pwned.txt를 실행하고 나머지는 주석으로 무시합니다.

영향

  • GitHub Actions 러너에서 임의 명령 실행.
  • 러너 환경에 노출된 저장소 비밀(예: GITHUB_TOKEN 또는 릴리스 서명 키) 탈취.
  • 업로드 전에 릴리스 아티팩트 변조.
  • 러너가 자체 호스팅인 경우 연결된 인프라로의 피벗.

시스템 요구 사항

  • Node.js 18 이상
  • Docker (선택 사항, 컨테이너화된 랩용)
  • 500 MB 여유 디스크 공간

설정

옵션 1: 직접 실행

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-39866.git
cd CVE-2026-39866/app
npm install
node server.js

옵션 2: Docker로 실행

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-39866.git
cd CVE-2026-39866
docker compose up -d

사용 방법

서버가 시작된 후 다음 URL을 방문하세요:

URL설명
http://localhost:3000/workflow/vulnerable취약한 워크플로 — 제출 시 명령 주입 실행
http://localhost:3001/workflow/patchedfcba413 패치가 적용된 동일한 워크플로

취약한 버전은 주입된 명령을 러너에서 실행합니다. 패치된 버전은 입력을 리터럴 문자열로 처리합니다.

독립형 PoC도 실행할 수 있습니다:

root@kitploit:~
cd poc
node exploit.js

이 명령은 포트 3000에서 최소 서버를 실행하여 전체 애플리케이션 컨텍스트 없이 동일한 버그를 시연합니다.

작동 방식

탐지 흐름

root@kitploit:~
1. 공격자가 artifactName 입력 매개변수를 제어
2. GitHub Actions가 ${{ inputs.artifactName }}을 YAML로 확장
3. run 단계가 이를 bash로 전송
4. Bash가 따옴표 없는 특수 문자를 보고 명령 구문으로 처리
5. 명령이 러너 환경 권한으로 실행

공격 체인

root@kitploit:~
┌────────────────────────────────────────────────────┐
│  1. 악성 입력:                                      │
│                                                     │
│     artifactName = "file.zip; id #"                │
│                                                     │
│  2. GitHub Actions가 YAML로 대체:                   │
│                                                     │
│     run: mv file.zip; id #.zip lawnchair.zip       │
│                                                     │
│  3. Bash가 인식하는 것:                              │
│     - mv file.zip                                   │
│     - id                    <-- 임의 명령            │
│     - #.zip lawnchair.zip (무시됨)                  │
│                                                     │
│  4. 셸이 임의 명령 실행                             │
└────────────────────────────────────────────────────┘

수정 사항

fcba413 버전은 보간된 변수 주위에 따옴표를 도입합니다:

root@kitploit:~
- name: Rename artifact
  run: mv "${{ inputs.artifactName }}.zip" lawnchair.zip

따옴표는 셸이 특수 문자를 파싱하지 못하게 합니다. 페이로드는 리터럴 파일 이름 문자열로 처리됩니다.

모범 사례는 환경 변수를 사용하여 사용자 입력을 완전히 격리하는 것입니다:

root@kitploit:~
- name: Rename artifact
  env:
    ARTIFACT_NAME: ${{ inputs.artifactName }}
  run: mv "$ARTIFACT_NAME.zip" lawnchair.zip

전체 커밋 보기: fcba413

프로젝트 구조

root@kitploit:~
CVE-2026-39866/
├── README.md               # 이 파일
├── docker-compose.yml      # Docker 랩 구성
├── app/
│   ├── Dockerfile          # 컨테이너 빌드 구성
│   ├── package.json        # Node.js 의존성
│   └── server.js           # 취약 + 패치된 워크플로 러너 시뮬레이션
└── poc/
    └── exploit.js          # 독립형 최소 개념 증명

참고 자료

  • NVD — CVE-2026-39866
  • GitHub Security Advisory
  • 패치 커밋
  • CWE-78

Abhay Kumar이(가) 보고했습니다. 이 저장소는 로컬 교육용으로만 사용하도록 제작되었습니다. 취약한 서버를 공용 네트워크에 배포하지 마세요.

교육 목적 전용 — 격리된 환경에서만 사용하세요

도구 다운로드