Īsi: FrankenPHP ir uz Caddy balstīts lietojumprogrammu serveris, kas PHP iegulda savā programmā. FrankenPHP drošībai pēc PHP2Shell tas nozīmē: svarīgas nav distributīva PHP pakotnes, bet PHP versija FrankenPHP bināraj failā vai konteinera image. Pārbūvējiet vai ielādējiet versiju ar labotu PHP un pārstartējiet visus worker.
Kāpēc FrankenPHP ielāpo citādi
Klasiskos iestatījumos PHP kā pakotni piegādā distributīvs, un atjauninājums nomaina failus. FrankenPHP turpretī PHP satur kā iegultu bibliotēku. Kas izmanto oficiālo bināro failu vai uz tā balstītu konteinera image, saņem PHP komplektā. apt upgrade uz hosta to nemaina.
PHP2Shell ietver CVE-2026-109618 un CVE-2026-109619, katru ar CVSS v4.0 9.2. PHP projekts FrankenPHP skaidri min starp skartajiem darbības režīmiem. Labotas ir PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35. Izšķiroši ir tātad tas, ar kuru PHP versiju jūsu FrankenPHP ir būvēts.
Worker režīms un PHP2Shell
FrankenPHP lietojumprogrammas var darbināt worker režīmā. Tad lietojumprogramma tiek ielādēta vienreiz un pēc tam vienā procesā apstrādā daudzus pieprasījumus pēc kārtas. Tas dod ātrumu, bet pagarina katra procesa mūžu.
CVE-2026-109619 apraksta pieprasījuma iekšējo stāvokli, kas pēc atmiņas atbrīvošanas var saglabāties; vēlāks pieprasījums tajā pašā worker to var izmantot, pirms tas tiek atiestatīts. Worker režīmā daudzu pieprasījumu mijiedarbība vienā procesā ir ierasta parādība. Tas nav iemesls atteikties no worker režīma, bet skaidrs iemesls atjauninājumus un pārstartēšanu veikt īpaši rūpīgi. Tehniskas detaļas atrodamas lapā CVE-2026-109619.
FrankenPHP drošība: versijas pārbaude
Iegulto PHP versiju pārbaudiet tieši darbojošajā sistēmā. Turpmākās komandas tikai lasa; pakalpojumu un konteineru nosaukumi ir piemēri.
# Instalētais binārais fails
frankenphp version
# Darbojošajā konteinerā (konteinera nosaukums kā piemērs)
docker exec app frankenphp version
docker exec app php -v
# Kurš image patiešām darbojas? (Digest parāda precīzu stāvokli)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
Pierakstiet PHP versiju no izvades. Ja tā ir pirms labotajiem stāvokļiem, sistēma ir ievainojama. Vienmēr pārbaudiet darbojošos konteineru, nevis tikai pēdējo izveidoto image, jo jaunais image iedarbojas tikai pēc konteineru nomaiņas.
Atjauninājuma ieinstalēšana un visu worker pārstartēšana
Kā atjauninājums izskatās, ir atkarīgs no jūsu instalācijas:
- Binārais fails uz hosta: instalēt jaunu FrankenPHP laidienu ar labotu PHP versiju, pakalpojumu pārstartēt.
- Konteineri: iegūt bāzes image ar labotu PHP versiju, savu image pārbūvēt, bāzes slānim neizmantojot kešatmiņu, konteinerus nomainīt.
- Pašu kompilēts: pārbūvēt ar labotu PHP versiju, visus paplašinājumus izveidot no jauna ar to pašu versiju.
# Piemērs: instalācija uz hosta kā systemd pakalpojums
systemctl restart frankenphp
# Piemērs Docker Compose: pārbūvēt bez kešatmiņas un nomainīt konteinerus
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Pēc tam vēlreiz pārbaudiet PHP versiju darbojošajā konteinerā un procesu startēšanas laiku. Worker režīmā katram worker jābūt pārstartētam. Kubernetes gadījumā ir papildu soļi, kas aprakstīti lapā PHP ielāpošana Kubernetes, konteineriem kopumā lapā PHP ielāpošana Docker konteineros.
Tags, piemēram, latest, vai galvenā versija image nosaukumā negarantē, ka jums ir jaunākais stāvoklis. Bāzes image ielādējiet aktīvi no jauna un pēc tam pārbaudiet PHP versiju darbojošajā konteinerā.
Pagaidu pasākumi un nostiprināšana
Ja atjauninājumu nevar veikt nekavējoties, php.net iesaka pagaidu pasākumus, kas nesniedz pilnīgu aizsardzību. FrankenPHP vērtības iestatiet php.ini, ko ielādē FrankenPHP, vai ar PHP iestatījumiem Caddy konfigurācijā, nevis ar ini_set() lietojumprogrammā.
; php.ini konteinerā vai uz hosta
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Ja ir augšupielādes funkcija, php.net min post_max_size = 32M. PHP 8.5 gadījumā klāt nāk fatal_error_backtraces=0. Atmiņas ierobežojums jāiestata konteinera līmenī, piemēram, ar konteinera atmiņas limitu, nevis ar RLIMIT_AS vai RLIMIT_DATA. Pēc katras izmaiņas pārstartējiet visus worker.
Ilgtermiņā ir vērts image atsaukties uz fiksētu digest, regulāri automatizēti pārbūvēt un būvēšanas ķēdē iekļaut image skeneri. Ielāps turklāt nenoņem ļaunprātīgu programmatūru, kas tika ievadīta iepriekš. Saglabājiet žurnālus no 2026. gada 20. oktobra; konteineru gadījumā tas nozīmē tos saglabāt pirms nomaiņas.
Kas FrankenPHP izmanto kā statiski būvētu bināro failu, tam jāzina, ka tur līdzās PHP cieši iebūvēti arī visi paplašinājumi. Tāpēc atjauninājums vienmēr nozīmē nomainīt visu bināro failu. Pēc nomaiņas pārbaudiet versiju un ielādēto paplašinājumu sarakstu, vai viss ir pieejams kā iepriekš, un pārbaudiet lietojumprogrammu, pirms veco stāvokli atmetat. Konteineru vidēs ieteicams katru image marķēt ar būvēšanas datumu. Tā jebkurā laikā varat izsekot, kurš stāvoklis kad darbojās, un šaubu gadījumā mērķtiecīgi atgriezties, vēlreiz neuzkrītot uz ievainojamu stāvokli. Image, PHP versijas un laika punkta piesaisti fiksējiet savā dokumentācijā.
Kā PHP SOS palīdz konkrēti?
- Mēs pārbaudām, kura PHP versija patiešām atrodas jūsu FrankenPHP binārajos failos un darbojošajos konteineros.
- Ar PHP ielāpu pakalpojumu mēs pārbūvējam image, nomainām konteinerus un pārstartējam visus worker, ar pierādījumu.
- Mēs saglabājam žurnālus pirms nomaiņas un pārbaudām lietojumprogrammu, vai tajā nav pēdu.
- Ilgtermiņa darbībai savas servera nostiprināšanas ietvaros mēs ieviešam automatizētas pārbūves un image pārbaudes.
Biežāk uzdotie jautājumi
Vai apt vai dnf atjauninājums FrankenPHP palīdz?
Tikai tad, ja pats FrankenPHP nāk no šiem pakotņu avotiem un ir būvēts ar ielāpoto PHP. Bieži PHP ir cieši iekļauts FrankenPHP binārajā failā vai konteinera image. Tad jāatjaunina binārais fails vai image.
Kāpēc worker režīms PHP2Shell gadījumā ir īpaši svarīgs?
Worker režīmā lietojumprogramma paliek atmiņā un vienā procesā secīgi apstrādā daudzus pieprasījumus. CVE-2026-109619 skar tieši iekšējo stāvokli, kas starp pieprasījumiem tajā pašā worker var saglabāties. Tāpēc pēc atjauninājuma visu worker pārstartēšana ir obligāta.
Kā pārbaudīt, kura PHP versija ir FrankenPHP?
FrankenPHP binārais fails, izsaucot versiju, izvada iegulto PHP versiju. Konteinerā šo komandu var izpildīt ar docker exec. Raugieties, lai versiju pārbaudītu patiešām darbojošā konteinerā, nevis jaunizveidotajā image.
Vai FrankenPHP ir savi pagaidu pasākumi?
Spēkā ir vispārīgās php.net norādes. Vērtības iestatāt php.ini, ko ielādē FrankenPHP, vai Caddy faila PHP konfigurācijā, nevis ar ini_set() lietojumprogrammā. Pēc tam pārstartējiet visus worker.