
CVE-2026-27621 - В ядре TypiCMS присутствует хранимая XSS-уязвимость (межсайтовый скриптинг) через загрузку SVG-файлов.
| Поле | Подробности |
|---|
| ID CVE | CVE-2026-27621 |
| Серьёзность | СРЕДНЯЯ |
| Уведомление | Просмотреть уведомление |
| Обнаружил | Лукаш Рыбак |
В модуле загрузки файлов TypiCMS существует хранимая межсайтовая уязвимость (XSS). Приложение позволяет пользователям с правами на загрузку файлов загружать SVG-файлы. Несмотря на проверку MIME-типа, содержимое SVG-файла не санитизируется. Злоумышленник может загрузить специально созданный SVG-файл, содержащий вредоносный код JavaScript. Когда другой пользователь (например, администратор) просматривает или открывает этот файл через приложение, скрипт выполняется в его браузере, что приводит к компрометации сессии этого пользователя.
Проблема усугубляется ошибкой в логике разбора SVG, которая может вызвать ошибку 500, если загруженный SVG не содержит атрибут viewBox. Однако это не устраняет уязвимость XSS, поскольку злоумышленник может легко включить корректный атрибут viewBox в свою вредоносную полезную нагрузку.
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php и TypiCMS\Modules\Core\Services\FileUploader.php.Уязвимость обусловлена двумя основными факторами:
FileFormRequest явно включает svg в белый список разрешённых MIME-типов для загрузки.FileUploader сохраняет SVG-файл на сервер без разбора и санитизации его содержимого для удаления потенциально опасных элементов, таких как теги <script> или обработчики событий on*.Когда для диска файловой системы по умолчанию задано значение public, загруженный SVG-файл сохраняется в общедоступный каталог, что делает тривиальным доступ к файлу по прямой ссылке и запуск XSS-полезной нагрузки.
Создайте вредоносный SVG-файл:
Создайте файл с именем malicious.svg со следующим содержимым. Атрибут viewBox включён, чтобы обойти ошибку разбора в приложении.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<script>
// A simple PoC to demonstrate the vulnerability
alert('XSS in TypiCMS! Your session cookie is: ' + document.cookie);
</script>
<text x="10" y="50">If you see this, the script has run.</text>
</svg>
Загрузите вредоносный файл:
/admin/files).malicious.svg. Приложение примет файл и сохранит его.
http://<your-site>/storage/files/malicious.svg.Успешная эксплуатация этой уязвимости позволяет злоумышленнику выполнять произвольный код JavaScript в контексте браузера жертвы. Хотя использование флага HttpOnly для сессионных cookie предотвращает прямое похищение идентификатора сессии через document.cookie, злоумышленник всё равно может добиться полной компрометации учётной записи жертвы, выполняя действия от её имени.
Воздействие включает:
Захват учётной записи через подделку действий: скрипт злоумышленника может отправлять аутентифицированные запросы к API приложения из браузера жертвы. Это позволяет злоумышленнику выполнять любые действия, на которые уполномочена жертва, например:
Раскрытие конфиденциальной информации: скрипт может читать содержимое любой страницы, которую жертва просматривает в панели администратора. Это включает списки пользователей (с именами и адресами электронной почты), приватные настройки приложения и другие конфиденциальные данные, которые затем могут быть переданы на управляемый злоумышленником сервер.
Фишинг и социальная инженерия: скрипт может манипулировать интерфейсом панели администратора, отображая поддельные формы входа, чтобы обманом заставить пользователя повторно ввести свои учётные данные, или перенаправлять его на вредоносный веб-сайт.
Перехват нажатий клавиш: скрипт может перехватывать любую информацию, которую жертва вводит в формы на скомпрометированной странице.
Поскольку злоумышленник может выполнять любые действия в роли аутентифицированного администратора, эта уязвимость фактически приводит к полной компрометации приложения, даже без прямого доступа к сессионному cookie. Риск — высокий.
Рекомендуется применить подход эшелонированной защиты для смягчения этой уязвимости.
Основное исправление: санитизация содержимого SVG:
Наиболее надёжное решение — санитизировать SVG-файлы при загрузке. Перед сохранением файла его следует разобрать, чтобы удалить все потенциально опасные элементы, включая теги <script>, <style>, <foreignObject> и все атрибуты событий on*. Это можно сделать с помощью специальной библиотеки санитизации SVG.
Дополнительное исправление: отключение загрузки SVG:
Если загрузка SVG не является критически важной функцией приложения, самое простое и безопасное решение — полностью отключить её. Это можно сделать, удалив 'svg' из списка разрешённых MIME-типов в файле TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php.
// In FileFormRequest.php
// BEFORE:
$fileRule = 'mimes:jpeg,gif,png,...,svg,...|max:...';
// AFTER:
$fileRule = 'mimes:jpeg,gif,png,...,pdf,...|max:...'; // Removed 'svg'
Усиление защиты — Content-Security-Policy (CSP): Внедрите строгий заголовок Content-Security-Policy (CSP) для приложения. Правильно настроенный CSP может предотвратить выполнение встроенных скриптов, что смягчило бы воздействие этой XSS-уязвимости.
Усиление защиты — размещение пользовательского контента на отдельном домене: Размещайте все загруженные пользователями файлы на отдельном домене без cookie. Это высокоэффективная мера безопасности, которая изолирует пользовательский контент от основного приложения, не позволяя скриптам получать доступ к сессионным cookie или взаимодействовать с DOM приложения.
Этот CVE был раскрыт ответственно в соответствии с практиками скоординированного раскрытия уязвимостей. Информация, представленная здесь, предназначена только для образовательных и защитных целей.