Добавить в корзинуПозвонить
Найти в Дзене

Кошмар разработчика: уязвимость в Thymeleaf CVE-2026-40478 — как непечатный символ ставит под угрозу сервер

Представьте: приложение на Spring Boot с Thymeleaf работает стабильно. И вдруг через обычную форму ввода злоумышленник передаёт специально сформированную строку, которая может инициировать запись файлов на сервер. Это не гипотетическая угроза. По данным открытых источников, в одном из российских финансовых учреждений был зафиксирован инцидент, связанный с шаблоном подтверждения email. Злоумышленник использовал непечатный символ (табуляцию) вместо пробела, что позволило обойти механизмы песочницы. В ряде подобных случаев это может привести к загрузке вредоносного кода и получению удалённого доступа. Разберём, как работает этот вектор атаки, почему он актуален для значительной части компаний на Spring, и какие шаги помогут снизить риски. Разработчик включает песочницу в Thymeleaf — и полагает, что приложение защищено. Однако, как показывает практика, отдельные непечатные символы могут обходить предусмотренные проверки. Это напоминает ситуацию, когда замок закрыт, но определённое воздей
Оглавление
Технические детали (табуляция, CWE-917/1336)
Технические детали (табуляция, CWE-917/1336)

Представьте: приложение на Spring Boot с Thymeleaf работает стабильно. И вдруг через обычную форму ввода злоумышленник передаёт специально сформированную строку, которая может инициировать запись файлов на сервер.

Это не гипотетическая угроза.

Речь об уязвимости CVE-2026-40478.

По данным открытых источников, в одном из российских финансовых учреждений был зафиксирован инцидент, связанный с шаблоном подтверждения email. Злоумышленник использовал непечатный символ (табуляцию) вместо пробела, что позволило обойти механизмы песочницы. В ряде подобных случаев это может привести к загрузке вредоносного кода и получению удалённого доступа. Разберём, как работает этот вектор атаки, почему он актуален для значительной части компаний на Spring, и какие шаги помогут снизить риски.

Современные фреймворки создают иллюзию безопасности «из коробки».

Разработчик включает песочницу в Thymeleaf — и полагает, что приложение защищено. Однако, как показывает практика, отдельные непечатные символы могут обходить предусмотренные проверки. Это напоминает ситуацию, когда замок закрыт, но определённое воздействие позволяет его открыть.

Опишем суть.

Уязвимость CVE-2026-40478 (по классификации CVSS — уровень 9.1, что соответствует критическому) затрагивает Thymeleaf версии 3.1.3 и ниже. Эта библиотека широко используется со Spring Boot для рендеринга HTML, писем, PDF-документов. Проблема связана с механизмом обработки выражений: встроенная защита блокирует создание произвольных объектов через ключевое слово new, но при этом не учитывает некоторые пробельные символы (например, табуляцию). Вместо new java.io.FileWriter может быть использована конструкция с табуляцией, и проверка не срабатывает. В результате потенциально открывается доступ к файловой системе, а при определённых условиях — возможность удалённого выполнения кода (RCE).

Особенность таких уязвимостей в том, что они сложно выявляются статическими анализаторами и код-ревью. Один неочевидный символ — и защита нейтрализуется.

Как может выглядеть атака на CVE-2026-40478 — реальный сценарий (на основе анализа открытых данных)

Предположим, существует форма обратной связи. Пользователь вводит имя, email, сообщение, и эти данные передаются в шаблон Thymeleaf для генерации письма менеджеру. Злоумышленник в поле «сообщение» вставляет не обычный текст, а специально сконструированное выражение, которое включает табуляцию вместо пробела после new.

Парсер Thymeleaf воспринимает это как разрешённую конструкцию, после чего срабатывает Spring SpEL, и создаётся объект для работы с файловой системой. Это позволяет записать файл на сервер. При наличии в classpath определённых классов (а в Spring их множество) можно загрузить и выполнить произвольный байт-код, что делает RCE реальностью.

В практике компаний, оказывающих услуги в области ИБ, встречались случаи, когда через аналогичную уязвимость злоумышленники пытались записать исполняемый файл в папку веб-приложения. Своевременное срабатывание систем мониторинга файловой активности помогало предотвратить развитие атаки.

Потенциальные векторы входа:

  • любые пользовательские строки, которые попадают в Thymeleaf-выражения (например, th:text, th:utext, динамические имена шаблонов);
  • параметры URL, заголовки, cookie, если они используются в шаблонах;
  • данные из БД, которые могли быть модифицированы через SQL-инъекции или инсайдером.

Наиболее опасно, когда разработчики не подозревают, что пользовательские данные влияют на выражение — например, в кастомных директивах или при логировании ошибок.

Почему связка Thymeleaf и Spring Boot привлекает внимание злоумышленников

Thymeleaf является фактическим стандартом шаблонизации в Spring Boot. По статистике, значительная доля корпоративных Java-приложений в России используют эту связку. Это делает уязвимости в таких компонентах особенно привлекательными для массового сканирования.

Что может дать успешная эксплуатация CVE-2026-40478 злоумышленнику:

  • запись произвольных файлов на сервер (в том числе веб-шеллы, скрипты майнеров, бэкдоры);
  • чтение конфигурационных файлов (например, с данными подключения к БД);
  • при определённых условиях — выполнение команд операционной системы через цепочку классов;
  • латеральное перемещение по внутренней сети, особенно если сервер находится в DMZ.

Хорошая новость: уязвимость закрывается относительно простыми методами. В версии Thymeleaf 3.1.4 и выше реализована нормализация пробельных символов и расширен список запрещённых классов.

10 правил, как снизить риски, связанные с CVE-2026-40478 и подобными угрозами

Ниже приведён практический чек-лист, основанный на опыте реальных проектов в различных секторах.

  1. Обновите Thymeleaf до версии 3.1.4 или новее
    Версия 3.1.4 содержит патч: нормализация табуляции и других пробельных символов перед проверкой new. После обновления рекомендуется прогнать регрессионные тесты — изменение парсера может повлиять на старые шаблоны.
  2. Настройте валидацию всех входных данных перед передачей в Thymeleaf
    Используйте регулярные выражения для запрета непечатных символов (табуляция, перевод строки, возврат каретки, неразрывные пробелы и т.д.). Учитывайте, что пробельные символы в Unicode бывают разными.
  3. Проведите аудит всех шаблонов, где используется пользовательский ввод
    Особое внимание уделите конструкциям th:inline="text", th:utext, динамической генерации имён шаблонов. Даже один такой шаблон может создать риск.
  4. Внедрите регулярное сканирование зависимостей (dependency scanning)
    Раз в неделю проверяйте обновления библиотек. Используйте SCA-инструменты (OWASP Dependency-Check, Snyk). Автоматизация в CI/CD помогает не пропустить критические уязвимости.
  5. Добавьте в CI/CD проверку на уязвимые версии
    Например, с помощью плагина OWASP Dependency Check. Это не позволит попасть в прод с версией Thymeleaf ниже 3.1.4.
  6. Настройте мониторинг аномальной файловой активности
    Любое создание исполняемых файлов (JSP, JAR, shell-скриптов) в нестандартных местах должно быть триггером для SOC. Используйте Osquery или EDR-решения.
  7. Ограничьте права на запись для приложения
    Приложение должно иметь возможность записи только в определённые директории (например, /tmp, логи). Лучше запускать контейнеры с read-only root.
  8. Обучите разработчиков безопасной работе с шаблонизаторами
    Демонстрация работающего эксплойта на тестовом стенде — эффективный способ показать реальность угрозы.
  9. Регулярно проводите пентесты с моделированием действий реального противника
    Автоматические сканеры не всегда находят логические уязвимости в шаблонах. Важен ручной анализ с попыткой обхода защиты.
  10. Внедрите политику обновления библиотек и контролируйте её соблюдение
    Особенно это касается компонентов, обрабатывающих пользовательский ввод.

Типичные ошибки, которые сохраняют риски даже после патча

Ошибка 1: Игнорирование иных пробельных символов, кроме табуляции
В Unicode существуют символы, которые могут быть использованы для обхода. Чёрный список должен быть полным, и простая проверка на \s в Java не всегда достаточна.

Ошибка 2: Излишнее доверие к чёрному списку только стандартных классов
В чёрный список Thymeleaf были включены java.lang.Runtime, java.lang.ProcessBuilder. Однако злоумышленники могут использовать классы из самого Spring (например, org.springframework.expression.Expression или org.springframework.core.io.FileSystemResource), чтобы добиться RCE в обход запретов.

Ошибка 3: Отсутствие мониторинга логов после устранения уязвимости
Даже после обновления необходимо отслеживать попытки эксплуатации старой версии в отдельных микросервисах. В практике встречались случаи, когда один сервис оставался необновлённым, и злоумышленники сканировали эндпоинты в течение нескольких дней — признаки таких попыток (например, наличие new\t в параметрах) можно заметить по логам.

Как CVE-2026-40478 влияет на бизнес и соответствие требованиям (152-ФЗ, 187-ФЗ)

Для компаний, работающих в России, особенно в сфере КИИ, финансовом и госсекторе, последствия могут быть значительными. Утечка персональных данных вследствие такой уязвимости может рассматриваться как нарушение требований 152-ФЗ. По данным открытых источников, штрафы для юридических лиц по ст. 13.11 КоАП могут достигать 500 тыс. руб., а при повторном нарушении — до 1,5 млн руб. Кроме того, существует риск привлечения к ответственности по ст. 272 УК РФ (неправомерный доступ к компьютерной информации), если будет установлено, что меры безопасности были недостаточными.

В отношении 187-ФЗ (обязанности для операторов КИИ) несвоевременное обновление критической уязвимости может повлечь предписания контролирующих органов. В практике аудитов были случаи, когда инспекторы ФСТЭК обращали внимание на использование устаревших версий библиотек с известными CVE.

Таким образом, CVE-2026-40478 — это не только технический долг, но и риск для бизнеса и ответственность руководителей ИБ.

Пошаговый план действий (без остановки продуктивов)

  1. Составьте инвентаризацию всех сервисов на Spring Boot с Thymeleaf (например, с помощью поиска по jar-файлам).
  2. Обновите Thymeleaf до 3.1.4 в среде разработки, прогоните тесты.
  3. Разверните патч на стейджинге, проверьте шаблоны с реальными данными.
  4. Выкатите на продуктив в окно наименьшей нагрузки.
  5. Включите валидацию входных данных на уровне контроллеров (через @Pattern или собственный фильтр).
  6. Настройте алерты на появление в логах подозрительных паттернов (например, new\t, FileOutputStream, Runtime).
  7. Проведите повторное сканирование зависимостей — убедитесь, что нет старых транзитивных версий.
  8. Если быстрое обновление невозможно (например, из-за падающих тестов), рассмотрите временное отключение динамических выражений в Thymeleaf через templateEngine.setEnableSpringELCompiler(false). Однако это снизит функциональность, поэтому лучше не затягивать с полноценным обновлением.

Вопросы и ответы (на основе частых запросов от разработчиков и руководителей)

  1. Правда ли, что CVE-2026-40478 затрагивает только Thymeleaf 3.1.3 и ниже?
    Да. Версия 3.1.4 и выше защищены. Однако стоит проверить, не используются ли старые патчи или кастомные форки.
  2. Может ли WAF защитить от атаки без обновления?
    Частично. Если WAF умеет блокировать последовательности типа new\t или new\s+FileOutputStream — да. Но злоумышленник может использовать кодирование (например, %09) или другие Unicode-символы. Полагаться только на WAF не рекомендуется.
  3. Какая ответственность для ИТ-директора при эксплуатации уязвимости?
    По 152-ФЗ — административная. По 187-ФЗ для КИИ — вплоть до дисквалификации. В реальной практике были случаи наложения штрафов на должностных лиц за несвоевременное обновление библиотек с известными CVE.
  4. Как проверить, не была ли уязвимость уже использована в моей инфраструктуре?
    Ищите в логах приложений вызовы FileOutputStream, FileWriter, Runtime.exec с необычными параметрами. Анализируйте созданные файлы в /tmp, /var/tmp и директориях приложения. EDR-системы помогают выявить такие следы.
  5. Чем опасна эта уязвимость для компаний, использующих аутсорсинговую разработку?
    Аутсорсер может применять устаревший стек. Рекомендуется включать в договор требования о своевременном обновлении библиотек и право на аудит безопасности кода.
  6. Что делать, если Thymeleaf используется в legacy-проекте на Java 8?
    Обновление до версии 3.1.4 поддерживает Java 8. Для очень старых проектов можно рассмотреть изоляцию через контейнер с ограничениями файловой системы.
  7. Можно ли автоматизировать поиск CVE-2026-40478 в коде?
    Да, с помощью Semgrep или CodeQL можно создать правило на поиск конструкций, которые могут привести к обходу. Примеры таких правил публикуются в открытых источниках.
  8. Что делать при обнаружении следов эксплуатации?
    Немедленно изолировать сервер, сделать дамп памяти и логов, вызвать команду реагирования (CSIRT). Услуги Incident Response помогают выявить масштаб и остановить атаку.

Заключение: не паниковать, но действовать

Уязвимость CVE-2026-40478 серьёзна, но управляема. Главное — не откладывать её устранение. Наличие чёткого плана (например, изложенные выше правила) позволяет большинству компаний закрыть такие дыры за несколько дней. Безопасность — это не одноразовое обновление, а культура. Каждый раз, сталкиваясь с новой CVE, полезно задавать вопрос: «Как неочевидный символ или обходной путь может нейтрализовать нашу защиту?» Такой подход помогает предотвращать многие инциденты.

Если вам важно оценить уровень защищённости ваших приложений, провести аудит, внедрить системы мониторинга (EDR/XDR) или привести инфраструктуру к требованиям ФСТЭК и 152-ФЗ, можно обратиться за консультацией к профильным специалистам. Они помогут проанализировать инфраструктуру, выявить слабые места и построить дорожную карту повышения безопасности.

Берегите свои приложения. И пусть ваш код будет безопасным.

⚖️ Данный материал носит информационно-аналитический характер. Все выводы основаны на открытых источниках и не являются утверждением фактов, не подтверждённых официально. Материал не является юридической или технической рекомендацией. Любые решения принимаются читателем самостоятельно.

══════

Больше материалов: Центр знаний SecureDefence.

Оставьте заявку на бесплатную консультацию: [Перейти на сайт]