Аутентифицированная загрузка произвольных файлов, приводящая к удалённому выполнению кода. Технический анализ и контролируемое воспроизведение CVE-2026-38526 в Webkul Krayin CRM 2.2.x.
Аутентифицированная загрузка произвольных файлов, приводящая к удалённому выполнению кода. Технический анализ и контролируемое воспроизведение CVE-2026-38526 в Webkul Krayin CRM 2.2.x.
CVE-2026-38526 — это уязвимость аутентифицированной загрузки произвольных файлов, затрагивающая Webkul Krayin CRM 2.2.x.
Уязвимая функциональность доступна через конечную точку загрузки TinyMCE приложения:
POST /admin/tinymce/upload
Приложение недостаточно ограничивает тип файлов, которые можно загрузить. Аутентифицированный пользователь может отправить файл с исполняемым на стороне сервера расширением, например .php. Приложение сохраняет загруженный файл и возвращает URL-адрес, по которому он доступен.
Когда конфигурация развёртывания допускает выполнение PHP из места загрузки, загруженный файл впоследствии может быть запрошен через веб-сервер, что приводит к удалённому выполнению кода в контексте процесса веб-приложения.
Опубликованная запись CVE оценивает уязвимость как CVSS 3.1: 9.9 (Critical).
Этот репозиторий содержит мой собственный технический анализ и контролируемое воспроизведение уязвимости.
Уязвимость уже была публично раскрыта под идентификатором CVE-2026-38526. Данная работа не претендует на открытие уязвимости. Целью этого исследования было понять уязвимую реализацию, воспроизвести путь эксплуатации в контролируемой среде и изучить условия, превращающие проблему загрузки файлов в удалённое выполнение кода.
Уязвимость также использовалась в машине Hack The Box GCSB 2026 Nexus, что предоставило практическую среду для изучения этой проблемы.
Продукт: Webkul Krayin CRM Затронутые версии: 2.2.x Уязвимость: Загрузка произвольных файлов Результирующее воздействие: Удалённое выполнение кода Аутентификация: Требуется Вектор атаки: Сеть CWE: CWE-434 — Неограниченная загрузка файлов опасного типа CVSS: 9.9 Critical CVE: CVE-2026-38526
Уязвимая функциональность обрабатывается:
/admin/tinymce/upload
Конечная точка принимает загруженный файл через параметр file. Соответствующая логика приложения формирует имя сохраняемого файла из исходного имени файла и сохраняет его исходное расширение.

Такое поведение важно, поскольку приложение не просто принимает загруженный объект; оно сохраняет контролируемое злоумышленником исполняемое расширение и делает результирующий объект доступным через механизм хранения приложения.
Основная проблема — недостаточная проверка загружаемых файлов на стороне сервера.
Приложение использует исходное расширение, предоставленное клиентом, при формировании имени сохраняемого файла. Отсутствует достаточно строгий список разрешённых типов, предотвращающий попадание исполняемых типов файлов на уровень хранения.
Соответствующий поток:

Использование сгенерированного имени файла не решает основную проблему.
Например, преобразование shell.php в сгенерированное имя файла, такое как .php, не делает загруженный файл безопасным, если сервер продолжает интерпретировать файлы .php как исполняемый PHP-код.
Неограниченная загрузка не означает автоматически удалённое выполнение кода.
Путь выполнения зависит от обработки загруженного файла сервером.
В уязвимом сценарии развёртывания цепочка становится следующей:
