
Exploit per CVE-2026-17544: scrittura OOB in bcmath di PHP convertita in RCE in sola memoria, che aggira disable_functions e open_basedir tramite un resolver runtime privo di offset.
Un proof-of-concept armato per CVE-2026-17544, una scrittura fuori dai limiti (out-of-bounds) nell'estensione bcmath riscritta di PHP (bc_str2num). Trasforma il crash solo DoS pubblicamente noto in una primitiva di remote code execution completa, universale e in sola memoria che bypassa contemporaneamente disable_functions e open_basedir.
Solo per ricerca o istruzione autorizzate. Esegui questo solo su sistemi di tua proprietà o su cui sei esplicitamente autorizzato a testare.
![]()
bc_str2num tronca la parte frazionaria su uno scale manuale, ritaglia nuovamente gli zeri finali, ma non aggiorna fractional_end. Il buffer viene dimensionato per la lunghezza ritagliata mentre la copia usa la lunghezza pre-ritaglio → scrittura di zeri out-of-bounds controllata nell'heap Zend MM.zend_string adiacente (lunghezza preservata) → use-after-free da desincronizzazione del refcount → lettura/scrittura relativa tramite stringa gigante → lettura arbitraria assoluta fault-safe → risoluzione dei simboli a runtime → una chiamata di funzione nativa completamente data-only.zend_class_entry + function_table inline + una falsa zend_function{ handler = zif_shell_exec }, poi la invoca come metodo. L'output del comando viene restituito come stringa e consegnato nella risposta/stdout..data e il simbolo target vengono tutti risolti a runtime scansionando la memoria — quindi un singolo file funziona su build e distribuzioni diverse.Questa è una primitiva di sandbox-escape / post-exploitation, non una RCE basata solo su input remoto.
| Scenario | Risultato |
|---|---|
L'attaccante può già eseguire PHP (webshell, deserializzazione, sink eval) ma è confinato da disable_functions + open_basedir | ✅ RCE nativa (questo PoC) |
Una singola chiamata bcmath su input dell'attaccante fornisce una scrittura OOB di zeri cieca senza feedback. La RCE completa richiede esecuzione PHP arbitraria per preparare l'heap, costruire le primitive di lettura/scrittura ed eseguire il resolver — nessuna di queste cose è esprimibile come argomento di funzione. Quindi il tetto realistico per un'esposizione solo-input è un denial of service remoto; l'esecuzione di codice richiede un contesto di esecuzione PHP esistente che questo PoC libera poi dalla sandbox.
Il bug esiste solo nella bcmath riscritta (linea PHP 8.4 / 8.5):
Verificato end-to-end (uid=0, output catturato) su PHP 8.4.23 e PHP 8.5.8, amd64, con lo stesso file non modificato — il layout delle struct Zend è identico tra 8.4 / 8.5.
bcmath abilitato..text fino all'header ELF; questo è sicuro su qualsiasi binario mappato in modo contiguo. Solo le build artificiali -z separate-code con gap non mappati di 2 MB non possono essere risolte automaticamente da una scansione cieca (non viste in produzione).exit() per richiesta non uccida il server: php-fpm, Apache mod_php, o il server integrato con PHP_CLI_SERVER_WORKERS>0.php exploit.php "id; uname -a"
Distribuiscilo ad esempio come shell.php, poi:
GET /shell.php?cmd=id
POST cmd=id
L'output del comando viene catturato tramite zif_shell_exec e scritto nel corpo della risposta.
bccomp() vulnerabile così che la scrittura OOB di zeri colpisca solo il refcount di una zend_string adiacente (lunghezza preservata).zend_reference (tramite indirezione) produce una lettura arbitraria assoluta fault-safe che non tocca mai l'header con refcount del target..text divulgato: scendi di pagina in pagina fino alla magic ELF (base), analizza i program headers per trovare .data, poi scansiona .data per la zend_function_entry di shell_exec il cui handler punta in .text.zend_class_entry, una inline con un singolo bucket (hash corretto, catena di collisioni terminata) e una falsa il cui handler è ; corrompi il puntatore alla classe dell'oggetto probe e invoca il metodo. L'output viene restituito e stampato.exploit.php — l'exploit universale in sola memoria (CLI + web).Fornito per ricerca e istruzione sulla sicurezza. L'autore non è responsabile per usi impropri. Non utilizzarlo contro sistemi che non sei autorizzato a testare.
L'applicazione si limita a chiamare una funzione bcmath su input utente grezzo, es. bccomp($_POST['v']) | ❌ Solo DoS / crash |
| Ramo PHP | Vulnerabile |
|---|
| 7.x, 8.0 – 8.3 | No (vecchia libbcmath, bc_str2num diversa) |
| 8.4.0 – 8.4.23 | Sì |
| 8.5.0 – 8.5.8 | Sì |
| ≥ 8.4.24 / ≥ 8.5.9 | Corretto |
function_tablezend_stringzend_internal_functionzif_shell_exec