Laboratori Docker + scanner difensivo per la RCE remote-class-load di fastjson. fastjson 1.2.66-1.2.83: sonda di risorse @JSONType (CVE-2026-16723). fastjson2 2.0.57: l'@type dell'attaccante raggiunge loadClass con autoType DISABLED tramite tipi polimorfici (@JSONType(seeAlso) / Jackson @JsonSubTypes). Payload con soli marcatori; controlli safeMode + JDK17.
@JSONType remote-JAR/FD-chain di FastjsonQuesto repository conserva ora due distinte linee di ricerca su Fastjson:
modern-fd/ è la ricostruzione consigliata, solo-marker, della
catena remote-JAR/file-descriptor in un singolo corpo di richiesta di Fastjson
1.2.83 su Spring Boot 3, Tomcat embedded standard e JDK 17. Usa il sink letterale
con DTO fisso JSON.parseObject(body, BoundEnvelope.class) con AutoType disabilitato.scanner/ contiene rilevamento passivo di richieste/log, inventario
statico degli artefatti e una sonda di raggiungibilità non eseguente.Il bug:
ParserConfig.checkAutoTypesonda ogni valore@typealla ricerca dell'annotazione@JSONTypeeseguendogetResourceAsStream(typeName.replace('.','/') + ".class"). Sulle combinazioni Linux/JDK moderne, una sonda remotajar:httppuò lasciare il JAR memorizzato nella cache dietro un descrittore aperto; successive sondejar:file:/proc/self/fd/Nnello stesso corpo possono riaprirlo con nomi di classe validi e inizializzare una classe annotata. La composizione esatta di 1.2.83 funziona con AutoType disabilitato e attraverso un DTO fisso contenenteList<Object>. Il solo binding non è quindi una mitigazione. Analisi completa:docs/MECHANISM.md.
La review completa dell'intero progetto ha coperto 2.041 righe tra callable e static-initializer in tutti i 193 file Java di produzione di Fastjson 1.2.83. La tabella sottostante dà priorità ai risultati a maggiore impatto; non è un'affermazione che ogni deployment di Fastjson sia vulnerabile. Questo repository riproduce direttamente F105. Le voci rimanenti riassumono una review separata del sorgente sigillato e prove di laboratorio limitate.
| Priorità | Rilevamento | Risultato provato | Confine importante |
|---|---|---|---|
| 1 | F105 — esecuzione di bytecode @JSONType remoto | Inizializzazione di classi fornite dall'attaccante attraverso loader Spring Boot compatibili, inclusa la rotta diretta JDK 8 e la continuazione /proc/self/fd/N con JAR trattenuto su Linux/JDK 17 | Richiede un veicolo @type raggiungibile dal parser, un loader Boot/TCCL compatibile, egress, SafeMode/IgnoreAutoType disattivati e un JAR esatto dell'attaccante. La rotta moderna con DTO fisso richiede inoltre una corsia di valori generici (il lab usa List<Object>), procfs Linux, un descrittore trattenuto e l'allineamento esatto dei nomi; non è universale su ogni JDK, loader o OS |
| 2 | F1/F45 — esecuzione comandi TemplatesImpl | Esecuzione di comandi marker attraverso l'API con DTO fisso, inclusa una proprietà del corpo ignorata | Richiede una politica server indebolita: ammissione delle classi, AutoType e popolamento di campi privati o percorsi equivalenti; le impostazioni predefinite inviolate la bloccano |
| 3 | F70/C016 — buffering illimitato ed espansione GZIP | I percorsi byte/InputStream tipizzati e DTO annotati espandono o bufferizzano senza limite di output; riprodotto OOME Java con heap vincolata | Richiedono raggiungibilità dell'endpoint/schema e dei byte dell'attaccante; un'interruzione a livello di produzione non è stata stabilita |
| 4 | F18/C089 — esaurimento dello stack del thread del parser | Valori oggetto ordinari annidati profondamente possono produrre StackOverflowError con parsing predefinito | Impatto sulla disponibilità del thread di richiesta; non un crash invariante della JVM o a livello di servizio |
| 5 | F120/C162 — SSRF HTTP con schema fisso/caricamento risorse locali | JEditorPane/JTextPane.page controllato dal corpo esegue richieste HTTP e può caricare contenuto file: limitato nello stato del Document | Richiede che l'applicazione dichiari il tipo Swing; nessuna esfiltrazione automatica della risposta o RCE provata |
| 6 | F118/C160 — fallimento autorizzazione/integrità dati per collisione di hash | Una distinta collisione Unicode FNV-1a-64 può legarsi a una costante enum privilegiata o instradare la mutazione JSONPath verso il setter sbagliato del bean | Richiede una collisione utilizzabile e fiducia a valle o un'operazione di mutazione JSONPath esposta; nessuna ammissione di classi o RCE |
| 7 | F121/C163 — raggiungibilità JNDI fissa di JdbcRowSet | L'ordine esatto dei setter ha causato una connessione JNDI/LDAP in uscita selezionata dal corpo | Le prove si fermano a una connessione: nessuna risposta di naming, object factory, caricamento bytecode o RCE |
| 8 | F2/F45 — risoluzione DNS predefinita | La risoluzione di hostname controllata dall'attaccante funziona con configurazione predefinita e attraverso una proprietà ignorata del DTO fisso | Solo interazione DNS/OOB, non SSRF HTTP generico o RCE |
Vedi findings/FINDINGS.md per etichette di validazione,
prerequisiti, risultati di livello inferiore, priorità di remediation e confini negativi
espliciti.
Questo repository è per istruzione, ricerca difensiva e test autorizzati di sistemi
che possiedi o per cui hai esplicito permesso di test. La pubblicazione dell'host, quando
supportata per la rete interna del lab moderno, è richiesta solo su 127.0.0.1; i suoi
script eseguono il test interamente all'interno di quella rete isolata. Il lab moderno non
ha alcuna primitiva di esecuzione di processi e imposta solo un marker fisso in-JVM.
Il lab legacy JDK 8 esegue effettivamente id e scrive il suo output in /tmp/PWNED;
mantienilo isolato. Non puntare l'exploit legacy o la sonda attiva verso sistemi non autorizzati.
La directory scanner/ include quattro strumenti Python 3 senza dipendenze
(nessuna installazione pip).
fjdetect.py — ispezione passiva di corpi di richiesta JSON decodificati o
log JSON strutturati per semi remote-JAR e sequenze /proc/self/fd o /dev/fd.fjscan_static.py — inventario di jar/war/ear per la combinazione vulnerabile
(contenuto verificato, 1.2.83 verificato sui metadati × contenuto effettivo delle classi
del loader Spring Boot). Le release 1.2.48–1.2.82 con sonda e i candidati solo-metadati/nome-file
vengono riportate separatamente per la review. Adatto a CI-gate (exit 2 su EXPOSED).fjscan_probe.py — controllo di raggiungibilità attivo e sicuro: invia il @type a un canary
che controlli tu (listener integrato oppure Burp Collaborator / interactsh) e correla il
callback di fetch della risorsa. Il suo listener integrato restituisce un 404 vuoto; configura
i listener esterni in modo equivalente. Un callback non prova il caricamento di classi o la RCE.fjpayload.py — genera corpi di fetch di risorse remote per test manuali;
usa solo un listener vuoto/404 quando l'esecuzione non è prevista.# 1) ispezione passiva richieste/log
python3 scanner/fjdetect.py --ndjson gateway.jsonl
# 2) inventario artefatti di build / immagini estratte (parallelo)
python3 scanner/fjscan_static.py /path/to/artifacts --threads 16