Gitblit Embedded SSH Auth Bypass (CVE-2024-28080)
Reading time: 5 minutes
tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:
HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
요약
CVE-2024-28080은 Apache MINA SSHD와 통합할 때 세션 상태 처리가 잘못되어 발생하는 Gitblit의 임베디드 SSH 서비스에서의 인증 우회 취약점입니다. 사용자 계정에 최소 하나의 SSH 공개 키가 등록되어 있으면, 공격자는 사용자 이름과 그 공개 키 중 하나를 알면 개인 키나 비밀번호 없이 인증할 수 있습니다.
- 영향 대상: Gitblit < 1.10.0 (1.9.3에서 관찰됨)
- 수정됨: 1.10.0
- 악용을 위한 요구 조건:
- 인스턴스에서 Git over SSH가 활성화되어야 함
- 피해자 계정이 Gitblit에 최소 하나의 SSH 공개 키를 등록해놓음
- 공격자가 피해자의 사용자 이름과 해당 공개 키 중 하나를 알고 있음(종종 https://github.com/
.keys 등에서 확인 가능)
근본 원인 (state leaks between SSH methods)
RFC 4252에 따르면 공개키 인증은 두 단계로 진행됩니다: 서버는 먼저 제공된 공개 키가 해당 사용자 이름에 대해 허용되는지 확인하고, 서명된 challenge/response가 완료된 후에야 사용자를 인증합니다. MINA SSHD에서는 PublickeyAuthenticator가 두 번 호출됩니다: 키 허용 시(아직 서명 없음)와 나중에 클라이언트가 서명을 반환한 후입니다.
Gitblit의 PublickeyAuthenticator는 첫 번째 사전 서명 호출에서 인증된 UserModel을 세션에 바인딩하고 true ("key acceptable")를 반환하면서 세션 컨텍스트를 변경했습니다. 이후 인증이 비밀번호로 대체되었을 때, PasswordAuthenticator는 변경된 세션 상태를 신뢰하여 비밀번호를 검증하지 않고 단축 경로로 처리해 true를 반환했습니다. 그 결과, 동일한 사용자에 대해 이전에 public‑key "acceptance"가 있으면 아무 비밀번호(빈 문자열 포함)나 허용되었습니다.
문제의 흐름(개요):
- 클라이언트가 사용자 이름 + 공개 키를 제시(아직 서명 없음)
- 서버가 해당 키가 사용자에 속함을 인식하고 조기에 사용자를 세션에 연결한 뒤 true ("acceptable")를 반환
- 클라이언트가 서명할 수 없음(개인 키 없음) → 인증이 비밀번호로 대체됨
- 비밀번호 인증이 세션에 이미 사용자가 존재하는 것을 보고 조건 없이 성공을 반환
단계별 익스플로잇
- 피해자의 사용자 이름과 공개 키 중 하나를 수집:
- GitHub는 공개 키를 https://github.com/
.keys 에 노출 - 공개 서버는 종종 authorized_keys를 노출함
- GitHub는 공개 키를 https://github.com/
- OpenSSH를 공개 키만 제시하도록 구성하여 서명 생성이 실패하게 만든다. 이렇게 하면 서버에서 public‑key 허용 경로를 트리거하면서도 서명이 없으므로 비밀번호로 대체되게 할 수 있다.
예시 SSH 클라이언트 설정(개인 키 없음):
# ~/.ssh/config
Host gitblit-target
HostName <host-or-ip>
User <victim-username>
PubkeyAuthentication yes
PreferredAuthentications publickey,password
IdentitiesOnly yes
IdentityFile ~/.ssh/victim.pub # public half only (no private key present)
연결한 후 비밀번호 프롬프트에서 Enter를 누르세요(또는 아무 문자열을 입력):
ssh gitblit-target
# or Git over SSH
GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://<victim-username>@<host>/<repo.git>
인증은 이전의 public‑key 단계가 세션을 인증된 사용자로 변형시켰기 때문에 성공하며, password auth가 그 상태를 잘못 신뢰합니다.
Note: If ControlMaster multiplexing is enabled in your SSH config, subsequent Git commands may reuse the authenticated connection, increasing impact.
영향
- 적어도 하나의 등록된 SSH public key를 가진 모든 Gitblit 사용자를 완전히 가장할 수 있음
- 피해자의 권한에 따른 저장소에 대한 읽기/쓰기 접근 (source exfiltration, unauthorized pushes, supply‑chain risks)
- 관리자 계정을 노린 경우 잠재적인 관리자 영향
- 순수 네트워크 기반 익스플로잇; 무차별 대입이나 private key 불필요
탐지 아이디어
- SSH 로그를 검토하여 publickey 시도 뒤에 빈 비밀번호 또는 매우 짧은 비밀번호로 성공한 password authentication이 이어지는 시퀀스를 찾으세요
- 다음과 같은 흐름을 찾아보세요: 지원되지 않거나 일치하지 않는 키 재료를 제시하는 publickey method 뒤에 동일한 사용자명에 대해 즉시 password 성공이 발생하는 경우
완화 조치
- Gitblit v1.10.0+로 업그레이드
- 업그레이드 전까지:
- Gitblit에서 Git over SSH를 비활성화하거나,
- SSH 서비스에 대한 네트워크 접근을 제한하고,
- 위에 설명된 의심스러운 패턴을 모니터링하세요
- 침해가 의심되면 영향받은 사용자 자격증명을 교체하세요
일반: abusing SSH auth method state‑leakage (MINA/OpenSSH‑based services)
패턴: 서버의 public‑key authenticator가 pre‑signature "key acceptable" 단계 동안 사용자/세션 상태를 변형시키고 다른 authenticators(예: password)가 그 상태를 신뢰하면, 다음 방법으로 인증을 우회할 수 있습니다:
- 타깃 사용자에 대한 합법적 public key 제시(개인 키 불필요)
- 클라이언트가 서명에 실패하도록 강제하여 서버가 password로 폴백하도록 함
- password authenticator가 leaked 상태에서 조기 종료(short‑circuits)하는 동안 아무 비밀번호나 제공
실용적인 팁:
- 대규모 public key 수집: https://github.com/
.keys, 조직 디렉터리, 팀 페이지, leaked authorized_keys 같은 일반 소스에서 public keys를 수집하세요 - 서명 실패 유도(클라이언트 측): IdentityFile을 .pub만 가리키도록 설정, IdentitiesOnly yes로 설정, PreferredAuthentications에 publickey 다음에 password가 포함되도록 유지
- MINA SSHD 통합 주의점:
- PublickeyAuthenticator.authenticate(...)는 post‑signature 검증 경로가 서명을 확인할 때까지 사용자/세션 상태를 첨부하면 안 됩니다
- PasswordAuthenticator.authenticate(...)는 이전의 불완전한 인증 방법 동안 변형된 어떤 상태에서도 성공을 유추하면 안 됩니다
Related protocol/design notes and literature:
- SSH userauth protocol: RFC 4252 (publickey method is a two‑stage process)
- Historical discussions on early acceptance oracles and auth races, e.g., CVE‑2016‑20012 disputes around OpenSSH behavior
References
- Gitblit CVE-2024-28080: SSH public‑key fallback to password authentication bypass (Silent Signal blog)
- Gitblit v1.10.0 release notes
- Apache MINA SSHD project
- PublickeyAuthenticator API
- RFC 4252: The Secure Shell (SSH) Authentication Protocol
tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:
HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
HackTricks Cloud