Aktuellt läge: PHP2Shell. Två kritiska PHP-sårbarheter (CVSS 9,2) tillåter skadlig kod utan inloggning. Patchar sedan den 21 oktober 2026.Vad som bör göras nu →

Zend Engine: PHP:s hjärta

Zend Engine översätter PHP-kod till opcodes och kör dem. Den som känner dess byggstenar förstår varför fel i kärnan, som PHP2Shell, bara åtgärdas med en PHP-uppdatering.

Aktualitet 4 min läsningPHP-kunskap

Kort sagt: Zend Engine är kärnan i PHP. Den översätter PHP-kod till opcodes, kör dem i en virtuell maskin och hanterar variabler och minne. Sedan PHP 4 finns den i varje PHP-installation. Eftersom PHP2Shell-sårbarheterna ligger i den här kärnan hjälper varken plugin eller CMS-uppdateringar, utan bara ett uppdaterat PHP med omstart.

Vad är Zend Engine?

Zend Engine är den del av PHP som gör det egentliga arbetet. Allt annat, till exempel kopplingen till webbservern eller tillägg för databaser, bygger på den. Man kan jämföra den med en bils motor: kaross och utrustning skiljer sig åt, motorn driver allt.

Enligt PHP-manualen är namnet bildat av förnamnen på utvecklarna Zeev Suraski och Andi Gutmans. Motorn presenterades i mitten av 1999 och var från PHP 4.0, utgiven i maj 2000, kärnan i PHP. Sedan dess har den omarbetats i grunden flera gånger.

PHP-version Motor Viktigaste ändring enligt manualen och RFC-dokument
PHP 4.0 (2000) Zend Engine första gemensamma kärnan, bättre prestanda
PHP 5.0 (2004) Zend Engine 2.0 ny objektmodell
PHP 7.0 (2015) Zend Engine 3.0 PHPNG: kompaktare datastrukturer, AST
PHP 8.0 (2020) vidareutveckling JIT-kompilator som del av OPcache

Byggstenarna: kompilator, virtuell maskin, minne

Motorn arbetar i tydligt åtskilda steg. Sedan PHP 7 är det enligt RFC:t om det abstrakta syntaxträdet tre faser fram till bytekoden:

  1. Lexer: delar upp källtexten i tokens, till exempel nyckelord, variabelnamn och teckensträngar.
  2. Parser: bygger av tokens ett abstrakt syntaxträd (AST) som återger programmets struktur.
  3. Kompilator: skapar av AST op-arrayer, alltså listor med opcodes, en per fil och funktion.
  4. Executor (Zend VM): går igenom opcodes. Enligt JIT-RFC:t hör det till varje opcode en handler-funktion som utför den.
  5. Minneshantering: reserverar och frigör minne för varje förfrågan och övervakar därvid gränsen i memory_limit.

Ett skripts tokens kan göras synliga med tillägget Tokenizer. Det är ofarligt och lärorikt:

<?php
$code = '<?php $summe = 2 + 3; echo $summe;';
foreach (token_get_all($code) as $token) {
    if (is_array($token)) {
        echo token_name($token[0]), ': ', trim($token[1]), "\n";
    } else {
        echo 'Zeichen: ', $token, "\n";
    }
}

Utdata visar poster som T_VARIABLE: $summe eller T_LNUMBER: 2. Det är just med de här byggstenarna parsern arbetar vidare.

Hur hanterar Zend Engine variabler?

Enligt manualen ligger varje PHP-variabel i en behållare som heter zval. Den innehåller typ och värde samt förvaltningsuppgifter, bland annat en referensräknare (refcount). Räknaren anger hur många variabelnamn som pekar på samma behållare.

<?php
$a = str_repeat('x', 10);
$b = $a;        // ingen kopiering, båda pekar på samma värde
$b .= 'y';      // först nu kopieras det (copy on write)
unset($a);      // räknaren minskar, minnet frigörs när den når 0

Når räknaren noll frigör motorn minnet. För cirkelreferenser mellan objekt finns dessutom en garbage collector. Mer om detta i artikeln Minneshantering i PHP.

Omarbetningen PHPNG för PHP 7 satte in just här. Enligt RFC:t av Dmitry Stogov och Zeev Suraski handlade det om kompaktare datastrukturer och ett smartare sätt att representera värden. RFC:t angav prestandavinster på 20 till 110 procent i verkliga applikationer.

OPcache och JIT: tillägg till motorn

Utan cache översätter motorn varje skript på nytt vid varje förfrågan. OPcache håller färdiga opcodes redo i delat minne. Sedan PHP 8.0 finns dessutom en JIT-kompilator. Enligt RFC:t bygger den på DynASM, ett verktyg från LuaJIT-projektet, och skapar maskinkod direkt av bytekoden. Den virtuella maskinen förblir därvid oförändrad; JIT ersätter bara handlarnas ingångspunkter.

För driftansvariga betyder det: OPcache och JIT gör motorn snabbare men ändrar ingenting i dess beteende vid fel. En sårbarhet i kärnan finns kvar även med aktiv cache.

Varför sårbarheter i motorn väger särskilt tungt

De båda PHP2Shell-sårbarheterna ligger i PHP:s kärna. Vid CVE-2026-109618 kan ett out-of-memory-tillstånd avbryta motorn medan förfrågningsdata bara delvis är initialiserade; vid uppstädningen behandlas ogiltiga data sedan som giltiga. Vid CVE-2026-109619 finns internt tillstånd kvar sedan minnet frigjorts och kan användas av en senare förfrågan i samma worker.

De rättade versionerna 8.5.12, 8.4.27, 8.3.36 och 8.2.35 ändrar enligt PHP-manualen också beteendet hos minnesgränsen: memory_limit är där en mjuk gräns, och en ny inställning, memory_hard_limit_percent, fastställer ett hårt tak. Manualen påpekar att en version som inte känner till den här inställningen berörs av sårbarheterna. För distributioner med backports räknas dessutom paketets changelog.

Viktigt

Motorn är laddad i varje PHP-process. Efter uppdateringen måste därför alla PHP-FPM-workers, Apache-processer med mod_php och övriga PHP-tjänster startas om.

Vad som sker inuti vid minnesbrist beskrivs i artikeln memory_limit och out-of-memory. Själva sårbarheten placeras in under CVE-2026-109618.

Hur hjälper PHP SOS konkret?

  • Kontrollera version och paketstatus: Vi tar reda på vilken motorversion som faktiskt körs, inklusive backports från er distribution.
  • Uppdatera och starta om: Via PHP-patchtjänsten installerar vi uppdateringen och kontrollerar att ingen process med gammal kod blir kvar.
  • Sätta minnesgränser rimligt: Vi anpassar memory_limit, den nya hårda gränsen och cgroup-gränser till er applikation.
  • Utreda avvikelser: Krascher hos workers eller processer med exit-status 137 bedömer vi och kontrollerar om ett angrepp kan ligga bakom.

Vanliga frågor

Varifrån har Zend Engine fått sitt namn?

Namnet består av förnamnen på utvecklarna: Zeev Suraski och Andi Gutmans. Enligt PHP-manualen presenterades motorn i mitten av 1999 och var från PHP 4.0 i maj 2000 kärnan i PHP.

Är Zend Engine en egen produkt som jag måste installera?

Nej. Zend Engine är en fast del av varje PHP-installation. Den som uppdaterar PHP uppdaterar automatiskt också motorn. Med företaget Zends kommersiella produkter har det inget att göra.

Vad är en opcode?

En opcode är ett enskilt kommando för PHP:s virtuella maskin, till exempel en addition, ett funktionsanrop eller en tilldelning. Kompilatorn översätter varje skript till en följd av sådana kommandon som motorn sedan går igenom.

Vad har Zend Engine med memory_limit att göra?

Motorn hanterar minnet för varje förfrågan och håller sig därvid till gränsen i memory_limit. Sedan säkerhetsreleaserna den 21 oktober 2026 är den gränsen enligt manualen en mjuk gräns, kompletterad med en hård gräns via memory_hard_limit_percent.

Källor

Direktkontakt

Varje timme räknas. Skriv till oss nu.

Beskriv kort system, PHP-version och observation. Vi hör av oss, klarlägger läget och arbetar på distans tills incidenten är avslutad och dokumenterad.

Direkthjälp