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

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

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

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

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

Категории

Все категории
Loading categories
drupal-openai-provider-ssrf-cve-2026-13233 — CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF через URL ответа / чтение локальных файлов. Недоверенный источник, не промпт. Безопасный воспроизводитель + обнаружения. Исправлено в версиях 1.1.1/1.2.2. | Kitploit
Инструменты/GitHubGitHub/kuninogu/drupal-openai-provider-ssrf-cve-2026-13233
Анализ уязвимостейВеб-безопасностьОбучение и Образование
GitHubkuninogu/drupal-openai-provider-ssrf-cve-2026-13233

drupal-openai-provider-ssrf-cve-2026-13233

CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): SSRF через URL ответа / чтение локальных файлов. Недоверенный источник, не промпт. Безопасный воспроизводитель + обнаружения. Исправлено в версиях 1.1.1/1.2.2.

Репозиторий

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
1 месяц назадЕщё не проверено

Drupal OpenAI Provider — SSRF / чтение локальных файлов через URL ответа (CVE-2026-13233)

Ненадёжный upstream: провайдер, который загрузил URL, указанный в его собственном ответе. Drupal OpenAI Provider (ai_provider_openai) · SSRF (CWE-918) · CVE-2026-13233 · SA-CONTRIB-2026-053

Статус: Скоординированное раскрытие завершено (2026-07-10). Сообщено конфиденциально Команде безопасности Drupal, исправлено и опубликовано как CVE-2026-13233 / уведомление SA-CONTRIB-2026-053 (оценка Умеренно критично). Автор указан как обнаружитель и разработчик исправления.

Исследование классического дефекта авторизации/проверки входных данных в «точке подключения» ИИ: провайдер генерации изображений ИИ загружал URL, содержащийся в ответе вышестоящего API, используя функцию общего назначения без разрешённого списка схем. В развёртываниях, где настроенный upstream не является доверенным по умолчанию (собственная конечная точка / прокси / самостоятельный шлюз / скомпрометированное реле), ответ мог указывать серверу на file:// или внутренний адрес.

Недоверенный ввод, достигающий стока, — это URL ответа upstream, а не запрос пользователя.

  • Класс (опубликовано): SSRF (CWE-918). SSRF включал file:// чтение локальных файлов; внутренний анализ автора также отнёс это к CWE-73 / CWE-441.
  • Серьёзность: Drupal Умеренно критично (SA-CONTRIB-2026-053) — средний уровень по шкале Drupal ≈ CVSS Средний; не CVSS Critical/High. Предварительная самооценка автора: нижняя граница 3.1 / условно 5.3 (Средний); предыдущие 6.5 / 7.4 отозваны, и средняя оценка это подтвердила.
  • Затронуто: Drupal OpenAI Provider (ai_provider_openai) < 1.1.1 и 1.2.0–1.2.1 (проверено 1.2.1) на Drupal core 11.2
  • Исправлено в: 1.1.1 / 1.2.2 · CVE: CVE-2026-13233 · Уведомление: https://www.drupal.org/sa-contrib-2026-053

Что было продемонстрировано (подтверждено) vs. не (не проверено)

Вся проверка проводилась в собственной, сетевой изолированной песочнице против имитации upstream. Реальный API OpenAI никогда не вызывался. Оракулы утечки были только синтетические.

Подтверждено (динамически продемонстрировано):

  • Триггер от не-администратора → чтение на стороне сервера выбранного upstream локального файла (произвольный путь доказан с помощью уникального маркера для каждого запуска; тело ответа побайтово равно маркеру; маркер присутствует только в контейнере приложения, отсутствует на имитации — исключая случай «имитация вернула свой собственный файл»).
  • Чтение settings.php подтверждено sha256 побайтовым совпадением (35,182 Б) — содержимое никогда не выводилось; учётные данные БД поэтому находятся в области действия.
  • Внутренний HTTP SSRF — получение ответа от сервиса без открытого порта (побайтовое совпадение внутреннего токена).
  • Граница авторизации: та же учётная запись получает 403 на маршруте конфигурации администратора (контраст 200-против-403).
  • Достижимость через легитимный HTTP через реалистичный виджет поля «Generate», настроенный администратором, редактором без разрешений ИИ.

Не проверено (явно не заявлено):

  • Кража учётных данных облачных метаданных (IMDS) — механизм правдоподобен из того же стока, не опробовано.
  • Достижимость динамического двойника базового класса — переопределён в этом провайдере (мёртвый код для этой цели); записано как вариант с той же первопричиной для переноса исправления, а не отдельная заявка.
  • Срабатывание пассивного автомата «только сохранение» — протестировано, отрицательно. «Простое сохранение» не запускает его.
  • Stored-XSS (путаница типов содержимого) и состояние гонки при преобразовании речи в текст — отдельные направления, не доказаны.

Не затронуто: по умолчанию api.openai.com через TLS. Настройка host контролируется администратором / config-sync / развёртыванием — атакующий без прав администратора во время выполнения не может её изменить.


Первопричина и направление исправления (кратко)

URL ответа передавался функции общего назначения, которая учитывает все зарегистрированные обёртки потоков PHP (file, php, http, data, phar, …). response_format по умолчанию равен url, поэтому уязвимая ветвь — это путь по умолчанию. file:// является обёрткой файловой системы по умолчанию в PHP и не защищена allow_url_fopen (ранее заявление «требует allow_url_fopen» было неверным и отозвано).

Исправляйте примитив, а не только место вызова:

  1. Прекратите использовать выборку общего назначения для удалённого извлечения; используйте внедрённый HTTP-only клиент.
  2. Проверяйте, что схема — http/https перед запросом; отключите перенаправления (30x может перенаправить на file://).
  3. Защита на глубине: отклоняйте разрешённые частные/локальные адреса (link-local/loopback) или ограничивайте настроенными хостами CDN изображений; проверяйте размер / Content-Type / декодирование изображения.
  4. Перенесите то же исправление в базовый класс, чтобы родственные провайдеры унаследовали его (иначе исправление неполное).
  5. Регрессионные тесты — в первую очередь негативные случаи: file://…, http://169.254.169.254/… и перенаправление 302→file:// должны быть отклонены.

Полное направление: docs/fix-direction.md.


Структура каталогов

root@kitploit:~
.
├── README.md                          # this file (English, canonical)
├── README_ja.md                       # Japanese mirror
├── SECURITY.md                        # reporting policy + responsible-disclosure disclaimer
├── .gitignore                         # blocks secrets / primary evidence from being committed
├── docs/
│   └── fix-direction.md               # root-cause fix + variant hunt + minimal-diff sketch (EN)
├── reproducer/                        # SAFE reproducer only (sandbox, mock upstream, benign oracle)
│   ├── README.md                      # how to stand up the network-isolated sandbox
│   ├── verdict.md                     # what "success" means: raw-byte match + 200-vs-403 + exit codes
│   ├── mock-openai-server.py          # benign mock; default happy-path PNG, ssrf_demo → file:///etc/hostname only
│   └── docker-compose.yml             # TEMPLATE: isolated Drupal sandbox + mock (you add the vulnerable target)
├── detections/
│   ├── README.md
│   ├── sigma/web-egress-to-internal-after-imagegen.yml
│   ├── sigma/php-sensitive-file-open.yml
│   ├── sentinel/imagegen-egress-correlation.kql
│   └── splunk/imagegen-content-type-mismatch.spl
└── timeline.md                        # disclosure timeline (single source of truth)

Документация сейчас на японском (.ja.md); английские канонические переводы — в планах. Из этого репозитория изъяты: уязвимые нагрузки и любое готовое PoC чтения файлов. Публичный reproducer/ демонстрирует механизм дефекта на имитации с использованием единственного безвредного оракула (/etc/hostname) — без чтения произвольного пути, без захвата settings.php, без IMDS. Это не оружие против живых сайтов. Обновитесь до 1.1.1 / 1.2.2.


Безопасный воспроизводитель

Цель: позволить исследователю подтвердить класс дефекта без предоставления эксплойта для живой цели или раскрытия секретов. Всё работает офлайн.

  • Изоляция: docker compose с приложением и имитацией upstream в изолированной сети (--network none для проверок языковых примитивов). Никакие учётные данные не подключаются. Имитация никогда не общается с реальным API.
  • Модель доверенного-недоверенного upstream: имитация играет роль «host, указывающий на недоверенный прокси/самостоятельный шлюз». Она настраивается внеполосно (не через запрос) для возврата синтетического целевого URL — это кодирует исправленную модель атакующего (upstream выбирает URL, пользователь только запускает).
  • Только безвредные оракулы:
    • file:///etc/hostname и уникальный маркер для каждого запуска, записанный только внутри контейнера приложения → доказывает, что приложение прочитало выбранный upstream путь (маркер отсутствует на имитации).
    • settings.php проверено с помощью sha256 побайтового совпадения, содержимое никогда не выводилось → доказывает, что «учётные данные БД находятся в зоне ответственности» без их раскрытия.
    • Внутренний HTTP-сервис без открытого порта → доказывает получение ответа внутреннего SSRF с синтетическим токеном.
  • Вердикт — это побайтовое сравнение, а не HTTP 200: успех = тело ответа побайтово равно ожидаемому синтетическому значению, плюс контраст авторизации 200-против-403. Коды выхода строгие (0 эксплуатируемо / 1 предусловие / 2 не воспроизведено / ошибка очистки / ошибка). См. .

См. reproducer/README.md.


График раскрытия

См. timeline.md. Кратко:


Рекомендации по обнаружению

Практические детекции находятся в detections/; обоснование в docs/detection-engineering.md. Кратко:

  • Сопоставляйте кто запустил генерацию изображения (аудит приложения) с аномальным исходящим трафиком (прокси / EDR) на 169.254.169.254 / loopback / RFC1918 в узком временном окне после вызова API. Не срабатывайте только на исходящем трафике.
  • Чтения file:// никогда не попадают в сеть — обнаруживайте открытие чувствительных файлов веб-процессами через аудит хоста (auditd/EDR), с базовой линией, чтобы срабатывали только нестандартные чтения в рамках запроса генерации изображения.
  • Ретроспективно ищите байты, объявленные как image/*, чьи магические байты не являются изображением.
  • Большинство интеграций ИИ не логируют какой пользователь загрузил какой URL — добавьте запись аудита загрузки {request_id, actor, target_url, scheme, resolved_ip, content_type}. Только стандартные логи этого не поймают.

Ссылки

  • OWASP Top 10 A10:2021 — Server-Side Request Forgery
  • CWE-918 SSRF · CWE-73 внешний контроль имени/пути файла · CWE-441 непреднамеренный прокси/ретранслятор · CWE-610 внешне контролируемая ссылка
  • Обёртки потоков PHP (file:// — обёртка файловой системы по умолчанию; не защищена allow_url_fopen)
  • Команда безопасности Drupal — скоординированное раскрытие через «Сообщить об уязвимости безопасности» проекта
  • Уведомление: Drupal SA-CONTRIB-2026-053 — https://www.drupal.org/sa-contrib-2026-053
  • CVE: CVE-2026-13233 (CNA: Drupal.org)

Уведомление о безопасности

  • Раскрытие завершено (CVE-2026-13233 / SA-CONTRIB-2026-053), поэтому детали продукта/версии/кода являются общедоступными. Сначала обновитесь до 1.1.1 / 1.2.2 — незапатченные сайты всё ещё существуют.
  • reproducer/ только для песочницы и использует синтетические оракулы. Это не эксплойт для живой цели и не содержит секретов. Не запускайте его против систем, которыми вы не владеете и не имеете разрешения тестировать.
  • Никакого рабочего PoC чтения файлов и никаких первичных доказательств, содержащих секреты, здесь не включено — намеренно, даже после исправления, пока существуют незапатченные развёртывания.

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

Все исследования проводились автором в собственной, сетевой изолированной песочнице, против имитации upstream — реальный API поставщика никогда не использовался, и никакая сторонняя система никогда не тестировалась. Находка была сообщена конфиденциально сначала Команде безопасности Drupal и опубликована только в синхронизации с исправлением и уведомлением (SA-CONTRIB-2026-053, CVE-2026-13233); оценка поставщика — Умеренно критично. Показатели CVSS автора являются предварительной самооценкой, а не официальным баллом, и были намеренно консервативными (без CVSS Critical/High) — в соответствии со средней оценкой поставщика. Этот материал предназначен для защитных и образовательных целей. См. SECURITY.md.

Скачать инструмент
3
99
reproducer/verdict.md
  • Примечание о прозрачности: любая нормализация окружения (например, исправление владельца каталога файлов песочницы, который предыдущий запуск от root сделал недоступным для записи) задокументирована и влияет только на этап сохранения/обслуживания, не на сам сток чтения файлов. Это раскрыто, чтобы рецензенты не истолковали это как подстроенное предусловие.
  • ДатаСобытие
    2026-06-10Статический анализ обнаружил сток; динамически подтверждено чтение file:// по фиксированному пути
    2026-06-11Подтверждено чтение произвольного пути + sha256 совпадение settings.php + внутренний HTTP SSRF
    2026-06-11Достижимость для производственного потребителя (внутренний путь автомата; FWA легитимный HTTP-exfil)
    2026-06-11Независимая рецензия сверстников исправила завышенные заявления (модель атакующего, CVSS, allow_url_fopen); отправка поставлена на HOLD
    2026-06/07Элементы HOLD устранены; сообщено конфиденциально Команде безопасности Drupal; двойник базового класса отмечен для drupal/ai
    2026-07-10Выпущены исправления 1.1.1 / 1.2.2; опубликованы уведомление SA-CONTRIB-2026-053 и CVE-2026-13233; автор указан как обнаружитель и разработчик исправления