Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-17544 — Exploit pour CVE-2026-17544 : écriture hors limites (OOB) dans bcmath de PHP convertie en RCE en mémoire uniquement, contournant disable_functions et open_basedir avec un résolveur sans offset à l'exécution. | Kitploit
Outils/GitHubGitHub/r2qa/cve-2026-17544
Analyse des VulnérabilitésExploitationExploitation d'Applications WebPost-ExploitationRed TeamingDéveloppement de Charges UtilesExploitation de Binaires
GitHubr2qa/cve-2026-17544

CVE-2026-17544

Exploit pour CVE-2026-17544 : écriture hors limites (OOB) dans bcmath de PHP convertie en RCE en mémoire uniquement, contournant disable_functions et open_basedir avec un résolveur sans offset à l'exécution.

Voir le dépôt
il y a 5 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-17544 — Écriture hors limites (OOB) dans PHP bcmath → RCE universelle en mémoire uniquement

Un proof-of-concept armé pour CVE-2026-17544, une écriture hors limites dans l'extension bcmath réécrite de PHP (bc_str2num). Il transforme le crash public connu DoS uniquement en une primitive d'exécution de code à distance complète, universelle et en mémoire uniquement qui contourne à la fois disable_functions et open_basedir.

Recherche autorisée / usage éducatif uniquement. Exécutez ceci uniquement sur des systèmes que vous possédez ou que vous êtes explicitement autorisé à tester.

image

TL;DR

  • Bug : bc_str2num tronque une partie fractionnaire sur un scale manuel, re-supprime les zéros de fin, mais ne met pas à jour fractional_end. Le tampon est dimensionné pour la longueur re-trimée alors que la copie utilise la longueur avant trim → écriture contrôlée de zéros hors limites dans le tas de la Zend MM.
  • Exploit : l'écriture de zéros OOB met à zéro le refcount d'un zend_string voisin (longueur préservée) → use-after-free par désynchronisation du refcount → lecture/écriture relative via chaîne géante → lecture arbitraire absolue sans risque de faute → résolution de symboles à l'exécution → un appel de fonction native entièrement data-only.
  • Payload : construit un faux zend_class_entry + une function_table inline + une fausse zend_function{ handler = zif_shell_exec }, puis l'appelle comme méthode. La sortie de la commande est retournée sous forme de chaîne et délivrée dans la réponse/stdout.
  • Aucun offset codé en dur. L'adresse de base, .data et le symbole cible sont tous résolus à l'exécution en scannant la mémoire — un seul fichier fonctionne donc à travers différentes builds et distributions.

Modèle de menace — à lire en premier

Ceci est une primitive d'évasion de sandbox / de post-exploitation, pas une RCE uniquement par entrée à distance.

ScénarioRésultat
L'attaquant peut déjà exécuter du PHP (webshell, désérialisation, sink eval) mais est limité par disable_functions + open_basedir✅ RCE native (ce PoC)

Un seul appel bcmath sur une entrée de l'attaquant donne une écriture de zéros OOB aveugle sans retour d'information. Une RCE complète nécessite une exécution PHP arbitraire pour préparer le tas, construire les primitives R/W et lancer le résolveur — rien de tout cela n'est exprimable comme argument de fonction. Le plafond réaliste pour une exposition uniquement par entrée est donc un déni de service à distance ; l'exécution de code nécessite un contexte d'exécution PHP existant que ce PoC libère ensuite de la sandbox.


Versions affectées

Le bug ne se trouve que dans le bcmath réécrit (branche PHP 8.4 / 8.5) :

Vérifié de bout en bout (uid=0, sortie capturée) sur PHP 8.4.23 et PHP 8.5.8, amd64, avec le même fichier non modifié — la disposition des structures Zend est identique entre 8.4 / 8.5.


Prérequis / hypothèses

  • Linux amd64.
  • Un binaire PHP 8.4/8.5 dans la plage vulnérable avec bcmath activé.
  • Mappage binaire contigu (toutes les distributions standard / builds de production). Le scan de la base à l'exécution descend page par page de .text jusqu'à l'en-tête ELF ; c'est sûr sur tout binaire mappé de façon contiguë. Seules les builds artificielles -z separate-code avec des trous de 2 Mo non mappés ne peuvent pas être auto-résolues par un scan aveugle (non observé en production).
  • Pour une livraison web, l'isolation des requêtes est requise afin qu'un exit() par requête ne tue pas le serveur : php-fpm, Apache mod_php, ou le serveur intégré avec PHP_CLI_SERVER_WORKERS>0.

Utilisation

CLI

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

Web (post-exploitation, dans un contexte PHP sandboxé)

Déployez-le par exemple sous shell.php, puis :

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

La sortie de la commande est capturée via zif_shell_exec et écrite dans le corps de la réponse.


Fonctionnement (détaillé)

  1. Déclenchement + préparation. Faites un spray de chaînes de taille fixe, créez un trou, puis exécutez le bccomp() vulnérable afin que l'écriture de zéros OOB atterrisse uniquement sur le refcount d'un zend_string voisin (longueur préservée).
  2. UAF par désynchronisation du refcount. La chaîne victime est libérée prématurément alors qu'une référence reste pendante.
  3. Chaîne géante. L'emplacement libéré est récupéré par un objet ; le champ de longueur de la chaîne pendante devient une valeur énorme → lecture/écriture relative sur le tas.
  4. Lecture absolue. Une fausse zend_reference (via indirection) permet une lecture arbitraire absolue sans risque de faute qui ne touche jamais l'en-tête refcounté de la cible.
  5. Résolution. Depuis un pointeur .text divulgué : descendez page par page jusqu'à la magie ELF (base), parsez les en-têtes de programme pour trouver .data, puis scannez .data pour trouver la zend_function_entry de shell_exec dont le handler pointe dans .text.
  6. Appel data-only. Construisez un faux zend_class_entry, une inline avec un seul bucket (hash correct, chaîne de collision terminée), et une fausse dont le handler est ; corrompez le pointeur de classe de l'objet sonde et invoquez la méthode. La sortie est retournée et affichée.

Fichiers

  • exploit.php — l'exploit universel en mémoire uniquement (CLI + web).

Crédits

  • Preuve de concept DoS publique originale : boreas37/cve-2026-17544-poc.
  • Techniques de divulgation mémoire / d'appel data-only inspirées de recherches antérieures sur l'exploitation de PHP.

Avertissement

Fourni pour la recherche en sécurité et l'éducation. L'auteur n'est pas responsable d'un mauvais usage. Ne déployez pas contre des systèmes que vous n'êtes pas autorisé à tester.

Télécharger l’outil
L'application se contente d'appeler une fonction bcmath sur une entrée utilisateur brute, par ex. bccomp($_POST['v'])❌ Uniquement DoS / crash
Branche PHPVulnérable
7.x, 8.0 – 8.3Non (ancien libbcmath, bc_str2num différent)
8.4.0 – 8.4.23Oui
8.5.0 – 8.5.8Oui
≥ 8.4.24 / ≥ 8.5.9Corrigé
function_table
zend_string
zend_internal_function
zif_shell_exec