NOW Briefing
git rebase --exec 인자 주입 제로데이를 미패치 상태로 공개했습니다.
Gogs 미패치 제로데이: git rebase 인자 주입 RCE
■ 개요
Gogs는 Go로 작성된 자체 호스팅 Git 서비스로, 사내 소스 코드와 CI/CD 자격증명, 릴리스 산출물을 보관하는 핵심 인프라로 자주 사용됩니다. 2026년 5월 28일 Rapid7이 공개한 제로데이는 Pull Request의 Rebase before merging 과정에서 발생하는 인자 주입 취약점입니다. 인터넷 노출 인스턴스는 약 1,141건이며 Windows, Linux, macOS 모두 동일하게 영향을 받습니다.
이 취약점에서 공격자는 인증된 계정으로 --exec=... 형식의 악성 브랜치명을 가진 Pull Request를 생성한 뒤 Rebase 머지를 실행해 서버에서 임의 명령을 실행할 수 있습니다. 관리자 권한이나 다른 사용자의 상호작용은 필요하지 않으며, 공격자 본인이 만든 저장소만으로도 익스플로잇이 성립합니다. Gogs 기본 구성은 회원가입과 저장소 생성을 허용하므로 실제 운영 환경에서는 인증이 필요없는 위협으로 평가해야 합니다.
Rapid7은 2026년 3월 17일 메인테이너에게 비공개로 제보하고 3월 28일 접수 확인을 받았지만, 추가 응답이 없어 2026년 5월 28일 미패치 상태로 보고서를 공개했습니다. 같은 날 Linux와 Windows 타깃을 모두 지원하는 Metasploit 모듈도 공개되어 자동화 공격의 진입 장벽이 사라졌습니다. CVE는 아직 할당되지 않았지만 Rapid7은 CVSS v4.0 9.4(Critical)로 평가했으며, 노출 인스턴스에는 즉시 격리·완화 조치를 적용해야 합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | 미할당(GHSA-qf6p-p7ww-cwr9) |
| CVSS 점수 | CVSS v4.0 9.4 / Critical(Rapid7 자체 평가, 공식 NVD 점수 없음) |
| 취약점 유형 | CWE-88: 인자 주입 또는 수정(Argument Injection or Modification), 인증 RCE |
| 영향/위험 |
- 인증된 계정 권한으로 Gogs 서버에서 임의 명령 실행 가능 - 기본 설정(공개 가입+무제한 저장소 생성)에서 사실상 사전 인증 공격 성립 - 인스턴스 내 모든 저장소·SSH 키·CI 시크릿 노출 가능 - 공개 Metasploit 모듈 존재로 자동화 대량 공격 위험 |
| 취약 버전 | Gogs ≤ 0.14.2, 0.15.0+dev(commit b53d3162 기준) |
| 패치 버전 | 미패치(2026-05-28 기준, 메인테이너 무응답) |
■ 기술 분석
취약점은 internal/database/pull.go의 Merge() 함수에 있습니다. Rebase 전략으로 PR을 머지할 때 Gogs는 작업 디렉터리에서 git rebase --quiet <base> <head>를 호출하는데, 이때 --(double-dash) 옵션 종료 구분자가 누락돼 있습니다. pr.BaseBranch 값이 사용자가 제어할 수 있는 브랜치명에서 나오기 때문에 --로 시작하는 문자열도 Gogs가 git 옵션 자리에 그대로 전달합니다.
// internal/database/pull.go - Merge() 함수 내 git rebase 호출
if _, stderr, err = process.ExecDir(-1, tmpBasePath,
fmt.Sprintf("PullRequest.Merge (git rebase): %s", tmpBasePath),
"git", "rebase", "--quiet", pr.BaseBranch, remoteHeadBranch); err != nil {
// ... 생략 ...
}
git rebase는 --exec=<cmd> 플래그를 지원해 리베이스 중 각 커밋마다 임의 셸 명령을 실행합니다. 따라서 브랜치명을 --exec=<명령>으로 만들면 Gogs가 호출한 git 프로세스가 해당 인자를 서비스 사용자 권한으로 실행합니다. 공백처럼 git이 거부하는 문자는 ${IFS} 같은 셸 메타문자로 우회할 수 있고, Windows 인스턴스에서도 보조 파일을 거치면 동일한 결과를 얻을 수 있다고 Rapid7은 보고했습니다.
📘 INFO
Rapid7은 보고서에서 옵션 종료 구분자가 누락된 다른 git 호출에도 같은 유형의 문제가 남아 있을 수 있다고 지적했습니다.
메인테이너 응답이 없는 상황이므로 Gogs의 다른 인자 주입 변형도 추가로 등장할 가능성을 염두에 두어야 합니다.
■ 개념 증명 코드(PoC)
이 인자 주입을 이용하는 Rapid7의 공개 공격 재현 절차는 공격자가 자신이 소유한 임시 저장소를 만들고 base 브랜치명을 --exec=...로 지정한 뒤 Rebase 머지를 트리거하는 흐름입니다. Metasploit 모듈은 같은 절차를 자동화하며, own_repo 모드에서는 흔적을 줄이기 위해 임시 저장소를 생성·삭제하고, existing_repo 모드에서는 공격자가 쓰기 권한을 보유한 기존 대상을 노립니다.
# 공개 보고서를 방어 관점에서 단순화한 개념도 (실행 가능 코드 아님)
# 1) 공격자가 인증 후 자신의 저장소를 생성하고 다음 이름의 브랜치를 만든다
base_branch_name = "--exec=touch${IFS}/tmp/rce_proof"
# 2) 동일 저장소에 임의 head 브랜치를 생성한 뒤 PR을 등록하고
# UI 또는 API를 통해 "Rebase before merging"을 실행한다
# 3) Gogs는 결국 다음과 동등한 명령을 서버에서 실행한다
git rebase --quiet --exec=touch${IFS}/tmp/rce_proof <head>
# pr.BaseBranch가 옵션 위치로 들어가 --exec 플래그로 해석됨
# 4) git이 각 커밋 재적용 시 --exec 값으로 임의 명령을 실행한다
# → 결과: Gogs 프로세스 권한으로 임의 셸 명령 실행
⚠️ WARN
이 코드는 실제 익스플로잇이 아니라 공개 개념 증명 코드의 동작 원리를 방어 관점에서 단순화한 예시입니다.
미패치 상태이고 공개 Metasploit 모듈이 자동화 공격을 지원하므로, 외부 노출 인스턴스는 패치 전까지 인증 경계·가입 정책 변경만으로 안전하지 않다고 전제하고 대응해야 합니다.
■ 탐지 및 점검
✅ CHECK
공개 Metasploit 모듈이 자동화 공격을 지원하므로, 영향 범위 식별과 익스플로잇 흔적 탐지를 즉시 병행해야 합니다.
한 항목이라도 해당하면 노출로 간주하고 격리·자격증명 회전을 우선 진행해야 합니다.
• Gogs 버전 확인: 바이너리에서 gogs --version 실행 또는 /api/v1/version 응답에서 0.14.2 이하·0.15.0+dev 빌드 여부를 식별합니다.
• app.ini의 [service] DISABLE_REGISTRATION 값이 false이고 [repository] MAX_CREATION_LIMIT가 무제한(-1)인지 확인하고, 두 조건이 함께 있는 인스턴스는 사실상 RCE 노출로 분류합니다.
• 저장소 설정에서 Rebase before merging(pulls.ALLOW_REBASE_MERGE) 활성 여부를 확인합니다. 비활성이라도 공격자가 자기 저장소에서 활성화 가능하므로 사용자 저장소 생성 권한이 남아 있으면 완화책으로 적절하지 않습니다.
• Git refs에서 --로 시작하는 의심 브랜치명을 검색하여 색출합니다. git for-each-ref refs/heads/ --format='%(refname:short)' | grep -E '^--'(Gogs 데이터 디렉터리의 각 베어 저장소에서 실행)
• 머지 시각 전후 Gogs 프로세스에서 비정상 자식 프로세스(sh, bash, curl, wget, powershell.exe) 생성 이력과 외부 IP 대상 TCP 연결을 감사합니다.
■ 대응 방안
💡 TIP
영향 범위가 확인됐거나 외부 노출 여부를 배제할 수 없다면, 패치가 없는 동안에는 공격 표면 축소가 사실상의 유일한 통제 수단입니다.
가입과 저장소 생성을 모두 차단해도, 이미 가입한 사용자는 자신의 저장소에서 익스플로잇을 트리거할 수 있습니다.
• app.ini에서 DISABLE_REGISTRATION = true로 신규 가입을 즉시 차단하고, 이미 가입된 비신뢰 계정은 잠금 처리합니다.
• MAX_CREATION_LIMIT = 0으로 일반 사용자 저장소 생성 권한을 회수하고, 신뢰 가능한 운영자만 저장소를 만들 수 있도록 제한해야 합니다.
• 외부 노출 인스턴스는 인터넷에서 분리해 VPN·SSO 게이트웨이 뒤로 이전하거나, 패치 출시 전까지 읽기 전용 모드로 운영합니다.
• 영향 받는 호스트의 SSH 배포 키, OAuth/PAT 토큰, CI 시크릿, 웹훅 시크릿은 유출을 전제로 회전하고, 인스턴스가 보관한 다른 저장소의 무결성을 별도 미러와 비교하여 확인합니다.
• 메인테이너 응답이 장기간 없는 만큼 Gitea, Forgejo 등 활발히 유지보수되는 대체 솔루션 이전 일정을 수립해야 합니다.
[참고 자료]
Rapid7, Authenticated RCE via Argument Injection in Gogs (NOT FIXED)
The Register, No fix yet for critical RCE bug in open-source Git service Gogs
Metasploit Framework PR #21515, Add Gogs rebase RCE exploit module



