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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-17544 — Эксплойт для CVE-2026-17544: внеграничная запись (OOB write) в PHP bcmath, преобразованная в RCE, действующий только в памяти, с обходом disable_functions и open_basedir с помощью рантайм-резолвера без смещений. | Kitploit
Инструменты/GitHubGitHub/r2qa/cve-2026-17544
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийПост-эксплуатацияRed TeamingРазработка Полезной НагрузкиЭксплуатация Бинарных Файлов
GitHubr2qa/cve-2026-17544

CVE-2026-17544

Эксплойт для CVE-2026-17544: внеграничная запись (OOB write) в PHP bcmath, преобразованная в RCE, действующий только в памяти, с обходом disable_functions и open_basedir с помощью рантайм-резолвера без смещений.

Репозиторий
4 дней назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-17544 — OOB-запись в PHP bcmath → универсальный memory-only RCE

Боевой proof-of-concept для CVE-2026-17544 — выхода за границы буфера при записи в переписанном расширении bcmath в PHP (bc_str2num). Он превращает публично известный крах с только DoS в полный, универсальный, работающий только с памятью примитив удалённого выполнения кода, который обходит одновременно disable_functions и open_basedir.

Только авторизованные исследования / образовательное использование. Запускайте это только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.

image

TL;DR

  • Баг: bc_str2num отбрасывает дробную часть при ручном scale, повторно обрезает завершающие нули, но не обновляет fractional_end. Буфер выделяется под обрезанную длину, а копирование использует длину до обрезки → контролируемая OOB-запись нулей в кучу Zend MM.
  • Эксплуатация: OOB-запись нулей зануляет счётчик ссылок соседней zend_string (длина сохраняется) → UAF из-за рассинхронизации счётчика ссылок → относительное чтение/запись через гигантскую строку → fault-safe абсолютное произвольное чтение → разрешение символов во время выполнения → полностью data-only вызов нативной функции.
  • Полезная нагрузка: создаёт фейковый zend_class_entry + встроенный function_table + фейковый zend_function{ handler = zif_shell_exec }, затем вызывает его как метод. Вывод команды возвращается в виде строки и попадает в ответ/stdout.
  • Никаких жёстко заданных смещений. Базовый адрес, .data и целевой символ определяются во время выполнения сканированием памяти — поэтому один и тот же файл работает в разных сборках и дистрибутивах.

Модель угроз — сначала прочтите это

Это примитив побега из песочницы / пост-эксплуатации, а не RCE только на основе удалённого ввода.

СценарийРезультат
Атакующий уже может выполнять PHP (веб-шелл, десериализация, eval-приёмник), но ограничен disable_functions + open_basedir✅ Нативный RCE (этот PoC)
Приложение просто вызывает функцию bcmath для необработанного пользовательского ввода, например

Один вызов bcmath на основе ввода атакующего даёт одну слепую OOB-запись нулей без обратной связи. Полный RCE требует произвольного выполнения PHP, чтобы подготовить кучу, построить примитивы чтения/записи и запустить резолвер — ничто из этого не выражается аргументом функции. Поэтому реалистичный максимум при воздействии только через ввод — это удалённый отказ в обслуживании; выполнение кода требует уже существующего контекста выполнения PHP, который этот PoC затем освобождает из песочницы.


Затронутые версии

Баг живёт только в переписанном bcmath (линейки PHP 8.4 / 8.5):

Проверено end-to-end (uid=0, вывод перехвачен) на PHP 8.4.23 и PHP 8.5.8, amd64, одним и тем же неизменённым файлом — компоновка структур Zend идентична в 8.4 / 8.5.


Требования / допущения

  • Linux amd64.
  • Бинарный файл PHP 8.4/8.5 в уязвимом диапазоне с включённым bcmath.
  • Непрерывное отображение бинарника (все стандартные дистрибутивы / продакшен-сборки). Сканирование базового адреса во время выполнения спускается постранично от .text до ELF-заголовка; это безопасно для любого бинарника с непрерывным отображением. Только искусственные сборки с -z separate-code, имеющие непокрытые промежутки в 2 МБ, не могут быть разрешены автоматически слепым сканированием (в продакшене не встречаются).
  • Для доставки через web требуется изоляция запросов, чтобы exit() в рамках одного запроса не убивал сервер: php-fpm, Apache mod_php или встроенный сервер с PHP_CLI_SERVER_WORKERS>0.

Использование

CLI

root@kitploit:~
php exploit.php "id; uname -a"

Web (пост-эксплуатация, в изолированном PHP-контексте)

Разместите, например, как shell.php, затем:

root@kitploit:~
GET  /shell.php?cmd=id
POST cmd=id

Вывод команды перехватывается через zif_shell_exec и записывается в тело ответа.


Как это работает (подробно)

  1. Триггер + подготовка кучи (groom). Распылите строки фиксированного размера, создайте дыру и вызовите уязвимую bccomp(), чтобы OOB-запись нулей попала только в счётчик ссылок соседней zend_string (длина сохраняется).
  2. UAF через рассинхронизацию счётчика ссылок. Строка-жертва освобождается преждевременно, пока ещё остаётся висячая ссылка.
  3. Гигантская строка. Освободившийся слот занимает объект; поле длины висячей строки становится огромным значением → относительное чтение/запись по куче.
  4. Абсолютное чтение. Фейковый zend_reference (через косвенную адресацию) даёт fault-safe абсолютное произвольное чтение, которое никогда не затрагивает заголовок со счётчиком ссылок цели.
  5. Разрешение символа. Начиная с утёкшего указателя .text: спускайтесь постранично до ELF-магии (база), разберите программные заголовки, чтобы найти .data, затем просканируйте .data в поисках zend_function_entry для shell_exec, чей обработчик указывает в .text.
  6. Data-only вызов. Создайте фейковый zend_class_entry, инлайновый с одной корзиной (bucket) (корректный хеш , завершённая цепочка коллизий) и фейковый , чей обработчик — ; испортьте указатель на класс у объекта-зонда и вызовите метод. Вывод возвращается и выводится.

Файлы

  • exploit.php — универсальный эксплойт, работающий только с памятью (CLI + web).

Благодарности

  • Оригинальный публичный DoS proof-of-concept: boreas37/cve-2026-17544-poc.
  • Методы раскрытия памяти / data-only-вызовов вдохновлены предыдущими исследованиями по эксплуатации PHP.

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

Предоставлено для исследований в области безопасности и образования. Автор не несёт ответственности за неправомерное использование. Не разворачивайте против систем, которые вам не разрешено тестировать.

Скачать инструмент
bccomp($_POST['v'])
❌ Только DoS / крах
Ветка PHPУязвима
7.x, 8.0 – 8.3Нет (старый libbcmath, другой bc_str2num)
8.4.0 – 8.4.23Да
8.5.0 – 8.5.8Да
≥ 8.4.24 / ≥ 8.5.9Исправлена
function_table
zend_string
zend_internal_function
zif_shell_exec