PHP is een open source, algemeen inzetbare scriptingtaal aan de serverzijde die oorspronkelijk is ontworpen voor webontwikkeling om dynamische webpagina’s te genereren. Het is een van de eerste server-side scriptingtalen die in een HTML-brondocument worden ingebed in plaats van een extern bestand te roepen om gegevens te verwerken. De code wordt geïnterpreteerd door een webserver met een PHP-processor-module die de resulterende webpagina genereert. PHP is ook geëvolueerd en bevat nu een opdrachtregelinterface (CLI) en kan worden gebruikt in standalone grafische applicaties.
Als u nieuw bent met PHP en een idee wilt krijgen van hoe het werkt, probeer dan de introductietutorial.
Daarna kunt u de online handleiding bekijken.
Wat is er nieuw
PHP 8.5.12 verhelpt twee kritieke kwetsbaarheden die ongeauthentiseerde remote code execution mogelijk kunnen maken. Alle PHP-gebruikers wordt dringend aangeraden onmiddellijk bij te werken.
Wie loopt risico: alle PHP-installaties die webverzoeken bedienen, inclusief PHP-FPM, Apache met mod_php, php-cgi, FrankenPHP en LiteSpeed. We schatten het risico het hoogst voor mod_php, met een gedemonstreerde exploit waarbij een ongeauthenticeerd verzoek de aanval kan triggeren voordat enige applicatiecode wordt uitgevoerd.
De kwetsbaarheden:
- RCE via OOM-corruptie, CVE-2026-109618 (GHSA-w8hw-w9fx-j79w): out-of-memory-afhandeling kan PHP onderbreken terwijl interne requestgegevens slechts gedeeltelijk zijn geïnitialiseerd. Bij het opruimen van het verzoek kan de ongeldige data vervolgens als geldig worden behandeld.
- RCE via verouderde globale staat, CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp): intern request-eigendom kan blijven bestaan nadat het onderliggende geheugen is vrijgegeven. Een later verzoek dat door dezelfde worker wordt afgehandeld kan die verouderde staat gebruiken voordat normale initialisatie deze reset.
Hoe te updaten:
- Werk bij naar PHP 8.5.12.
- Linux-distributies en LTS-leveranciers hebben de patches vooraf ontvangen, controleer uw leverancier voor bijgewerkte pakketten.
- PHP 8.1 en ouder ontvangen geen updates meer van het PHP-project. Sommige distributies en LTS-leveranciers bieden teruggeporte fixes, neem contact op met uw leverancier voor details of upgrade naar een ondersteunde versie.
- Gezien de ernst van deze kwetsbaarheden heeft het PHP-securityteam minimale bron-backports geleverd voor PHP 7.4, PHP 8.0 en PHP 8.1 om mensen te helpen die zelf vanuit bron bouwen of geen toegang hebben tot een LTS-leverancier.
- Als u niet onmiddellijk kunt updaten: hoewel alleen een update een volledige oplossing biedt, verminderen de volgende maatregelen de blootstelling aan specifieke aanvalspaden maar maken een installatie niet veilig.
RCE via OOM-corruptie (CVE-2026-109618):
- Stel memory_limit=-1 in, bij voorkeur op een manier waarop applicaties dit niet kunnen overschrijven, bijvoorbeeld via php_admin_value in de FPM-pool of in de Apache-configuratie, en controleer dat geen pool-, directory- of applicatie-instelling een eindige limiet terugzet. Dit verwijdert het bestuurbare PHP-geheugenlimietfalen, maar een onderliggende allocatiefout kan nog steeds het kwetsbare pad bereiken.
- Stel een lage post_max_size in. Voor applicaties die geen bestanduploads nodig hebben, stel post_max_size = 8M in. Als bestanduploads noodzakelijk zijn, stel post_max_size = 32M in. Houd upload_max_filesize onder post_max_size. Overweeg het afdwingen van limieten op server- of proxy-niveau voor gedecodeerde requestgrootte, aantal invoervelden, aantal multipart-delen, aantal headers en diepte van geneste structuren. Deze limieten moeten ook verzoeken zonder bruikbare Content-Length dekken.
- Gebruik een container- of cgroup-limiet als beschikbaarheidsgrens, bij voorkeur met een beleid dat alleen de getroffen worker beëindigt. Vervang niet door RLIMIT_AS of RLIMIT_DATA, omdat deze de kwetsbare allocatiefout kunnen veroorzaken.
RCE via verouderde globale staat (CVE-2026-109619):
- Stel session.upload_progress.enabled=0 in en herstart elke worker. Gebruik php.ini, een FPM-pool- of serverconfiguratie die van kracht is vóór het parsen van verzoeken. Vertrouw niet op ini_set() of FPM .user.ini. Dit blokkeert de bevestigde session-paden maar niet andere varianten.
- Op PHP 8.5, stel fatal_error_backtraces=0 in en herstart elke worker. Dit blokkeert alleen het bevestigde pad via fatale backtraces.
- Verwijder ongeldige of verouderde instellingen die per verzoek worden toegepast en diagnostische meldingen genereren vóór initialisatie. Het verbergen van diagnostiek met error_reporting, display_errors of @ helpt niet.
- Los fatale fouten en timeouts op die door een aanvaller bereikbaar zijn, inclusief fouten in callbacks, upload- of importverwerking en opruiming.
Het PHP-ontwikkelingsteam kondigt de onmiddellijke beschikbaarheid van PHP 8.5.12 aan. Dit is een beveiligingsrelease die twee kritieke kwetsbaarheden (CVE-2026-109618, CVE-2026-109619) verhelpt die ongeauthentiseerde remote code execution mogelijk kunnen maken. Alle PHP 8.5-gebruikers wordt dringend aangeraden onmiddellijk bij te werken.
Er zijn geen volledige mitigaties; bijwerken is de enige veilige keuze. Zie het security advisory voor details.
Versie 8.5.12:
Kern:
- Opgelost GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp (Voorkom staatscorruptie via bailout).
- Opgelost bug GH-23644 (Optimizer laat een constant-tegen-constant vergelijking ongedeugd achter, wat de VM crasht in zval_undefined_cv).
- Opgelost OSS-Fuzz 532353396 (assertion failure met statisch type).
- Opgelost GH-23662 (Voorkom NAN-waarschuwing in print_r()).
- Opgelost GH-21999: GC-inconsistentie met lazy object, var_dump() en objectvergelijking.
- Opgelost OSS-Fuzz #536440507 (Onjuiste assertie voor immutable class).
- Opgelost dat AVX werd gerapporteerd als ondersteund terwijl het OS de AVX-toestand niet had ingeschakeld.
- Opgelost GH-23980 (ZEND_ASSERT schending @ ZEND_INCLUDE_OR_EVAL).
- Opgelost use-after-free wanneer een via dl() geladen extensie een frameloze functie declareert en een later verzoek deze aanroept.
- Opgelost System V shared memory-emulatie voor Windows die segmenten koppelde voorbij het einde van hun mapping.
- Opgelost dat een uitzondering die door een destructor tijdens GC in een Fiber werd gegooid niet opnieuw in het frame werd gegooid dat de GC triggerde.
BCMath:
- Opgelost dat BcMathNumber-resultaten die naar nul worden afgekapt een negatief teken behielden en kleiner dan nul vergeleken werden.
BZ2:
- Opgelost dubbele sluiting van de descriptor en use-after-free van de binnenste stream wanneer bzopen() een streamresource krijgt.
CLI:
- Opgelost GH-22567 (Windows ZTS CLI SAPI moet zijn TSRMLS-cache verversen tijdens request-activatie).
- Opgelost bug GH-23764 (De ingebouwde server lekt een bestanddescriptor bij elke HEAD-request voor een statisch bestand).
- Opgelost crash in de ingebouwde server wanneer een client wordt gereset voordat deze is geaccepteerd.
- Opgelost dat de ingebouwde server een foutpagina afkapt en het ongestuurde deel lekt na een gedeeltelijke socket-write.
DOM:
- Opgelost use-after-free bij het reconstrueren van een DOMXPath waarvan php:function-registraties werden vrijgegeven terwijl ze nog bereikbaar waren vanuit de cycle collector.
- Opgelost DomHTMLDocument::getElementById() dat id’s van SVG- en MathML-elementen niet vond.
- Opgelost dat DomHTMLDocument attributen de namespace van hun element gaf wanneer een fragment werd geparsed met een xlink-, xml- of xmlns-contextelement.
- Opgelost bug GH-23887 (DomHTMLCollection::namedItem() assertiefout, hang of gemist eerste element).
- Opgelost dat DOMXPath en DomXPath de contextnode en in-scope namespaces van een evaluatie verloren na een php:function() callback die een andere expressie op hetzelfde object evalueerde.
FFI:
- Opgelost crashes met FFI-callbacks gemaakt van __call()-trampolines en array-callables waarvan het object is vrijgegeven.
FTP:
- Opgelost bug GH-23619 (cryptische fout op servers die geen TLS-session-resumption op de dataverbinding ondersteunen).
GD:
- Opgelost ongedefinieerd gedrag met GD2-afbeeldingen met ‘INT_MAX’-grote chunks.
- Opgelost ongedefinieerd gedrag met GIFs met problematische LZW-compressiedata.
Intl:
- Opgelost dat het klonen van IntlDateFormatter en MessageFormatter PHP-zijde staat verloor zoals dateType, timeType, calendar en het message-patroon.
- Opgelost een crash bij conversie met een gekloonde UConverter die toUCallback/fromUCallback gebruikt.
- Opgelost dat Collator attribute- en strength-methoden een niet-geconstrueerde Collator niet afwezen.
- Opgelost crash in intl_error_set_custom_msg() zonder een actief call frame.
- Opgelost dat grapheme_strstr() en grapheme_stristr() onjuiste substrings teruggaven wanneer aanvullende (supplementary) karakters de match voorafgaan.
- Opgelost dat grapheme_strstr() en grapheme_strpos() canoniek equivalente matches misten, en dat grapheme-zoekopdrachten ICU-fouten rapporteerden voor lege haystacks.
- Opgelost dat grapheme_strrpos() en grapheme_strripos() overlappende matches oversloegen bij gebruik van een negatieve offset.
- Opgelost dat IntlDateFormatter::parse(), localtime() en parseToCalendar() de offset behandelden als UTF-16 code units in plaats van bytes.
Lexbor:
- Geïntegreerde patches lexbor/lexbor@8a14bc0 en lexbor/lexbor@f67ce4b, waarmee een heap buffer overflow in :lexbor-contains() parsing en buffer overflows in malformed decode replay zijn verholpen.
- Geïntegreerde patches lexbor/lexbor@859f100, lexbor/lexbor@a36e09a, lexbor/lexbor@b0f7412, lexbor/lexbor@1b215a8, lexbor/lexbor@385afff, lexbor/lexbor@e6c068f, lexbor/lexbor@327a8b6, lexbor/lexbor@917742f en lexbor/lexbor@e89c258, waarmee gedropte gebruikersnamen met een at-teken, niet-geïnitialiseerd geheugen bij IDNA-buffergroei, de codering van een spatie voor een query of fragment in een opaque path, een query of fragment die verloren ging na een dotsegment in een pad, vervangende file drive-paden, de uitvoercodering voor percent-encoding, de URLSearchParams tail pointer en fragment-serialisatie zonder query zijn opgelost.
MBString:
- Opgelost bug GH-23106 (mb_strpos() leest voorbij het einde van een haystack die eindigt in een afgebroken UTF-8-sequentie).
- Opgelost mbstring-functies die surrogates uitstoten in UTF-8-uitvoer en dit als valide UTF-8 markeerden.
MySQLi:
- Opgelost GH-22854: gefixeerde assertion bij toegang tot mysqli-eigenschap na mislukte herverbinding.
MySQLnd:
- Opgelost dat field_count niet werd gereset bij een OK-pakket.
- Opgelost geheugenlek bij het sluiten van een prepared statement nadat de verbinding werd verbroken.
Opcache:
- Opgelost OSS-Fuzz #546798343 (Heap-buffer-overflow in optimizer met FCCs en inlining).
- Opgelost bug GH-23693 (Tracing JIT produceert verkeerde resultaten voor een guard op een loop-invariant optelling).
- Opgelost OSS-Fuzz #5674034779193344 (Lezen van niet-geïnitialiseerd geheugen in is_cacheable_stream_path()).
- Opgelost zend_analyze_calls() call_stack buffer overrun.
- Opgelost bug GH-23628 (Tracing JIT leest undefined property slots van lazy proxy-objecten in plaats van door te sturen naar de echte instantie).
- Opgelost bug GH-23679 (Tracing JIT schrijft een parent private property in een shadowing public property van een child).
- Verschillende onjuiste DCE’s gecorrigeerd als gevolg van onbetrouwbare escape-analyse.
- Opgelost bug GH-24063 (OPcache optimizer vouwt ‘$cond ? -0.0 : 0.0’ samen tot een enkele ‘-0.0’ constante).
- Opgelost crash wanneer een file cache wordt hergebruikt met een andere set extensies die frameloze functies declareren.
- Opgelost bug GH-23991 (JIT genereert ongeldige IR voor meerdere recursieve calls).
- Opgelost SCCP-evaluatie van isset()/empty() op dimensie van een niet-escapend object.
- Opgelost bug GH-20890 (Segfault in zval_undefined_cv met niet-simpele property hook bij minimale tracing JIT).
OpenSSL:
- Opgelost dat stream_socket_enable_crypto() de socket non-blocking liet na een handshake-timeout.
- Opgelost dat feof() op een TLS-stream false bleef na een close_notify op Windows.
PCNTL:
- Opgelost dat pcntl_signal_dispatch() de in wachtrij geplaatste signals liet vallen wanneer het draaide terwijl een uitzondering in afwachting was.
- Opgelost dat pcntl_signal_dispatch() signals liet vallen die achter een handler stonden die een uitzondering gooit.
- Opgelost bug GH-23986 ( /proc/self-paden oplossen naar het ouderproces na pcntl_fork()).
PDO:
- Opgelost dat PDOStatement::getColumnMeta() out-of-bounds leest voor een ongeldig kolomindex.
- Opgelost dat PDOStatement::bindColumn() een binding registreert voor een kolomnaam die niet in de resultset staat.
- Opgelost dat PDOStatement::execute() het vorige resultaat beschikbaar laat na een mislukte uitvoering.
- Opgelost een use-after-free wanneer bindValue()/execute()/closeCursor() wordt aangeroepen vanuit de __toString() van een gebonden parameter tijdens execute().
- Opgelost bug GH-23962 (Het vernietigen van een persistente PDO-instantie rolt een transactie terug die nog in gebruik is door een andere instantie).
- Opgelost dat PDO::setAttribute() een PDO::ATTR_STATEMENT_CLASS installeert waarvan de constructor-argumenten worden afgewezen.
- Opgelost dat PDO::ATTR_STATEMENT_CLASS constructor_args typefouten “array gegeven” rapporteerden ongeacht de waarde die werd doorgegeven.
- Opgelost dat PDOStatement::bindParam() en bindColumn() de driver options-waarde lekten.
- Opgelost dat PDOStatement zijn gebonden parameters en kolommen niet rapporteerde aan de cycle collector.
- Opgelost dat PDOStatement::setFetchMode() wijzigingen niet atomair toepaste.
PDO_DBLIB:
- Opgelost bug GH-23741 (segfault na een mislukte query binnen een PDO-transactie). Fouten opgewekt door beginTransaction(), commit(), rollBack() en lastInsertId() worden nu gerapporteerd in plaats van te worden weggegooid.
PDO_Firebird:
- Opgelost bug GH-23758 (PDO_Firebird retourneert null voor niet-null lege BLOBs).
PGSQL:
- Opgelost dat pg_lo_write() data die null-bytes bevatte weigerde.
- pg_service() verwijderd, niet beschikbaar met enige vrijgegeven libpq.
Readline:
- Opgelost heap over-read in de interactieve shellprompt wanneer cli.prompt is ingesteld op een lege string.
Reflection:
- Opgelost bug GH-23842 (ReflectionProperty::skipLazyInitialization() kopieert ongeldige constante defaults met OPcache).
Session:
- Opgelost dat session_start() doorging na een mislukte create_sid() wanneer session.use_strict_mode het geleverde ID afwees.
- Opgelost dat uitzonderingen van gebruikerdefined create_sid()-handlers werden vervangen door return-value validatiefouten.
SimpleXML:
- Opgelost dat het reconstrueren van een SimpleXMLElement een child-element vrijgaf dat nog door een andere variabele werd gerefereerd.
SOAP:
- Opgelost bug GH-22895 (Heap use-after-free tijdens het encoden van een Traversable met een ongeldige sleutel).
- Opgelost geheugenlek wanneer load_wsdl_ex() niet kon laden.
SQLite:
- Opgelost crash wanneer SQLite3::close() wordt aangeroepen vanuit een userland-callback.
Standaard:
- Opgelost sha1_file() dat een digest retourneerde voor onvolledige data na een stream-read-fout.
- Opgelost iptcembed() dat JPEG-headers beschadigde bij recursief aanroepen vanuit een output handler.
- Opgelost proc_open() dat descriptor nul lekte wanneer descriptor-setup faalde.
- Opgelost drie Windows-only proc_open() defects: een niet-geïnitialiseerd PROCESS_INFORMATION, een onbepaalde comspec-pointer na een mislukte lookup, en een ongecontroleerde CreateFileA() fout.
- Herstel van levensduur van persistent streamcontext tijdens shutdown (Levi Morrison).
- Herstel van wordwrap() dat een bestaande regelafbreking aan het einde van de string negeerde (Nicolas Grekas).
- Opgelost convert.quoted-printable-decode die kleine hex-cijfers naar de verkeerde byte decodeerde.
- Opgelost chown() en lchown() die niet slaagden in het resolven van gebruikersnamen in ZTS-builds wanneer getpwnam_r() een grotere buffer nodig had.
Tidy:
- Opgelost use-after-free wanneer een tidyNode wordt gebruikt nadat het document opnieuw is geparsed.
Zlib:
- Opgelost inflate_init() dat het preset-dictionary liet vallen voor raw streams met een niet-standaard window.
Lees hier de volledige release-opmerkingen.
