Docker-Validierungslabor und Python-PoC für CVE-2026-89274, der beliebige Shortcode-Ausführung in WP Recipe Maker <= 10.8.1 über rating-comment reviewBody nachweist.
Sicherheitsforschungsmaterial zur Reproduktion und Validierung von CVE-2026-89274: WP Recipe Maker <= 10.8.1 führt beliebige registrierte WordPress-Shortcodes innerhalb von Rezept-JSON-LD-Metadaten aus, die über einen genehmigten Bewertungskommentar eingeschleust werden.
do_shortcode_safe)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94Nur auf Systemen verwenden, die Sie besitzen oder für deren Test Sie ausdrücklich autorisiert sind. Der PoC veröffentlicht einen Bewertungskommentar, der einen im Lab registrierten Marker-Shortcode enthält. Es wird kein destruktiver Shortcode verwendet und nichts auf die Festplatte geschrieben.
Status: im bereitgestellten Lab nachgewiesen.
WP Recipe Maker 10.8.1 (WordPress 7.1.2, Standard-Rezeptkarten-Modell):
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)
Dies demonstriert die serverseitige Ausführung eines beliebigen registrierten Shortcodes mit Ausgabe, die in die Seitenmetadaten eingebettet und jedem Besucher offengelegt wird. Es demonstriert kein RCE; die Auswirkung hängt davon ab, welche Shortcodes auf dem Ziel registriert sind (Post-/Meta- Offenlegung, plugin-bereitgestellte Shortcodes mit Nebenwirkungen).
WPRM_Metadata::sanitize_metadata() bereinigt rekursiv jedes skalare Feld
des strukturierten Metadaten-Arrays des Rezepts:
// 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() führt den Shortcode zuerst aus; der strip_shortcodes()-
Wrapper entfernt nur Tags aus der bereits ausgeführten Ausgabe. Eines der
Felder, reviewBody, wird wörtlich aus comment_content genehmigter
Kommentare befüllt, die einen wprm-comment-rating-Meta-Wert tragen
(class-wprm-metadata.php:1016), abgefragt gegen den Parent-Post des
Rezepts (post_id => $recipe->parent_post_id(), Zeile 973) - der Beitrag
oder die Seite, in die die Rezeptkarte eingebettet ist.
Der 10.8.2-Ersatz, WPRM_Instacart::do_shortcode_safe()
(class-wprm-instacart.php:501), behält nur den inneren Inhalt und führt
nichts aus.
[wprm-recipe] einbettet)./wp-comments-post.php mit dem Shortcode im
Text und wprm-comment-rating=5.review-Array auf, und
sanitize_metadata() führt den Shortcode aus. Seine Ausgabe ersetzt den
Kommentartext innerhalb von reviewBody, sichtbar für jeden Besucher.Voraussetzungen: Docker mit Compose v2, Python 3.10+ auf dem Host.
./lab verify
Baut das 10.8.1-Lab, verlangt, dass der Marker ausgelöst wird, baut dann das
10.8.2-Lab und verlangt dessen Abwesenheit. Alles mit ./lab reset
entfernen.
Verwundbare Kontrolle:
[!!!] SHORTCODE EXECUTION CONFIRMED
evidence: 'CVE89274-SHORTCODE-FIRED' present in the rendered recipe page
context : ..."reviewBody":"CVE89274-SHORTCODE-FIRED","author":...
RESULT: VULNERABLE CONTROL CONFIRMED
Gepatchte Kontrolle:
[=] shortcode text present but NOT executed: output was stripped
RESULT: PATCHED CONTROL CONFIRMED
Ein Marker auf der Seite, der nur innerhalb des angezeigten Kommentars (Rohtext) erscheint, wird nicht als Beweis akzeptiert; der Marker muss als ausgeführte Ausgabe in den Metadaten erscheinen.
./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
PoC manuell ausführen (Loopback-Standard; autorisierte externe Ziele benötigen die explizite Überschreibung):
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]
Das nuclei-Template (nuclei/cve-2026-89274.yaml) ist nur ein
Versions-Screen (readme.txt stable tag <= 10.8.1). Die Verhaltenskette
erfordert das Absenden eines Kommentars plus einen Genehmigungsübergang, was
sich in nuclei nicht praktikabel ausdrücken lässt; der Python-PoC führt den
vollständigen Ablauf durch.
| Version | Bewertung |
|---|---|
| WP Recipe Maker 10.8.1 | Shortcode-Ausführung Ende-zu-Ende reproduziert |
| WP Recipe Maker 10.8.2 | Gepatchte Negativkontrolle reproduziert |
| WP Recipe Maker <= 10.8.0 | Laut Advisory betroffen; nicht einzeln getestet |
.
├── .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
Nicht eingecheckt: assets/ (Plugin-Zips), .lab-state, __pycache__/.
| Behauptung | Status |
|---|---|
| Shortcode-Ausführung über Bewertungskommentar reviewBody | Nachgewiesen (10.8.1) |
| Ausführungsausgabe im gerenderten JSON-LD offengelegt | Nachgewiesen |
| Gepatchte Negativkontrolle (10.8.2) | Nachgewiesen |
| Standardkonfiguration (privater Rezept-CPT + Parent-Post) | Nachgewiesen (dies ist die Lab-Topologie) |
| Öffentliche Rezept-Post-Type-Konfiguration | Nicht getestet |
| WPRMs eigener Rating-REST-Endpunkt als alternativer Einstieg | Nicht getestet |
| Auswirkung über die Ausgabe registrierter Shortcodes hinaus (RCE) | Nicht behauptet |
Führen Sie dieses Repository nur auf Systemen aus, die Sie besitzen oder für
deren Test Sie ausdrücklich autorisiert sind. Der Lab-Treiber lehnt andere
Varianten als vulnerable/patched ab, der PoC lehnt Nicht-Loopback-Ziele
ab, sofern nicht --allow-authorized-non-loopback angegeben wird, und der
Compose-Port ist an 127.0.0.1 gebunden.
Siehe SECURITY.md für den Umgang mit Offenlegungen. Dieses Repository enthält keine Produktionsziele, Kundendaten, Zugriffstoken oder Nachweise aus realen Systemen.
MIT - siehe LICENSE.