Il PoC di CVE-2026-44011: RCE in Craft CMS con un utente autenticato.
Solo per test autorizzati.
L'advisory di Craft CMS elenca >=4.0.0, <4.17.12 e >=5.0.0, <5.9.18 come versioni interessate, e attribuisce a precicom-vincent-tl il ruolo di scopritore.
python -m pip install -r requirements.txt
python cve-2026-44011.py -b 'https://example.com' -u '<username' -p '<password>' -c '<command>'
Argomenti obbligatori:
-b, --base-url: URL di Craft, incluso http:// o https://.-u, --username: Nome utente del pannello di controllo.-p, --password: Password del pannello di controllo.-c, --command: Comando da eseguire e di cui catturare l'output.Argomenti opzionali:
-P, --cp-path: Percorso del pannello di controllo (predefinito: /admin).-s, --site-id: ID del sito (predefinito: 1).-e, --element-type: Tipo di elemento (predefinito: craft\elements\Category).-f, --csrf-field: Nome del campo CSRF di login (predefinito: CRAFT_CSRF_TOKEN).-t, --timeout: Timeout per richieste e callback in secondi (predefinito: 15).-F, --force: Continua quando la versione di Craft non è disponibile o è al di fuori degli intervalli dell'advisory.-H, --callback-host: Indirizzo raggiungibile dal target (per impostazione predefinita viene dedotto l'indirizzo locale; sovrascrivilo in caso di pivot).--listen-port: Porta del listener (predefinita: una porta libera selezionata dal sistema operativo; imposta una porta fissa per l'inoltro).Nell'azione di ricerca vulnerabile, condition passa dal corpo della POST alla creazione dell'oggetto senza sanificazione.
$conditionConfig = $this->request->getBodyParam('condition');
$condition = Craft::$app->getConditions()->createCondition($conditionConfig);
ElementCondition::setFieldLayouts() costruisce un layout da ciascun array fornito.
if (is_array($fieldLayout)) {
$fieldLayout['type'] = $this->elementType;
return $fieldsService->createLayout($fieldLayout);
}
Il payload dell'advisory collega l'AttributeTypecastBehavior di Yii con una chiave as e collega un evento con on *. Il behavior raggiunge Psy\Readline\Hoa\ConsoleProcessus::execute tramite il typecast callable di Yii.
condition.fieldLayouts[]
-> FieldLayout behavior + event
-> AttributeTypecastBehavior::typecastValue()
-> call_user_func()
-> ConsoleProcessus::execute()
Il controller corretto applica Component::cleanseConfig() alla condizione prima della creazione dell'oggetto.
ConsoleProcessus::execute() di Psy effettua l'escaping dei metacaratteri della shell per impostazione predefinita. Il PoC serve uno script temporaneo per eseguire -c, riceve il suo output su un listener HTTP integrato e arresta il listener in seguito. Usa -H se il target non riesce a raggiungere l'indirizzo dedotto.sh, curl e mktemp sul target.python -m unittest discover -s tests -v.