Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

Zend Engine: PHP süda

Zend Engine tõlgib PHP koodi opcode'ideks ja käivitab need. Kes tema osi tunneb, mõistab, miks tuumas olevad augud nagu PHP2Shell kõrvaldab ainult PHP uuendus.

Seis Lugemisaeg 4 minPHP teadmised

Lühidalt: Zend Engine on PHP tuum. See tõlgib PHP koodi opcode'ideks, käivitab need virtuaalmasinas ning haldab seejuures muutujaid ja mälu. Alates PHP 4-st asub see igas PHP paigalduses. Kuna PHP2Shelli augud asuvad selles tuumas, ei aita pistikprogrammid ega CMS-i uuendused, vaid ainult uuendatud PHP koos taaskäivitusega.

Mis on Zend Engine?

Zend Engine on PHP osa, mis teeb tegeliku töö. Kõik muu, näiteks ühendus veebiserveriga või andmebaaside laiendused, toetub sellele. Seda võib võrrelda auto mootoriga: kere ja varustus on erinevad, mootor ajab kõike.

PHP käsiraamatu järgi on nimi moodustatud arendajate Zeev Suraski ja Andi Gutmansi eesnimedest. Mootor tutvustati 1999. aasta keskel ja oli alates PHP 4.0-st, mis ilmus 2000. aasta mais, PHP tuum. Sestsaadik on seda mitu korda põhjalikult ümber töötatud.

PHP versioon Mootor Olulisim muudatus käsiraamatu ja RFC-de järgi
PHP 4.0 (2000) Zend Engine esimene ühine tuum, parem jõudlus
PHP 5.0 (2004) Zend Engine 2.0 uus objektimudel
PHP 7.0 (2015) Zend Engine 3.0 PHPNG: kompaktsemad andmestruktuurid, AST
PHP 8.0 (2020) edasiarendus JIT-kompilaator OPcache'i osana

Osad: kompilaator, virtuaalmasin, mälu

Mootor töötab selgelt eraldatud etappidena. Alates PHP 7-st on abstraktse süntaksipuu RFC järgi baitkoodini kolm faasi:

  1. Lexer: jaotab lähtekoodi tokeniteks, näiteks märksõnadeks, muutujanimedeks ja sõneks.
  2. Parser: ehitab tokenitest abstraktse süntaksipuu (AST), mis kujutab programmi struktuuri.
  3. Kompilaator: loob AST-st op-arrayd ehk opcode'ide nimekirjad, ühe iga faili ja funktsiooni kohta.
  4. Executor (Zend VM): töötab opcode'id läbi. JIT-RFC järgi kuulub igale opcode'ile käsitlejafunktsioon, mis seda käivitab.
  5. Mäluhaldus: reserveerib ja vabastab iga päringu mälu ning jälgib seejuures memory_limit piiri.

Skripti tokeneid saab laiendusega Tokenizer nähtavaks teha. See on kahjutu ja õpetlik:

<?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";
    }
}

Väljund näitab kirjeid nagu T_VARIABLE: $summe või T_LNUMBER: 2. Just nende ehituskividega töötab parser edasi.

Kuidas Zend Engine muutujaid haldab?

Iga PHP muutuja asub käsiraamatu järgi konteineris nimega zval. See sisaldab tüüpi ja väärtust ning haldusandmeid, sealhulgas viiteloendurit (refcount). Loendur näitab, mitu muutujanime viitab samale konteinerile.

<?php
$a = str_repeat('x', 10);
$b = $a;        // kopeerimist ei toimu, mõlemad viitavad samale väärtusele
$b .= 'y';      // alles nüüd kopeeritakse (copy on write)
unset($a);      // loendur väheneb, mälu vabaneb, kui see jõuab 0-ni

Kui loendur jõuab nullini, vabastab mootor mälu. Objektide vaheliste ringviidete jaoks on lisaks prügikoguja. Lisateavet leiate artiklist Mäluhaldus PHP-s.

PHP 7 ümbertöötlus PHPNG võttis ette just selle koha. Dmitry Stogovi ja Zeev Suraski RFC järgi oli eesmärk kompaktsemad andmestruktuurid ja nutikam väärtuste esitus. RFC nimetas jõudluse kasvuks 20 kuni 110 protsenti päris rakendustes.

OPcache ja JIT: mootori laiendused

Ilma vahemäluta tõlgib mootor iga skripti igal päringul uuesti. OPcache hoiab valmis opcode'id jagatud mälus kättesaadavana. Alates PHP 8.0-st on lisaks JIT-kompilaator. RFC järgi põhineb see DynASM-il, LuaJIT projekti tööriistal, ja loob masinkoodi otse baitkoodist. Virtuaalmasin jääb seejuures muutumatuks; JIT asendab ainult käsitlejate sisenemispunktid.

Käitajale tähendab see: OPcache ja JIT kiirendavad mootorit, kuid ei muuda selle käitumist vigade korral. Tuumas olev turvaauk jääb alles ka aktiivse vahemäluga.

Miks mootoris olevad augud kaaluvad eriti palju

Mõlemad PHP2Shelli augud asuvad PHP tuumas. CVE-2026-109618 puhul võib Out-of-Memory olukord mootori töö katkestada ajal, mil päringuandmed on alles osaliselt lähtestatud; koristamisel käsitletakse kehtetuid andmeid siis kehtivatena. CVE-2026-109619 puhul jääb sisemine olek pärast mälu vabastamist alles ja hilisem päring samas workeris võib seda kasutada.

Parandatud versioonid 8.5.12, 8.4.27, 8.3.36 ja 8.2.35 muudavad PHP käsiraamatu järgi ka mälupiiri käitumist: memory_limit on seal pehme piir, uus säte memory_hard_limit_percent määrab kõva ülempiiri. Käsiraamat juhib tähelepanu, et versioon, mis seda sätet ei tunne, on turvaaukudest mõjutatud. Backportidega distributsioonide puhul loeb lisaks paketi muudatuslogi.

Oluline

Mootor on laaditud igasse PHP protsessi. Pärast uuendust tuleb seetõttu kõik PHP-FPM workerid, mod_php-ga Apache'i protsessid ja muud PHP teenused uuesti käivitada.

Mis sees mälupuuduse korral toimub, kirjeldab artikkel memory_limit ja Out-of-Memory. Turvaaugu enda hinnang asub lehel CVE-2026-109618.

Kuidas PHP SOS konkreetselt aitab?

  • Versiooni ja paketi seisu kontroll: Selgitame välja, milline mootori seis tegelikult töötab, kaasa arvatud teie distributsiooni backportid.
  • Uuendamine ja taaskäivitamine: PHP paigateenuse kaudu paigaldame uuenduse ja kontrollime, et ükski protsess ei jää vana koodiga alles.
  • Mälupiiride mõistlik seadmine: Sobitame memory_limit-i, uue kõva piiri ja cgroup-piirid teie rakendusega.
  • Kõrvalekallete uurimine: Workerite kokkujooksmised või väljumisolekuga 137 protsessid hindame ja kontrollime, kas taga võib olla rünnak.

Korduma kippuvad küsimused

Kust Zend Engine nime sai?

Nimi koosneb arendajate eesnimedest: Zeev Suraski ja Andi Gutmans. Mootor tutvustati PHP käsiraamatu järgi 1999. aasta keskel ja oli alates PHP 4.0-st 2000. aasta mais PHP tuum.

Kas Zend Engine on eraldi toode, mille pean paigaldama?

Ei. Zend Engine on iga PHP paigalduse lahutamatu osa. Kes PHP-d uuendab, uuendab automaatselt ka mootorit. Zendi ettevõtte kommertstoodetega sel pistmist ei ole.

Mis on opcode?

Opcode on üksik käsk PHP virtuaalmasinale, näiteks liitmine, funktsiooni väljakutse või omistamine. Kompilaator tõlgib iga skripti selliste käskude jadaks, mille mootor seejärel läbi töötab.

Mis pistmist on Zend Engine'il memory_limit'iga?

Mootor haldab iga päringu mälu ja jälgib seejuures memory_limit piiri. Alates 21.10.2026 turvaväljalasetest on see piir käsiraamatu järgi pehme piir, mida täiendab memory_hard_limit_percent kaudu kõva piir.

Allikad

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi