PoC для CVE-2026-44011: RCE в Craft CMS с аутентифицированным пользователем.
Только для авторизованного тестирования.
В рекомендации Craft CMS указаны уязвимые версии >=4.0.0, <4.17.12 и >=5.0.0, <5.9.18, а также указан precicom-vincent-tl как обнаруживший.
python -m pip install -r requirements.txt
python cve-2026-44011.py -b 'https://example.com' -u '<username' -p '<password>' -c '<command>'
Обязательные аргументы:
-b, --base-url: URL Craft, включая http:// или https://.-u, --username: Имя пользователя панели управления.-p, --password: Пароль панели управления.-c, --command: Команда для выполнения и захвата вывода.Необязательные аргументы:
-P, --cp-path: Путь панели управления (по умолчанию: /admin).-s, --site-id: ID сайта (по умолчанию: 1).-e, --element-type: Тип элемента (по умолчанию: craft\elements\Category).-f, --csrf-field: Имя поля CSRF при входе (по умолчанию: CRAFT_CSRF_TOKEN).-t, --timeout: Таймаут запроса и обратного вызова в секундах (по умолчанию: 15).-F, --force: Продолжать, когда версия Craft недоступна или вне диапазонов из рекомендации.-H, --callback-host: Адрес, доступный цели (по умолчанию определяется локальный адрес; переопределите его при работе через промежуточный узел).--listen-port: Порт прослушивания (по умолчанию: свободный порт, выбранный ОС; задайте фиксированный порт для перенаправления).В уязвимом действии поиска condition попадает из тела POST-запроса в создание объекта без очистки.
$conditionConfig = $this->request->getBodyParam('condition');
$condition = Craft::$app->getConditions()->createCondition($conditionConfig);
ElementCondition::setFieldLayouts() создаёт разметку из каждого переданного массива.
if (is_array($fieldLayout)) {
$fieldLayout['type'] = $this->elementType;
return $fieldsService->createLayout($fieldLayout);
}
Полезная нагрузка из рекомендации присоединяет Yii AttributeTypecastBehavior с ключом as и связывает событие с on *. Поведение достигает Psy\Readline\Hoa\ConsoleProcessus::execute через приведение типов к вызываемому в Yii.
condition.fieldLayouts[]
-> FieldLayout behavior + event
-> AttributeTypecastBehavior::typecastValue()
-> call_user_func()
-> ConsoleProcessus::execute()
Исправленный контроллер применяет Component::cleanseConfig() к условию перед созданием объекта.
ConsoleProcessus::execute() по умолчанию экранирует метасимволы оболочки. PoC отдаёт временный скрипт для запуска -c, получает его вывод на встроенном HTTP-слушателе и после этого останавливает слушатель. Используйте -H, если цель не может достичь выведенного адреса.sh, curl и mktemp на цели.python -m unittest discover -s tests -v.