PHP: aggiornamento cruciale cambia lo sviluppo web — cosa devono sapere gli sviluppatori

PHP è un linguaggio di scripting general-purpose ampiamente usato, particolarmente adatto per lo sviluppo Web e integrabile nell’HTML.

PHP è un linguaggio di scripting per il server, open source e a scopo generale, nato per lo sviluppo Web dinamico. È stato tra i primi linguaggi server-side a poter essere inserito direttamente all’interno di documenti HTML invece di richiamare file esterni per l’elaborazione dei dati. Il codice viene interpretato da un server Web dotato di un modulo processore PHP che produce la pagina risultante. Nel tempo PHP si è evoluto includendo anche un’interfaccia a riga di comando e può essere impiegato in applicazioni grafiche autonome.

Se non conosci ancora PHP e vuoi farti un’idea pratica del suo funzionamento, prova il tutorial introduttivo.

In seguito, consulta il manuale online.

Novità

PHP 8.5.12 risolve due vulnerabilità critiche che possono consentire l’esecuzione remota di codice senza autenticazione. Si raccomanda a tutti gli utenti PHP di aggiornare immediatamente.

Chi è a rischio: tutte le istanze PHP che servono richieste web, inclusi PHP-FPM, Apache con mod_php, php-cgi, FrankenPHP e LiteSpeed. Riteniamo il rischio più elevato per mod_php, per il quale è stato dimostrato un exploit in cui una richiesta non autenticata può attivare l’attacco prima che venga eseguito qualsiasi codice applicativo.

Le vulnerabilità:

  • Esecuzione remota di codice (RCE) tramite corruzione OOM, CVE-2026-109618 (GHSA-w8hw-w9fx-j79w): la gestione di condizioni out-of-memory può interrompere PHP mentre alcuni dati interni della richiesta sono solo parzialmente inizializzati. La pulizia della richiesta potrebbe quindi trattare quei dati non validi come se fossero corretti.
  • Esecuzione remota di codice (RCE) tramite stato globale obsoleto, CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp): lo stato interno appartenente a una richiesta può sopravvivere dopo che la memoria che lo supportava è stata liberata. Una richiesta successiva gestita dallo stesso worker potrebbe usare quello stato obsoleto prima che la normale inizializzazione lo resetti.

Come aggiornare:

  • Aggiorna a PHP 8.5.12
  • Le distribuzioni Linux e i fornitori LTS hanno ricevuto le patch in anticipo, quindi verifica con il tuo vendor la disponibilità dei pacchetti aggiornati.
  • PHP 8.1 e versioni precedenti non ricevono più aggiornamenti dal progetto PHP. Alcune distribuzioni e fornitori LTS forniscono correzioni backport, quindi contatta il tuo vendor per dettagli, oppure esegui l’upgrade a una versione supportata.
  • Data la gravità delle vulnerabilità, il team di sicurezza PHP ha fornito backport minimi del sorgente per PHP 7.4, PHP 8.0 e PHP 8.1 per aiutare chi compila da sorgente o non può ottenere aggiornamenti da un vendor LTS.
  • Se non puoi aggiornare immediatamente: pur essendo l’aggiornamento l’unica soluzione completa, le misure seguenti riducono l’esposizione su specifici vettori d’attacco ma non rendono l’installazione sicura.

RCE tramite corruzione OOM (CVE-2026-109618):

  • Imposta memory_limit=-1, preferibilmente in modo che le applicazioni non possano sovrascriverlo, ad esempio usando php_admin_value nel pool FPM o nella configurazione di Apache, e verifica che nessun pool, directory o impostazione applicativa reintroduca un limite finito. Questo rimuove il fallimento controllabile del limite di memoria PHP, ma un’allocazione fallita a livello sottostante può comunque raggiungere il percorso vulnerabile.
  • Imposta un valore basso per post_max_size. Per applicazioni che non necessitano di upload di file, imposta post_max_size = 8M. Se gli upload sono necessari, usa post_max_size = 32M. Mantieni upload_max_filesize inferiore a post_max_size. Valuta l’imposizione di limiti a livello di server web o proxy per la dimensione della richiesta decodificata, il numero di campi di input, il numero di parti multipart, il conteggio delle intestazioni e la profondità di annidamento. Questi limiti devono coprire anche le richieste senza un Content-Length utilizzabile.
  • Usa un limite tramite container o cgroup come barriera di disponibilità, preferibilmente con una politica che termini solo il worker coinvolto. Non sostituire con RLIMIT_AS o RLIMIT_DATA, poiché questi possono causare il tipo di fallimento di allocazione vulnerabile.

RCE tramite stato globale obsoleto (CVE-2026-109619):

  • Imposta session.upload_progress.enabled=0 e riavvia ogni worker. Usa php.ini, un pool FPM o la configurazione del server che venga applicata prima del parsing della richiesta. Non fare affidamento su ini_set() o su .user.ini di FPM. Questo blocca le vie di attacco confermate che coinvolgevano session.upload_progress ma non tutte le varianti possibili.
  • Su PHP 8.5, imposta fatal_error_backtraces=0 e riavvia ogni worker. Questo impedisce il percorso confermato che sfruttava i backtrace fatali soltanto.
  • Rimuovi impostazioni non valide o deprecate applicate per richiesta che producono diagnostica prima dell’inizializzazione. Nascondere i messaggi diagnostici con error_reporting, display_errors o l’operatore @ non risolve il problema.
  • Correggi gli errori fatali raggiungibili da un attaccante e i timeout di esecuzione, inclusi i fallimenti nei callback, nell’elaborazione di upload o import e nelle operazioni di pulizia.

Il team di sviluppo PHP annuncia la disponibilità immediata di PHP 8.5.12. Si tratta di una release di sicurezza che corregge due vulnerabilità critiche (CVE-2026-109618, CVE-2026-109619) che possono permettere l’esecuzione remota di codice senza autenticazione. Si invitano con forza tutti gli utenti di PHP 8.5 ad aggiornare subito.

Non esistono mitigazioni complete: l’aggiornamento è l’unica scelta sicura. Consulta l’advisory di sicurezza per i dettagli.

Versione 8.5.12:

Core:

  • Corretto GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp (Evitata la corruzione di stato tramite bailout).
  • Risolto il bug GH-23644 (L’ottimizzatore lasciava una comparazione costante-vs-costante non ridotta, causando il crash della VM in zval_undefined_cv).
  • Corretto OSS-Fuzz 532353396 (fallimento di assert con tipo statico).
  • Risolto GH-23662 (Evitato il warning NAN in print_r()).
  • Corretto GH-21999: incoerenza del GC con oggetti lazy, var_dump() e confronto tra oggetti.
  • Corretto OSS-Fuzz #536440507 (assertion errata per classi immutabili).
  • Risolto il report errato del supporto AVX quando il sistema operativo non aveva abilitato lo stato AVX.
  • Corretto GH-23980 (violazione ZEND_ASSERT @ ZEND_INCLUDE_OR_EVAL).
  • Risolto un use-after-free quando un’estensione caricata con dl() dichiara una funzione senza frame e una richiesta successiva la invoca.
  • Risolta l’emulazione della memoria condivisa System V su Windows che collegava segmenti oltre la fine della loro mappatura.
  • Corretto il rilancio di un’eccezione scatenata da un distruttore durante il GC in una Fiber, che non veniva rilanciata nel frame che attivò il GC.

BCMath:

  • Risolti casi in cui risultati di BcMathNumber che si troncano a zero mantenevano un segno negativo e confrontavano come minori di zero.

BZ2:

  • Corretto doppio close del descrittore e use-after-free dello stream interno quando bzopen() riceve una risorsa stream.

CLI:

  • Corretto GH-22567 (la SAPI CLI Windows ZTS deve aggiornare la sua cache TSRMLS durante l’attivazione della richiesta).
  • Risolto il bug GH-23764 (Il server integrato perde un descrittore di file ad ogni richiesta HEAD per un file statico).
  • Risolto crash del server integrato quando un client viene resettato prima di essere accettato.
  • Corretto il troncamento di una pagina di errore e la perdita della parte non inviata dopo una scrittura parziale su socket nel server integrato.

DOM:

  • Risolto use-after-free durante la ricostruzione di un DOMXPath le cui registrazioni php:function vengono liberate mentre sono ancora raggiungibili dal cycle collector.
  • Corretto DomHTMLDocument::getElementById() che non trovava gli id per elementi SVG e MathML.
  • Risolto DomHTMLDocument che assegnava agli attributi lo namespace dell’elemento quando un frammento veniva analizzato con un elemento di contesto xlink, xml o xmlns.
  • Fix GH-23887 (DomHTMLCollection::namedItem() poteva provocare assertion failure, hang o perdere il primo elemento).
  • Risolto DOMXPath e DomXPath che perdevano il nodo di contesto e i namespace in-scope di una valutazione dopo che un callback php:function() aveva valutato un’altra espressione sullo stesso oggetto.

FFI:

  • Risolti crash con callback FFI creati da trampoline di __call() e array-callable il cui oggetto viene rilasciato.

FTP:

  • Corretto GH-23619 (errore criptico su server che non supportano la ripresa di sessione TLS sulla connessione dati).

GD:

  • Risolto comportamento indefinito con immagini GD2 contenenti chunk di dimensione ‘INT_MAX’.
  • Corretto comportamento indefinito con GIF che contengono dati LZW compressi problematici.

Intl:

  • Corretto il cloning di IntlDateFormatter e MessageFormatter che perdeva lo stato lato PHP come dateType, timeType, calendar e il pattern del messaggio.
  • Risolto crash durante la conversione con un UConverter clonato che usa toUCallback/fromUCallback.
  • Corrette le funzioni di attributo e strength di Collator che non rifiutavano un Collator non costruito.
  • Risolto crash in intl_error_set_custom_msg() in assenza di un frame di chiamata attivo.
  • Corrette grapheme_strstr() e grapheme_stristr() che restituivano sottostringhe errate quando caratteri supplementari precedevano la corrispondenza.
  • Risolti grapheme_strstr() e grapheme_strpos() che mancavano corrispondenze canonicamente equivalenti, e ricerche grapheme che riportavano errori ICU per haystack vuoti.
  • Risolte grapheme_strrpos() e grapheme_strripos() che saltavano corrispondenze sovrapposte usando un offset negativo.
  • Corretto IntlDateFormatter::parse(), localtime() e parseToCalendar() che trattavano l’offset come unità UTF-16 invece che come byte.

Lexbor:

  • Unite le patch lexbor/lexbor@8a14bc0 e lexbor/lexbor@f67ce4b, correggendo un heap buffer overflow nel parsing di :lexbor-contains() e buffer overflow in replay di decode malformati.
  • Unite le patch lexbor/lexbor@859f100, lexbor/lexbor@a36e09a, lexbor/lexbor@b0f7412, lexbor/lexbor@1b215a8, lexbor/lexbor@385afff, lexbor/lexbor@e6c068f, lexbor/lexbor@327a8b6, lexbor/lexbor@917742f e lexbor/lexbor@e89c258, correggendo username scartati contenenti una chiocciola, memoria non inizializzata nella crescita del buffer IDNA, la codifica di uno spazio prima di query o frammento in un path opaco, perdita di query o frammento dopo un segmento ‘.’ in un path, percorsi di file con unità sostitutive, la codifica di output usata per percent-encoding, il puntatore tail di URLSearchParams e la serializzazione del frammento senza query.

MBString:

  • Risolto GH-23106 (mb_strpos() legge oltre la fine di un haystack terminante con una sequenza UTF-8 troncata).
  • Corrette funzioni mbstring che emettevano surrogate nell’output UTF-8 e lo segnalavano come UTF-8 valido.

MySQLi:

  • Fix GH-22854: risolta un’asserzione fallita quando si accede a una proprietà mysqli dopo un tentativo di riconnessione fallito.

MySQLnd:

  • Corretto field_count che non veniva azzerato su pacchetto OK.
  • Risolta perdita di memoria durante la chiusura di una prepared statement dopo che la connessione era stata terminata.

Opcache:

  • Corretto OSS-Fuzz #546798343 (Heap-buffer-overflow nell’ottimizzatore con FCCs e inlining).
  • Risolto bug GH-23693 (Tracing JIT produce risultati errati per una guard su un’addizione loop-invariante).
  • Corretto OSS-Fuzz #5674034779193344 (lettura di memoria non inizializzata in is_cacheable_stream_path()).
  • Fix al buffer overrun del call_stack in zend_analyze_calls().
  • Risolto GH-23628 (Tracing JIT legge slot di proprietà indefiniti di oggetti proxy lazy invece di inoltrare all’istanza reale).
  • Risolto GH-23679 (Tracing JIT scrive una proprietà privata del parent nella proprietà pubblica ombra del figlio).
  • Corrette molteplici DCE errate dovute ad analisi di escape insicure.
  • Risolto GH-24063 (L’ottimizzatore OPcache sostituisce ‘$cond ? -0.0 : 0.0’ con un singolo ‘-0.0’ costante).
  • Risolto il crash quando una file cache viene riutilizzata con un diverso insieme di estensioni che dichiarano funzioni frameless.
  • Risolto GH-23991 (JIT genera IR invalida per chiamate ricorsive multiple).
  • Fix SCCP per valutare isset()/empty() su dimensione di oggetto non-escaping.
  • Risolto GH-20890 (Segfault in zval_undefined_cv con hook di proprietà non semplice con minimal tracing JIT).

OpenSSL:

  • Corretto stream_socket_enable_crypto() che lasciava il socket non-bloccante dopo un timeout di handshake.
  • Risolto feof() su stream TLS che restava false dopo un close_notify su Windows.

PCNTL:

  • Corretto pcntl_signal_dispatch() che scartava i segnali in coda quando veniva eseguito mentre era pendente un’eccezione.
  • Risolto pcntl_signal_dispatch() che perdeva i segnali messi in coda dietro a un handler che lanciava.
  • Risolto bug GH-23986 (i percorsi /proc/self risolvevano al processo parent dopo pcntl_fork()).

PDO:

  • Corretto PDOStatement::getColumnMeta() che leggeva oltre i limiti per un indice di colonna non valido.
  • Risolto PDOStatement::bindColumn() che registrava un binding per un nome di colonna non presente nel result set.
  • Risolto PDOStatement::execute() che lasciava disponibile il risultato precedente dopo un’esecuzione fallita.
  • Corretto un use-after-free quando bindValue()/execute()/closeCursor() vengono chiamati da __toString() di un parametro bindato durante execute().
  • Fix GH-23962 (Distruggere un’istanza PDO persistente esegue rollback di una transazione ancora in uso da un’altra istanza).
  • Corretto PDO::setAttribute() che installava una classe PDO::ATTR_STATEMENT_CLASS i cui argomenti del costruttore venivano rifiutati.
  • Risolto il reporting di errori di tipo per PDO::ATTR_STATEMENT_CLASS constructor_args che riportavano “array given” indipendentemente dal valore passato.
  • Risolti leak del valore driver options in PDOStatement::bindParam() e bindColumn().
  • Risolto PDOStatement che non riportava i parametri e le colonne vincolate al cycle collector.
  • Fix PDOStatement::setFetchMode() che non applicava le modifiche in modo atomico.

PDO_DBLIB:

  • Risolto bug GH-23741 (segfault dopo una query fallita all’interno di una transazione PDO). Gli errori sollevati da beginTransaction(), commit(), rollBack() e lastInsertId() vengono ora segnalati invece di essere ignorati.

PDO_Firebird:

  • Corretto GH-23758 (PDO_Firebird restituiva null per BLOB vuoti non nulli).

PGSQL:

  • Risolto pg_lo_write() che rifiutava dati contenenti byte null.
  • Rimossa pg_service(), non disponibile con alcuna libreria libpq rilasciata.

Readline:

  • Risolto un heap over-read nel prompt della shell interattiva quando cli.prompt è impostato a stringa vuota.

Reflection:

  • Fix GH-23842 (ReflectionProperty::skipLazyInitialization() copiava valori costanti di default non validi con OPcache).

Session:

  • Risolto session_start() che continuava dopo un create_sid() fallito quando session.use_strict_mode rifiutava l’ID fornito.
  • Corrette eccezioni da handler create_sid() definiti dall’utente che venivano sostituite da errori di validazione del valore di ritorno.

SimpleXML:

  • Risolto il problema in cui la ricostruzione di una SimpleXMLElement liberava un elemento figlio ancora referenziato da un’altra variabile.

SOAP:

  • Corretto GH-22895 (Heap use-after-free durante la codifica di un Traversable con una chiave illegale).
  • Risolta perdita di memoria quando load_wsdl_ex() falliva il caricamento.

SQLite:

  • Risolto un crash quando SQLite3::close() viene chiamato da una callback userland.

Standard:

  • Corretto sha1_file() che restituiva un digest per dati incompleti dopo un fallimento di lettura dello stream.
  • Risolto iptcembed() che corrompeva gli header JPEG quando chiamato ricorsivamente da un output handler.
  • Fix proc_open() che perdeva il descrittore zero quando la configurazione dei descrittori falliva.
  • Corrette tre anomalie di proc_open() su Windows: PROCESS_INFORMATION non inizializzato, puntatore comspec indeterminato dopo una ricerca fallita, e un controllo mancante su CreateFileA().
  • Corretto il ciclo di vita del contesto stream persistente durante lo shutdown (Levi Morrison).
  • Fix wordwrap() che ignorava un’interruzione esistente alla fine della stringa (Nicolas Grekas).
  • Corretto convert.quoted-printable-decode che decodificava cifre esadecimali minuscole nel byte sbagliato.
  • Risolto chown() e lchown() che fallivano a risolvere nomi utente nelle build ZTS quando getpwnam_r() richiedeva un buffer più grande.

Tidy:

  • Risolto use-after-free quando un tidyNode viene usato dopo che il documento è stato riparsato.

Zlib:

  • Corretto inflate_init() che scartava il dizionario preset per stream raw con una window non di default.

Leggi qui le note di rilascio complete.

Read More

Messaggi simili:

LEGGI  Amazon Rivoluziona il Kindle: Nuovo Design in Alluminio, Pagina Più Rapida e Telecomando Bluetooth a $35