Laboratorio di validazione Docker e PoC Python per CVE-2026-89274, che dimostra l'esecuzione arbitraria di shortcode in WP Recipe Maker <= 10.8.1 tramite rating-comment reviewBody.
Materiale di ricerca sulla sicurezza per riprodurre e validare CVE-2026-89274: WP Recipe Maker <= 10.8.1 esegue shortcode WordPress arbitrari registrati all'interno dei metadati JSON-LD della ricetta, inseriti tramite un commento di valutazione approvato.
do_shortcode_safe di solo stripping)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94Utilizzare solo su sistemi di propria proprietà o per i quali si è esplicitamente autorizzati a eseguire test. Il PoC pubblica un commento di valutazione contenente uno shortcode marcatore registrato nel laboratorio. Non viene utilizzato alcuno shortcode distruttivo e nulla viene scritto su disco.
Stato: dimostrato nel laboratorio fornito.
WP Recipe Maker 10.8.1 (WordPress 7.1.2, modello di scheda ricetta predefinito):
comment posted : "[cve89274]" + wprm-comment-rating=5 on the recipe's parent post
result : JSON-LD on the rendered page contains
"reviewBody":"CVE89274-SHORTCODE-FIRED"
(marker shortcode executed server-side at render time)
10.8.2 : shortcode stripped, marker absent (patched negative control)
Ciò dimostra l'esecuzione lato server di uno shortcode arbitrario registrato con output incorporato nei metadati della pagina, divulgato a ogni visitatore. Non dimostra RCE; l'impatto dipende da quali shortcode sono registrati sul target (esposizione di post/meta, shortcode forniti da plugin con effetti collaterali).
WPRM_Metadata::sanitize_metadata() sanifica ricorsivamente ogni campo scalare
dell'array di metadati strutturati della ricetta:
// includes/public/class-wprm-metadata.php:553, WP Recipe Maker 10.8.1
$sanitized = strip_shortcodes( wp_strip_all_tags( do_shortcode( $metadata ) ) );
// 10.8.2
$sanitized = strip_shortcodes( wp_strip_all_tags( WPRM_Instacart::do_shortcode_safe( $metadata ) ) );
do_shortcode() esegue prima lo shortcode; il wrapper strip_shortcodes()
rimuove solo i tag dall'output già eseguito. Uno dei
campi, reviewBody, viene popolato testualmente da comment_content dei commenti
approvati che portano un valore meta wprm-comment-rating
(class-wprm-metadata.php:1016), interrogato rispetto al post genitore della ricetta
(post_id => $recipe->parent_post_id(), riga 973) - il post o la pagina
in cui è incorporata la scheda della ricetta.
La sostituzione in 10.8.2, WPRM_Instacart::do_shortcode_safe()
(class-wprm-instacart.php:501), mantiene solo il contenuto interno e non esegue
nulla.
[wprm-recipe])./wp-comments-post.php con lo shortcode nel corpo
e wprm-comment-rating=5.review del JSON-LD, e
sanitize_metadata() esegue lo shortcode. Il suo output sostituisce il
testo del commento all'interno di reviewBody, visibile a ogni visitatore.Requisiti: Docker con Compose v2, Python 3.10+ sull'host.
./lab verify
Costruisce il laboratorio 10.8.1, richiede che il marcatore scatti, poi costruisce il laboratorio
10.8.2 e ne richiede l'assenza. Rimuovere tutto con ./lab reset.
Controllo vulnerabile:
[!!!] SHORTCODE EXECUTION CONFIRMED
evidence: 'CVE89274-SHORTCODE-FIRED' present in the rendered recipe page
context : ..."reviewBody":"CVE89274-SHORTCODE-FIRED","author":...
RESULT: VULNERABLE CONTROL CONFIRMED
Controllo corretto:
[=] shortcode text present but NOT executed: output was stripped
RESULT: PATCHED CONTROL CONFIRMED
Un marcatore nella pagina solo all'interno del commento visualizzato (testo grezzo) non è accettato come prova; il marcatore deve apparire come output eseguito nei metadati.
./lab start vulnerable # 10.8.1 lab on http://127.0.0.1:9482
./lab test # assert marker fires
./lab start patched # 10.8.2 lab
./lab test # assert absence
./lab status
./lab reset
Eseguire il PoC manualmente (loopback predefinito; i target esterni autorizzati richiedono l'override esplicito):
python3 poc/poc_cve_2026_89274.py --url http://127.0.0.1:9482 --post-id 5
python3 poc/poc_cve_2026_89274.py --url https://target.example \
--allow-authorized-non-loopback [--insecure]
Il template nuclei (nuclei/cve-2026-89274.yaml) è solo uno screening di versione
(readme.txt stable tag <= 10.8.1). La catena comportamentale richiede l'invio del commento
più una transizione di approvazione, cosa non pratica da esprimere in
nuclei; il PoC Python esegue il flusso completo.
| Versione | Valutazione |
|---|---|
| WP Recipe Maker 10.8.1 | Esecuzione dello shortcode riprodotta end to end |
| WP Recipe Maker 10.8.2 | Controllo negativo corretto riprodotto |
| WP Recipe Maker <= 10.8.0 | Affetto secondo l'advisory; non testato individualmente |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-89274.yaml
└── poc/
└── poc_cve_2026_89274.py
Non committato: assets/ (zip dei plugin), .lab-state, __pycache__/.
| Affermazione | Stato |
|---|---|
| Esecuzione dello shortcode tramite reviewBody del commento di valutazione | Dimostrato (10.8.1) |
| Output dell'esecuzione divulgato nel JSON-LD renderizzato | Dimostrato |
| Controllo negativo corretto (10.8.2) | Dimostrato |
| Configurazione predefinita (CPT ricetta privata + post genitore) | Dimostrato (questa è la topologia del laboratorio) |
| Configurazione con tipo di post ricetta pubblico | Non testato |
| Endpoint REST di valutazione di WPRM come ingresso alternativo | Non testato |
| Impatto oltre l'output dello shortcode registrato (RCE) | Non affermato |
Eseguire questo repository solo su sistemi di propria proprietà o per i quali si è esplicitamente autorizzati a
eseguire test. Il driver del laboratorio rifiuta varianti diverse da vulnerable/patched, il
PoC rifiuta target non loopback a meno che non venga fornito --allow-authorized-non-loopback,
e la porta di Compose è vincolata a 127.0.0.1.
Vedere SECURITY.md per la gestione della divulgazione. Questo repository non include target di produzione, dati dei clienti, token di accesso o evidenze da sistemi reali.
MIT - vedere LICENSE.