Ad

CVE-2026-45617

HIGH CVSS 3.1: 7,5 EPSS 0.39%
Обновлено 22 июня 2026
Shopify
Параметр Значение
CVSS 7,5 (HIGH)
Устранено в версии 10.26.0
Тип уязвимости CWE-1333 (Атака через регулярные выражения (ReDoS))
Поставщик Shopify
Публичный эксплойт Нет

LiquidJS — это шаблонизатор, совместимый с Shopify/GitHub Pages, написанный на чистом JavaScript. В версиях 10.25.7 и ниже встроенный фильтр Strip_html использует регулярное выражение, содержащее четыре ошибочных альтернативы с ленивым количественным определением, что приводит к ReDoS через квадратичный обратный поиск. Если входные данные содержат много открывающих токенов <script, <style или <!-- без соответствующих замыкающих, механизм регулярных выражений V8 выполняет возврат O(N²), блокируя цикл событий Node.js.

Один запрос размером ~350 КБ ('<script'.repeat(50000)) останавливает процесс примерно на 10 секунд; стоимость растет квадратично с размером входных данных. MemoryLimit: Infinity по умолчанию не ограничивает ЦП регулярного выражения, и даже если настроено Strip_html, оно заряжает только str.length до предела — само регулярное выражение выполняется без ограничений. Один неаутентифицированный запрос, содержащий созданные ненадежные входные данные, может вызвать серьезную блокировку цикла событий и усиление ЦП, что приводит к перегрузке рабочих Node.js при обходе защиты MemoryLimit. Эта проблема исправлена ​​в версии 10.26.0.

Показать оригинальное описание (EN)

LiquidJS is a Shopify/GitHub Pages compatible template engine written in pure JavaScript. In versions 10.25.7 and below, the built-in strip_html filter uses a regex containing four flawed lazy-quantified alternatives, leading to ReDoS via quadratic backtracking. When the input contains many <script, <style, or <!-- opener tokens without matching closers, the V8 regex engine performs O(N²) backtracking, blocking the Node.js event loop. A single ~350 KB request ('<script'.repeat(50000)) stalls the process for ~10 seconds; cost grows quadratically with input size. The default memoryLimit: Infinity does not bound regex CPU, and even when configured strip_html only charges str.length to the limit — the regex itself runs unbounded. A single unauthenticated request containing crafted untrusted input can cause severe event-loop blocking and CPU amplification that saturates Node.js workers while bypassing memoryLimit protections. This issue has been fixed in version 10.26.0.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Низкая
Легко эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Нет
Нет утечки данных
Целостность
Нет
Нет модификации данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1