COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
GitHub.com이 신고 75분 만에 패치한 babeld의 push option 인젝션. Wiz 연구진 6인이 IDA MCP로 closed-source 바이너리에서 발견한 CVE-2026-3854(CVSS 8.8) 사건의 75분 타임라인과 세미콜론 한 글자가 만든 cross-tenant RCE 체인을 정리한다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
2026년 3월 4일 오후 5시 45분(UTC). GitHub 보안팀에 Wiz 연구진의 신고가 도착했다. 단일 git push 명령으로 GitHub.com의 공유 스토리지 노드에서 임의 코드를 실행할 수 있다는 내용이었다. 40분 만에 내부 재현이 끝났고, 75분 후인 오후 7시(UTC) 패치가 배포됐다. 수백만 개의 비공개 저장소가 75분 동안 노출과 봉합 사이를 오갔다.
로 발급된 이 취약점은 GitHub의 Git 프록시 babeld에서 발생했다. 클라이언트 푸시 옵션을 내부 메타데이터 헤더로 변환하는 과정의 명령 주입 결함이다. 등급은 8.8(HIGH), 분류는 CWE-77이다. 공격자는 유효한 GitHub 계정 하나만으로 cross-tenant 권한 상승을 시도할 수 있었다.
| 항목 | 값 |
|---|---|
| CVSS v3.1 | 8.8 (HIGH) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 취약점 분류 | CWE-77 Command Injection |
| 영향 받은 컴포넌트 | babeld (GitHub 자체 Git 프록시) |
| 영향 범위 | GitHub.com + GHE 3.14 ~ 3.20 |
| 발견 도구 | IDA MCP (AI 보조 역공학 툴체인) |
이 취약점을 발견한 사람은 Wiz Research Team 소속 6인이다. Sagi Tzadik, Nir Ohfeld, Ronen Shustin, Hillai Ben-Sasson, Yuval Avrahami, Noam Malron. 이들은 GitHub의 트래픽이 통과하는 babeld를 분석 대상으로 삼았다. babeld는 외부에 공개되지 않은 컴파일 바이너리다.
연구진은 IDA MCP라는 AI 보조 역공학 도구를 사용해 babeld의 내부 프로토콜을 재구성했다. Wiz의 공식 글은 "컴파일된 바이너리를 대규모로 분석하기 위해 AI 보조 역공학을 활용했다"고 밝혔다. 클로즈드 소스 인프라가 더 이상 분석을 늦추는 장벽이 되지 못한다는 점이 이번 사건의 한 축이다.
babeld는 git push -o <key=value> 형태로 들어온 푸시 옵션을 X-Stat이라는 내부 HTTP 헤더로 변환해 백엔드에 전달한다. X-Stat은 세미콜론으로 필드를 구분하는 평범한 키=값 직렬화 형식이며, 같은 키가 두 번 나오면 뒤의 값이 앞의 값을 덮어쓴다(last-write-wins 시맨틱). 문제는 babeld가 사용자가 보낸 푸시 옵션 값에 포함된 세미콜론을 정제하지 않았다는 점이었다.
공격자는 푸시 옵션 값 안에 직접 세미콜론을 넣어 새로운 X-Stat 필드를 만들어낼 수 있었다. 단계는 세 갈래로 이어졌다.
먼저 rails_env 필드를 변조해 production 모드에서 적용되던 샌드박스를 우회했다. 다음 custom_hooks_dir로 훅 디렉토리 lookup의 베이스 경로를 옮겼다. 마지막으로 repo_pre_receive_hooks에 path traversal 시퀀스를 넣어 공격자가 지정한 바이너리를 pre-receive 훅으로 실행시켰다. 단일 git push 명령 한 번으로 sandbox bypass → hook redirection → arbitrary binary execution이 차례로 트리거됐다.
GitHub.com은 공유 스토리지 노드에서 다수 테넌트의 저장소를 함께 다룬다. 그 위에서 임의 명령이 실행 가능하다는 것은 cross-tenant 노출을 의미한다. Hacker News에서 한 댓글 작성자가 정리한 표현대로 "익명 사용자가 사실상 모든 비공개 저장소를 읽을 수 있는" 상태가 75분 동안 존재한 셈이다.
GitHub의 공식 입장은 분명했다. "이 취약점의 결과로 어떤 고객 데이터도 접근·수정·유출되지 않았다." GitHub는 로그를 전수 조사한 뒤, 비정상 코드 경로를 트리거한 모든 인스턴스가 Wiz 연구진의 테스트로 귀결된다고 밝혔다.
GitHub Enterprise Server의 영향 받는 버전은 3.14에서 3.20까지였고, 3.14.25, 3.15.20, 3.16.16, 3.17.13, 3.18.8, 3.19.4 패치가 동시 공개됐다. 이 부분은 GitHub 공식 어드바이저리(GHSA-64fw-jx9p-5j24)에 명시돼 있다.
세 가지 의미가 겹쳐 있다.
첫째, SaaS와 self-hosted 사이의 패치 격차. GitHub.com은 75분 만에 닫혔다. 그러나 GHE는 마이너 업그레이드를 운영자가 직접 수행해야 한다. 다중 시간 다운타임이 따라붙는 작업이다. Hacker News의 4월 말 공개 토론에서는 인터넷에 노출된 GHE 인스턴스의 다수가 disclosure 시점에도 미패치 상태였다는 주장이 나왔다. 다만 1차 출처가 아닌 커뮤니티 관측이므로 본문에서는 "다수"로만 전달한다.
둘째, AI 역공학의 변곡점. 클로즈드 소스 바이너리는 더 이상 안전을 약속하지 못한다. Wiz는 IDA MCP로 babeld를 풀어 헤쳤고, GitHub의 비공개 내부 프로토콜이 외부 분석으로 재구성됐다. security-through-obscurity가 시간 비용 외에 어떤 보호도 제공하지 못한다는 점을 한 번 더 확인시킨 사건이다.
셋째, 단일 sanitization 결함의 폭발력. 세미콜론 한 글자가 정제되지 않은 결과로 세 단계 인젝션 체인이 형성됐다. 그 결과는 멀티 테넌트 인프라 전체에 cross-tenant RCE 노출이었다. 사용자 입력의 모든 경로에서 화이트리스트 기반 정제가 필요하다는 옛 교훈이 다시 호명됐다. 특히 내부 직렬화 형식의 구분자가 사용자 제어 영역과 만나는 지점이 위험하다.
CISA KEV에는 등재되지 않았다. 활성 악용 증거가 없고, 공격자가 PoC를 보유한 정황도 발견되지 않았기 때문이다. 그러나 disclosure 이후 PoC가 공개됐고, GHE 운영자에게는 패치 우선순위가 즉시 최상위로 올라간 상태다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.
KW_PROTECT_0