Der PoC von CVE-2026-44011: Craft CMS RCE mit einem authentifizierten Benutzer.
Nur für autorisierte Tests.
Die Craft CMS Advisory listet >=4.0.0, <4.17.12 und >=5.0.0, <5.9.18 als betroffen auf und nennt precicom-vincent-tl als Finder.
python -m pip install -r requirements.txt
python cve-2026-44011.py -b 'https://example.com' -u '<username' -p '<password>' -c '<command>'
Erforderliche Argumente:
-b, --base-url: Craft-URL, einschließlich http:// oder https://.-u, --username: Benutzername für das Control Panel.-p, --password: Passwort für das Control Panel.-c, --command: Auszuführender Befehl, dessen Ausgabe erfasst werden soll.Optionale Argumente:
-P, --cp-path: Pfad zum Control Panel (Standard: /admin).-s, --site-id: Site-ID (Standard: 1).-e, --element-type: Elementtyp (Standard: craft\elements\Category).-f, --csrf-field: Name des Login-CSRF-Felds (Standard: CRAFT_CSRF_TOKEN).-t, --timeout: Timeout für Anfragen und Callbacks in Sekunden (Standard: 15).-F, --force: Fortfahren, wenn die Craft-Version nicht verfügbar oder außerhalb der Advisory-Bereiche liegt.-H, --callback-host: Adresse, die das Ziel erreichen kann (standardmäßig wird die lokale Adresse abgeleitet; hinter einem Pivot überschreiben).--listen-port: Listener-Port (Standard: ein vom Betriebssystem ausgewählter freier Port; für Weiterleitung einen festen Port festlegen).In der verwundbaren Suchaktion gelangt condition aus dem POST-Body ohne Bereinigung in die Objekterstellung.
$conditionConfig = $this->request->getBodyParam('condition');
$condition = Craft::$app->getConditions()->createCondition($conditionConfig);
ElementCondition::setFieldLayouts() konstruiert aus jedem übergebenen Array ein Layout.
if (is_array($fieldLayout)) {
$fieldLayout['type'] = $this->elementType;
return $fieldsService->createLayout($fieldLayout);
}
Die Advisory-Payload hängt Yii's AttributeTypecastBehavior mit einem as-Schlüssel an und verdrahtet ein Event mit on *. Das Behavior erreicht Psy\Readline\Hoa\ConsoleProcessus::execute über Yii's Callable-Typecast.
condition.fieldLayouts[]
-> FieldLayout behavior + event
-> AttributeTypecastBehavior::typecastValue()
-> call_user_func()
-> ConsoleProcessus::execute()
Der gefixte Controller wendet Component::cleanseConfig() auf die Bedingung vor der Objekterstellung an.
ConsoleProcessus::execute() maskiert standardmäßig Shell-Metazeichen. Der PoC stellt ein temporäres Skript bereit, um -c auszuführen, empfängt dessen Ausgabe über einen integrierten HTTP-Listener und fährt den Listener anschließend herunter. Verwenden Sie -H, wenn das Ziel die abgeleitete Adresse nicht erreichen kann.sh, curl und mktemp auf dem Ziel.python -m unittest discover -s tests -v.