Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-17544 — Exploit para CVE-2026-17544: escritura fuera de límites (OOB) en PHP bcmath convertida en RCE solo en memoria, saltándose disable_functions y open_basedir con un resolvedor sin offsets en tiempo de ejecución. | Kitploit
Herramientas/GitHubGitHub/r2qa/cve-2026-17544
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPost-ExplotaciónRed TeamingDesarrollo de PayloadsExplotación de Binarios
GitHubr2qa/cve-2026-17544

CVE-2026-17544

Exploit para CVE-2026-17544: escritura fuera de límites (OOB) en PHP bcmath convertida en RCE solo en memoria, saltándose disable_functions y open_basedir con un resolvedor sin offsets en tiempo de ejecución.

Ver Repositorio
hace 5 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-17544 — Escritura fuera de límites en bcmath de PHP → RCE universal de solo memoria

Una prueba de concepto armada para CVE-2026-17544, una escritura fuera de límites en la extensión bcmath reescrita de PHP (bc_str2num). Esto convierte el crash solo-DoS públicamente conocido en una primitiva de ejecución remota de código completa, universal y de solo memoria que evade tanto disable_functions como open_basedir al mismo tiempo.

Solo uso educativo / de investigación autorizado. Ejecuta esto únicamente contra sistemas que poseas o para los que tengas autorización explícita de prueba.

imagen

TL;DR

  • Bug: bc_str2num trunca una parte fraccionaria con un scale manual, vuelve a recortar los ceros finales, pero no actualiza fractional_end. El búfer se dimensiona para la longitud re-recortada mientras que la copia usa la longitud previa al recorte → escritura de ceros fuera de límites controlada en el heap de Zend MM.
  • Exploit: la escritura de ceros OOB pone a cero el refcount de un zend_string vecino (preservando la longitud) → use-after-free por desincronización de refcount → R/W relativo de cadena gigante → lectura arbitraria absoluta a prueba de fallos → resolución de símbolos en tiempo de ejecución → una llamada a función nativa completamente solo-datos.
  • Payload: construye un zend_class_entry falso + function_table en línea + un zend_function{ handler = zif_shell_exec } falso, y luego lo invoca como método. La salida del comando se devuelve como cadena y se entrega en la respuesta/stdout.
  • Sin offsets hardcodeados. La dirección base, .data y el símbolo objetivo se resuelven en tiempo de ejecución escaneando la memoria, por lo que un único archivo funciona entre distintas compilaciones y distribuciones.

Modelo de amenaza — lee esto primero

Esto es una primitiva de escape de sandbox / post-explotación, no una RCE solo con entrada remota.

EscenarioResultado
El atacante ya puede ejecutar PHP (webshell, deserialización, sumidero eval), pero está limitado por disable_functions + open_basedir✅ RCE nativa (este PoC)

Una única llamada a bcmath con entrada del atacante produce una escritura de ceros OOB ciega, sin retroalimentación. La RCE completa requiere ejecución arbitraria de PHP para preparar el heap, construir las primitivas R/W y ejecutar el resolvedor; nada de esto se puede expresar como argumento de función. Por lo tanto, el techo realista para una exposición solo con entrada es una denegación de servicio remota; la ejecución de código requiere un contexto de ejecución PHP existente que este PoC libera de la sandbox.


Versiones afectadas

El bug solo existe en la versión reescrita de bcmath (línea PHP 8.4 / 8.5):

Verificado de extremo a extremo (uid=0, salida capturada) en PHP 8.4.23 y PHP 8.5.8, amd64, con el mismo archivo sin modificar: el diseño de las estructuras de Zend es idéntico en 8.4 / 8.5.


Requisitos / supuestos

  • Linux amd64.
  • Un binario PHP 8.4/8.5 en el rango vulnerable con bcmath habilitado.
  • Mapeo de binario contiguo (toda distribución estándar / compilación de producción). El escaneo de la base en tiempo de ejecución recorre página a página desde .text hasta la cabecera ELF; esto es seguro en cualquier binario mapeado de forma contigua. Solo las compilaciones artificiales -z separate-code con huecos de 2 MB sin mapear no se pueden auto-resolver con un escaneo ciego (no visto en producción).
  • Para la entrega web, se requiere aislamiento de peticiones para que un exit() por petición no mate al servidor: php-fpm, Apache mod_php, o el servidor integrado con PHP_CLI_SERVER_WORKERS>0.

Uso

CLI

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

Web (post-explotación, dentro de un contexto PHP en sandbox)

Despliega como, p. ej., shell.php, luego:

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

La salida del comando se captura mediante zif_shell_exec y se escribe en el cuerpo de la respuesta.


Cómo funciona (detallado)

  1. Disparador + preparación. Rociar cadenas de tamaño fijo, abrir un hueco, y ejecutar el bccomp() vulnerable para que la escritura de ceros OOB aterrice solo en el refcount de un zend_string vecino (preservando la longitud).
  2. UAF por desincronización de refcount. La cadena víctima se libera prematuramente mientras una referencia sigue colgando.
  3. Cadena gigante. La ranura liberada es reclamada por un objeto; el campo de longitud de la cadena colgante se convierte en un valor enorme → lectura/escritura relativa sobre el heap.
  4. Lectura absoluta. Un zend_reference falso (mediante indirección) produce una lectura arbitraria absoluta a prueba de fallos que nunca toca la cabecera con refcount del objetivo.
  5. Resolución. A partir de un puntero .text filtrado: bajar paso a paso por páginas hasta la magia ELF (base), parsear las cabeceras de programa para encontrar .data, y luego escanear .data en busca del zend_function_entry de shell_exec cuyo handler apunta a .text.
  6. Llamada solo-datos. Construir un zend_class_entry falso, un en línea con un único bucket (hash correcto, cadena de colisión terminada) y un falso cuyo handler es ; corromper el puntero de clase del objeto de prueba e invocar el método. La salida se devuelve y se imprime.

Archivos

  • exploit.php — el exploit universal de solo memoria (CLI + web).

Créditos

  • Prueba de concepto pública original del DoS: boreas37/cve-2026-17544-poc.
  • Técnicas de divulgación de memoria / llamada solo-datos inspiradas en investigaciones previas de explotación de PHP.

Aviso legal

Proporcionado para investigación y educación en seguridad. El autor no es responsable del mal uso. No lo despliegues contra sistemas que no estés autorizado a probar.

Descargar herramienta
La aplicación solo llama a una función bcmath con entrada de usuario sin procesar, p. ej. bccomp($_POST['v'])❌ Solo DoS / crash
Rama PHPVulnerable
7.x, 8.0 – 8.3No (libbcmath antiguo, bc_str2num diferente)
8.4.0 – 8.4.23Sí
8.5.0 – 8.5.8Sí
≥ 8.4.24 / ≥ 8.5.9Corregido
function_table
zend_string
zend_internal_function
zif_shell_exec