PHP2Shell: näin paikkasimme 88 PHP-projektia kolmessa tunnissa

PHP-tiimi julkaisi 21. lokakuuta 2026 klo 14.00 UTC korjaukset kahteen kriittiseen haavoittuvuuteen, CVE-2026-109618 ja CVE-2026-109619, joiden nimi on PHP2Shell. Aloitimme noin tuntia myöhemmin. Noin klo 17.00 UTC kaikki ylläpitämämme palvelimet oli suojattu: 88 projektia tukemme piirissä. Kerromme tässä, miten teimme sen ja mikä hidasti, koska samat esteet ovat vastassa monella palvelimella, jota kukaan ei ole vielä paikannut.

Jos haluat vain tietää, koskeeko tämä sivustoasi ja mitä kysyä hostingilta, lue ensimmäinen kirjoituksemme PHP2Shellistä.

Ensimmäinen tunti: hyökkäyspolku poikki kaikkialta

Korjatun PHP:n asentaminen kymmenille palvelimille vie aikaa. Haavoittuvan mekanismin kytkeminen pois vie minuutteja. Siksi teimme sen ensin, jokaisella palvelimella, ennen kuin käänsimme mitään.

PHP:n tietoturvatiedote nimeää session.upload_progress.enabled-asetuksen yhdeksi CVE-2026-109619:n poluista. Asetimme sen pois päältä jokaisen PHP-version pääkonfiguraatiossa jokaisella palvelimella ja käynnistimme PHP-prosessit uudelleen. Tiedote varoittaa, että .user.ini ja ini_set() eivät riitä, joten muutimme palvelintason tiedostoja. PHP 8.5:ssä kytkimme lisäksi pois fatal_error_backtraces-asetuksen, kuten tiedote neuvoo.

Tämä sulki vain CVE-2026-109619:n vahvistetun session-polun. CVE-2026-109618 vaati itse päivityksen.

Kolme palvelintyyppiä, kolme tapaa paikata

88 projektiamme toimivat erilaisilla kokoonpanoilla, ja jokainen tarvitsi oman reittinsä.

Palvelimet, joiden PHP tulee jakelun paketeista. Näissä korjaus tulee pakettien ylläpitäjiltä. Ubuntu julkaisi korjatut paketit julkaisupäivänä. Yksi asia kannattaa tietää, jos tarkistat tällaista palvelinta: päivityksen jälkeen php -v voi yhä näyttää vanhaa numeroa, esimerkiksi 8.3.6, koska Ubuntu paikkaa paketin ja pitää version ennallaan. Tarkista sen sijaan paketin versio.

Palvelimet, joita ajetaan hosting-hallintapaneelin kautta. Useammalla palvelimella on aaPanel, joka kääntää oman PHP:nsä. Julkaisupäivänä paneelissa ei ollut päivitettyä PHP:tä. Paneelin odottaminen olisi jättänyt nämä palvelimet auki tuntemattoman ajan, joten käänsimme PHP:n itse.

Docker-kontit. Osa projekteista ajaa PHP:tä konteissa, jotka on rakennettu valmiista imageista. Koko sovelluksen uudelleenrakentaminen ja -julkaisu kesken häiriötilanteen lisää riskiä. Paikkasimme sen sijaan PHP:n käynnissä olevien konttien sisällä ja ajoitimme imagejen kunnollisen uudelleenrakennuksen myöhemmäksi.

PHP:n kääntäminen itse rikkomatta paneelia

Paneelin PHP-käännös eroaa tavallisesta. Jos käännät PHP:n oletusasetuksilla ja pudotat sen paikalleen, laajennuksia puuttuu eikä paneeli enää tunnista omaa PHP:tään.

Kirjoitimme yhden käännösskriptin ja ajoimme sen jokaiselle PHP-versiolle jokaisella paneelipalvelimella:

  • se lukee tarkat configure-asetukset jo asennetusta PHP:stä, joten uudessa käännöksessä on samat laajennukset ja polut;
  • se kääntää korjatun version virallisesta lähdekoodista;
  • se tarkistaa, mihin OpenSSL- ja curl-kirjastoihin uusi binääri linkittyy. Paneeli linkittää osan PHP-versioista omiin vanhempiin kopioihinsa näistä kirjastoista, joten skripti varmistaa, että uusi käännös käyttää samoja;
  • se varmuuskopioi vanhat binäärit, asentaa uudet ja käynnistää PHP:n uudelleen;
  • jos PHP ei käynnisty, se palauttaa vanhat binäärit itse.

Skriptin avulla pystyimme paikkaamaan yhden PHP-version yhdellä palvelimella, tarkistamaan sivustot ja toistamaan saman seuraavalla ilman käsityötä joka kerta.

PHP 7.4, 8.0 ja 8.1: ei virallista julkaisua

PHP-tiimi ei enää julkaise versioita näistä haaroista. PHP2Shellin osalta se julkaisi versioille 7.4, 8.0 ja 8.1 vain lähdekoodimuutokset. Osa projekteistamme toimii yhä näillä versioilla.

Niihin sovelsimme PHP-tiimin lähdekoodikorjaukset kunkin haaran viimeisimpään julkaisuun ja käänsimme sen samalla skriptillä. Julkaistut muutokset koskevat myös versiotiedostoja ja muutoslokeja, jotka eivät mene siististi julkaisun päälle, joten sovelsimme vain koodimuutokset.

Yhdellä palvelimella oli PHP 7.4 Ubuntu 20.04:n paketeista. Tälle Ubuntu-versiolle korjaus tulee vain Ubuntun laajennetun tietoturvatuen (ESM) kautta, jota palvelin ei käytä. Käänsimme PHP 7.4:n samoilla käännösasetuksilla, joita Ubuntu käyttää, ja vaihdoimme vain PHP-FPM-binäärin, alkuperäinen jäi sen viereen. Myöhempi pakettipäivitys kirjoittaisi käännöksemme yli, joten kirjasimme sen projektin dokumentaatioon.

Kontit: paikattu nyt, rakennetaan uudelleen myöhemmin

Jokaiselle kontille käänsimme korjatun PHP:n puhtaassa kopiossa saman käyttöjärjestelmän virallisesta imagesta ja kopioimme käynnissä olevaan konttiin vain PHP:n binäärit ja tarvittavat laajennukset. Alkuperäiset jäivät varmuuskopioksi kontin sisälle.

Yksi Alpine-pohjainen image tarvitsi samat ylimääräiset lähdekoodipaikkaukset, joita virallinen PHP:n Docker-image käyttää, muuten käännös kaatui uudemmalla kääntäjällä.

Tämän tavan heikkous: korjaus pysyy voimassa vain siihen asti, kun joku luo kontin uudelleen vanhasta imagesta. Jos tiimisi paikkasi kontteja näin, laita imagen uudelleenrakennus suunnitelmaan, muuten haavoittuvuus palaa seuraavan deployn mukana.

Paikkauksen jälkeen: lokit

Kun jokainen palvelin ajoi korjattua PHP:tä, kävimme kaikkien palvelinten web-palvelin- ja PHP-lokit läpi ja etsimme pyyntöjä, jotka vastasivat haavoittuvuuksien mahdollisia hyödyntämistapoja. Hyödyntämisen merkkejä ei löytynyt.

Mitä sanoisimme sivuston omistajalle sen illan jälkeen

  • Hostingisi nopeus on sinun nopeutesi. Jos PHP:si tulee paneelista tai palveluntarjoajalta, joka odottaa sitä, sivustosi on auki, kunnes he toimivat. Kysy heiltä tänään, mikä versio sinulla on.
  • Vanha PHP maksaa yhä. PHP 8.1 ja vanhemmat saivat tällä kertaa korjaukset vain lähdekoodina. Ensi kerralla niitä ei ehkä tule lainkaan. PHP 8.2:n tuki päättyy 31.12.2026.
  • Konteilla ja omilla käännöksillä pitää olla omistaja. Kukaan ei päivitä niitä automaattisesti. Jonkun on tiedettävä, että ne ovat olemassa ja miten ne rakennetaan uudelleen.

Automaattinen valvontamme toimii ympäri vuorokauden, ja insinöörimme reagoivat, kun se hälyttää häiriöstä.

Jos tarvitset saman palvelimillesi

Tarkistamme PHP-versiosi ja päivitämme sen yhden työpäivän kuluessa. Kirjoita meille.

Jatkuvaa ylläpitoa varten katso palvelimen ylläpito, verkkosivuston ylläpito ja DevOps. Jos mobiilisovelluksesi käyttää PHP-taustajärjestelmää, se tarvitsee saman päivityksen; hoidamme sen osana mobiilisovellusten ylläpitoa. Jos haluat tietää, onko jotain muuta auki, tilaa tunkeutumistestaus.

Lähteet

Kertokaa projektistanne

Kuvatkaa tehtävä muutamalla rivillä. Vastaamme yhden työpäivän kuluessa kysymyksillä tai alustavalla näkemyksellä laajuudesta ja kustannuksista.

Sopiiko sähköposti tai puhelu paremmin?

welcome@revolsource.com
+38 097 662 23 20

Revol Software OÜ, Tallinna, Viro. Tiimimme on hajautettu ympäri maailmaa.

Liity tiimiimme

Lähettäkää ansioluettelonne osoitteeseen career@revolsource.com