CVE: CVE-2026-106445
Продукт: Ubuntu
Дата публикации: 06.10.2026
Критичность: CRITICAL
CVSS: 9.2 (4.0)
EPSS: 0,41%; процентиль 33,31%
CISA KEV: нет подтверждения в каталоге CISA KEV
Краткое описание
В библиотеке шаблонов Handlebars.js версии от 4.0.0 до версии, предшествующей 4.7.10, функция
lookupProperty возвращает Function.prototype.constructor до применения списка запрещённых свойств прототипа: constructor является собственным свойством Function.prototype, и deny-лист его не отсекает.Если злоумышленник может заставить сервер отрендерить контролируемый шаблон при включённой опции
allowProtoMethodsByDefault и в контексте шаблона доступна функция, он получает доступ к конструктору Function и добивается выполнения контролируемого JavaScript с привилегиями серверного приложения.Исправление выпущено в Handlebars 4.7.10. В Ubuntu уязвимость затрагивает пакет
node-handlebars и производные пакеты в релизах 18.04–26.04 LTS; Ubuntu оценивает риск как medium, тогда как CVSS v4.0 от вендора — 9.2 (CRITICAL).Основные характеристики
Суть риска: сервер, рендерящий шаблоны Handlebars с данными, которыми частично управляет злоумышленник, может быть вынужден выполнить контролируемый JavaScript-код с правами этого сервера. Ключевые параметры:
- Тип ошибки: CWE-184 (неполный список запрещённых значений) и CWE-1289 (некорректная проверка входных данных) — обход deny-листа доступа к прототипу.
- Затронутые версии Handlebars: от 4.0.0 до версии, предшествующей 4.7.10; исправление — 4.7.10.
- CVSS v4.0: 9.2, CRITICAL, вектор
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N— сетевой вектор, низкая сложность, но повышенные требования к условиям атаки (AT:P), без привилегий и взаимодействия с пользователем.
- Оценка Ubuntu: medium — дистрибутив считает практический риск ниже формального максимума.
- EPSS: 0,41% (процентиль 33,31%) — прогнозируемая вероятность эксплуатации в ближайшие 30 дней невысока.
- CISA KEV: сведений о включении в каталог нет; подтверждений эксплуатации в реальных атаках в доступных источниках не приводится.
Какие продукты и версии затронуты
По данным Ubuntu OSV уязвимость затрагивает исходный пакет
node-handlebars и собранные из него бинарные пакеты в следующих релизах Ubuntu:- Ubuntu 18.04 LTS (bionic):
handlebars,libjs-handlebars,libjs-handlebars.runtimeверсии3:4.0.10-5.
- Ubuntu 20.04 LTS (focal): те же пакеты, версия
3:4.7.2-1.
- Ubuntu 22.04 LTS (jammy): те же пакеты, версия
3:4.7.7+~4.1.0-1.
- Ubuntu 24.04 LTS (noble): те же пакеты, версия
3:4.7.7+~4.1.0-1.
- Ubuntu 26.04 LTS (resolute): те же пакеты, версия
3:4.7.7+~4.1.0-1.
Во всех перечисленных релизах диапазон уязвимости помечен как «introduced: 0», то есть уязвимы все версии пакета в дистрибутиве на момент публикации записи. Сведения о доступности исправленных сборок в репозиториях Ubuntu (поле availability) в переданных данных не заполнены — статус исправления для каждого релиза следует проверять на странице ubuntu.com/security/CVE-2026-106445.
Сама библиотека Handlebars.js уязвима в версиях от 4.0.0 до версии, предшествующей 4.7.10, независимо от дистрибутива.
Причина уязвимости
Причина — дефект в функции
lookupProperty библиотеки Handlebars. Эта функция разрешает обращения к свойствам при рендеринге шаблона и должна применять «запретный список» (deny list) доступа к прототипам, блокируя опасные свойства вроде constructor и __proto__.Ошибка в порядке операций:
lookupProperty возвращает Function.prototype.constructor до того, как применяется deny-лист. Обходной путь возникает из-за особенности языка JavaScript: constructor является собственным (own) свойством Function.prototype, а не унаследованным. Проверки, ориентированные на цепочку прототипов или унаследованные свойства, такое собственное свойство не отсекают — и запрет не срабатывает.В результате шаблон, начиная с любой доступной функции в контексте, может пройти по цепочке прототипов до
Function.prototype и через обход собственного свойства получить конструктор Function, который позволяет компилировать и выполнять произвольный код. Классификация CWE-184 и CWE-1289 отражает именно неполноту фильтрации и некорректную валидацию.Как работает атака
Путь данных начинается с шаблона и контекста рендеринга. Злоумышленнику нужен контроль над содержимым шаблона либо над частью данных, попадающих в контекст, при условии, что в контексте доступна функция.
При включённой опции
allowProtoMethodsByDefault доступ к свойствам прототипов методов разрешён по умолчанию. Шаблон обращается к доступной функции из контекста, затем через её прототип поднимается до Function.prototype.На этом этапе
lookupProperty возвращает Function.prototype.constructor, не применив deny-лист, — именно потому, что constructor является собственным свойством Function.prototype.Получив конструктор
Function, злоумышленник может скомпилировать строку с произвольным JavaScript и вызвать её. Код выполняется в процессе серверного приложения с его привилегиями — это исполнение на стороне сервера, где работает рендеринг, а не ограниченное браузерное поведение шаблона.Итог — выполнение контролируемого злоумышленником кода в контексте приложения. Границы влияния определяются правами процесса: доступ к данным приложения, возможность сетевых действий от его имени и т. п.
Условия успешной эксплуатации
По описанию уязвимости для успешной эксплуатации требуется совокупность условий:
- Злоумышленник может повлиять на шаблон, который рендерит сервер, — контролируемый шаблон должен попасть в рендеринг.
- Опция
allowProtoMethodsByDefaultвключена (не отключена конфигурацией приложения).
- В контексте шаблона доступна хотя бы одна функция, от которой можно начать обход по цепочке прототипов.
- Установлена уязвимая версия Handlebars: от 4.0.0 до версии, предшествующей 4.7.10.
Если хотя бы одно условие не выполняется — например, пользовательские шаблоны не рендерятся, доступ к прототипам методов запрещён или контекст не содержит функций, — описанный путь не работает. Практическая эксплуатируемость конкретного приложения зависит от его конфигурации, что согласуется с более низкой оценкой Ubuntu (medium) на фоне формального CVSS 9.2.
Возможный сценарий атаки
Типичный сценарий для веб-приложения на Node.js: приложение позволяет пользователям вводить шаблоны или их фрагменты — например, настраиваемые письма, отчёты или страницы — и рендерит их через Handlebars на сервере.
Злоумышленник отправляет шаблон, содержащий обращение к функции из контекста рендеринга и последующий обход по прототипу до
Function.prototype.constructor. Поскольку deny-лист не применяется к собственному свойству constructor, шаблон получает конструктор Function.Далее злоумышленник добивается компиляции и вызова строки с нужным ему кодом. Код исполняется в процессе сервера с его правами: злоумышленник получает возможность читать или изменять данные приложения и обращаться к внутренним ресурсам от имени сервера. Конкретные последствия в источниках не детализированы.
Это логическая реконструкция по описанию уязвимости, а не зафиксированный инцидент. Подтверждённых случаев такой атаки в переданных материалах нет.
Есть ли публичный эксплойт
В переданных источниках нет сведений о публичном PoC-коде, техническом разборе с готовым эксплойтом или подтверждённой эксплуатации в реальных атаках.
Отсутствие таких сведений не означает, что эксплойт не существует или не появится: механика обхода подробно описана в рекомендации GHSA-p8wg-vrv2-v86f, что снижает барьер для воспроизведения.
EPSS 0,41% указывает на пока низкую прогнозируемую вероятность эксплуатации. Статус следует периодически перепроверять.
Признаки эксплуатации
Специфичные индикаторы компрометации (IOC) для этой уязвимости в переданных источниках отсутствуют — ни хешей, ни характерных строк payload, ни адресов инфраструктуры не опубликовано.
Администратору остаются только неспецифичные точки контроля, применимые к любому Node.js-приложению:
- Неожиданные вызовы конструктора
Functionи аномальная активность интерпретатора в процессах рендеринга шаблонов.
- Внезапное появление исходящих соединений или обращений к файловой системе из процессов приложения, которых не было в базовой линии.
- Записи в журналах приложения о рендеринге шаблонов с аномальным содержимым, обращающимся к прототипам.
Эти признаки не являются подтверждёнными IOC именно для CVE-2026-106445 и служат лишь общими ориентирами.
Как обнаружить атаку
Прямых правил обнаружения, специфичных для этой уязвимости, в переданных данных нет. Разумный подход для администратора Ubuntu — сочетание инвентаризации и мониторинга.
Сначала определите, используется ли уязвимая библиотека: проверьте установленные пакеты (см. раздел проверки версии) и зависимости Node.js-приложений, развёрнутых на сервере, включая
node-handlebars и локальные node_modules.Затем оцените конфигурацию: включена ли
allowProtoMethodsByDefault и рендерятся ли шаблоны, контролируемые внешними пользователями. Именно сочетание этих факторов определяет реальную подверженность.Для мониторинга используйте неспецифичные точки контроля: журналы приложений на предмет аномальных шаблонов, системный аудит процессов Node.js на неожиданные сетевые соединения и обращения к файлам. Сопоставление с базовой линией поведения важнее поиска конкретных сигнатур.
Как проверить свою версию
Проверка версии Ubuntu и установленных пакетов Handlebars:
Bash:
cat /etc/os-release
uname -r
apt-cache policy node-handlebars
apt-cache policy handlebars
apt-cache policy libjs-handlebars
apt-cache policy libjs-handlebars.runtime
ubuntu-security-status
Команда
apt-cache policy <имя-пакета> показывает установленную и доступную версии пакета — замените <имя-пакета> на конкретное имя из списка выше. ubuntu-security-status поможет оценить общий статус безопасности системы.Дополнительно для приложений Node.js проверьте версию библиотеки в зависимостях проекта, например через
npm ls handlebars в каталоге приложения (эта команда не входит в пакет доказательств и приведена как стандартный способ инвентаризации npm-зависимостей).Исправление
Полное устранение — обновление Handlebars до версии 4.7.10 или новее, где
lookupProperty применяет deny-лист корректно. В Ubuntu это означает установку исправленных версий пакетов node-handlebars и производных (handlebars, libjs-handlebars, libjs-handlebars.runtime) из репозиториев.Рекомендуемый порядок действий:
- Обновите индекс пакетов и установите доступные обновления безопасности для затронутых пакетов.
- Проверьте статус исправления для вашего релиза на странице ubuntu.com/security/CVE-2026-106445 — в переданных данных поле availability для релизов не заполнено, и сроки выпуска исправленных сборок по релизам там не подтверждены.
- Для приложений, использующих npm-зависимости напрямую, обновите
handlebarsвpackage.jsonдо4.7.10или выше и переустановите зависимости независимо от системных пакетов.
- Перезапустите приложения, использующие библиотеку, чтобы обновлённый код был загружен в память.
Если исправленный пакет для вашего релиза ещё не опубликован, отслеживайте обновления через штатные механизмы Ubuntu и примените временные меры из соответствующего раздела.
Временные меры защиты
Пока обновление недоступно или не установлено, снизить риск можно конфигурационными и архитектурными мерами, вытекающими из описанных условий эксплуатации:
- Убедитесь, что опция
allowProtoMethodsByDefaultотключена — без неё описанный путь обхода не работает.
- Исключите рендеринг шаблонов, содержимое которых контролируют внешние пользователи; если такая функциональность есть, ограничьте или отключите её.
- Убедитесь, что в контексте рендеринга не передаются функции — без доступной функции в контексте цепочка обхода не стартует.
- Ограничьте привилегии процессов Node.js (запуск от непривилегированного пользователя, изоляция контейнером), чтобы снизить последствия возможного исполнения кода.
Это защитные выводы, следующие из механики уязвимости; их эффективность для конкретного приложения нужно проверять самостоятельно.
Как проверить устранение уязвимости
После установки обновлений проверьте, что уязвимые версии ушли:
Bash:
apt-cache policy node-handlebars
apt-cache policy handlebars
apt-cache policy libjs-handlebars
apt-cache policy libjs-handlebars.runtime
Установленная версия пакетов должна соответствовать исправленной сборке для вашего релиза — сверяйте её с данными на ubuntu.com/security/CVE-2026-106445. Для npm-проектов выполните
npm ls handlebars и убедитесь, что разрешается версия 4.7.10 или выше.Также проверьте конфигурацию приложений:
allowProtoMethodsByDefault должна быть отключена, а пользовательский ввод не должен попадать в шаблоны без ограничений. Перезапуск служб после обновления обязателен — работающие процессы продолжают использовать старый код до перезапуска.Вывод
CVE-2026-106445 — пример того, как тонкий порядок проверок (deny-лист применяется после возврата свойства) и особенность JavaScript (собственное свойство
constructor у Function.prototype) приводят к выполнению контролируемого кода на сервере.Для администратора Ubuntu практический алгоритм прост: определить, используется ли
node-handlebars или Handlebars в npm-зависимостях, проверить конфигурацию рендеринга шаблонов, обновиться до Handlebars 4.7.10 и перезапустить приложения.Формальная критичность (CVSS 9.2) сочетается с жёсткими условиями эксплуатации и оценкой Ubuntu «medium», а EPSS 0,41% говорит о низкой текущей вероятности атак. Обновление остаётся единственным надёжным устранением — откладывать его при наличии пользовательских шаблонов не стоит.
Официальные источники
История обновлений статьи
- 09.10.2026 — Опубликована первая версия материала.
