
X-Stat Push Option Injection을 통한 GitHub RCE
교육 및 인가된 보안 연구 목적으로만 사용하십시오.
명시적인 서면 허가 없이 어떤 시스템에도 사용하지 마십시오.
CVE-2026-3854는 GitHub Enterprise Server(및 GitHub.com)의 git push 파이프라인에서 발생하는 원격 코드 실행(RCE) 취약점입니다.
클라이언트가 푸시 옵션(git push -o)을 제공하면 GitHub의 내부 Ruby 코드는 각 옵션 값을 세미콜론으로 연결하여 X-Stat 헤더를 생성합니다. 값이 있는 그대로(정화 처리 없이) 삽입되었기 때문에, 공격자는 푸시 옵션에 세미콜론을 포함시켜 헤더에 임의의 키-값 필드를 주입하고 보안에 중요한 설정을 덮어쓸 수 있었습니다 — 궁극적으로 git 사용자 권한으로 샌드박스가 적용되지 않은 RCE를 달성할 수 있었습니다.
X-Stat: repo_id=12345;user_id=alice;rails_env=production;...;push_option_0=<USER INPUT>
normal_value;rails_env=staging을 푸시 옵션 값으로 주입하면 다음과 같이 변합니다:
...;push_option_0=normal_value;rails_env=staging
파서는 각 키의 마지막 항목을 사용하므로 rails_env는 이제 (샌드박스가 적용되지 않은) staging이 되어, 이전에 설정된 정당한 production 값을 덮어씁니다.
list[str] / dict[str, str] 타입 힌트 사용)python3 exploi-git.py
이 스크립트는 네트워크 연결, 셸 명령, 파일 쓰기 없이 전적으로 메모리에서만 세 가지 데모를 연속으로 실행합니다:
| 데모 | 설명 |
|---|---|
| 1 | rails_env를 덮어쓰는 기본 세미콜론 주입 |
| 2 | 전체 3단계 개념적 RCE 공격 체인 |
| 3 | 패치된 동작 — 세미콜론이 퍼센트 인코딩되어 주입이 무력화됨 |
GitHub는 푸시 옵션 값을 X-Stat 헤더에 삽입하기 전에 세미콜론을 퍼센트 인코딩하여 이 취약점을 수정했습니다:
normal_value;rails_env=staging → normal_value%3Brails_env=staging
이로써 세미콜론이 값의 리터럴 일부가 되어 주입이 차단됩니다.
이 저장소는 교육 목적과 인가된 보안 연구 지원을 위해서만 제공됩니다. 저자는 오용에 대해 어떠한 책임도 지지 않습니다. 소유하지 않은 시스템을 테스트하기 전에 항상 명시적인 서면 허가를 받으십시오.