Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

Nginx ar PHP-FPM aizsardzība

Nginx ar PHP-FPM drošība ir pūlos, tiesībās un sakārtotā pārstartēšanā. Šeit: kā pēc PHP2Shell ielāpot un ilgtermiņā nostiprināt Nginx un PHP-FPM.

Aktuāls uz 4 min lasīšanas laiksServeri un hostings

Īsi: Nginx ar PHP-FPM gadījumā PHP2Shell ievainojamība atrodas PHP-FPM, nevis Nginx. Ielāpojiet visas PHP-FPM versijas, pilnībā pārstartējiet katru FPM pakalpojumu un to pierādiet ar procesu startēšanas laiku. Ilgtermiņa Nginx PHP-FPM drošībai svarīgi ir atsevišķi pūli, nepārrakstāmas vērtības un Nginx konfigurācija, kas neizpilda augšupielādētus failus.

Kā sadarbojas Nginx un PHP-FPM

Nginx statiskos failus piegādā pats un pieprasījumus PHP skriptiem caur FastCGI nodod PHP-FPM. PHP-FPM sastāv no galvenā procesa un vairākiem darbprocesiem, sagrupētiem pūlos. Viens darbprocess pēc kārtas apstrādā daudzus pieprasījumus.

Tieši tas ir svarīgi PHP2Shell gadījumā. CVE-2026-109619 gadījumā pieprasījuma iekšējais stāvoklis pēc atmiņas atbrīvošanas var saglabāties un to var izmantot vēlāks pieprasījums tajā pašā darbprocesā. CVE-2026-109618 gadījumā out-of-memory stāvoklis var pārtraukt PHP pieprasījuma inicializācijas vidū. Abas ievainojamības novērtētas ar CVSS v4.0 9.2 un labotas PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35.

Pārbaudiet esošo: versijas, pūli, procesi

Daudziem serveriem paralēli ir vairākas PHP-FPM versijas. Turpmākās komandas tikai lasa; pakotņu un pakalpojumu nosaukumi ir piemēri Debian/Ubuntu un RHEL saimei.

# Kuri FPM pakalpojumi darbojas?
systemctl list-units --type=service | grep -i fpm

# Kura versija ir aiz tiem? (piemērs Debian/Ubuntu)
php-fpm8.3 -v
# RHEL saime
php-fpm -v

# Uz kuriem sockets vai portiem Nginx pārsūta pieprasījumus?
nginx -T 2>/dev/null | grep -E 'fastcgi_pass'

# Pūli un to lietotāji
grep -RhE '^\[|^user|^listen' /etc/php/*/fpm/pool.d/ 2>/dev/null

Salīdziniet katru fastcgi_pass ierakstu ar darbojošos pūlu. Tā redzēsiet, kura PHP versija apkalpo kuru vietni. Distributīvu pakotņu gadījumā ielāpu apliecina izmaiņu žurnāls ar CVE numuriem, nevis tikai versijas numurs.

Bieži sastopams atradums šādās inventarizācijās ir serveri, kuros gadu gaitā instalētas vairākas PHP versijas, no kurām patiešām lietota tikai viena. Pārējie FPM pakalpojumi tomēr turpina darboties, bieži ar noklusējuma pūliem, kas klausās lokālā socketā vai portā. No ārpuses tie parasti nav tieši sasniedzami, taču paliek nevajadzīgs risks un pagarina katru ārkārtas atjaunināšanu. Atspējojiet un noņemiet versijas, ko neizmanto neviena vietne, kad esat pārbaudījis piesaisti pēc fastcgi_pass ierakstiem.

Tāpat vērts apskatīt pūlu lietotāju. Ja visi pūli darbojas kā www-data vai nginx, nošķīrums starp vietnēm pastāv tikai uz papīra. Kas pārņem vienu vietni, var lasīt visu pārējo failus, piemēram, konfigurācijas failus ar datubāzes parolēm. Atsevišķi sistēmas lietotāji katram pūlam un atbilstošas failu tiesības rada īstu robežu. Tas nav PHP2Shell risinājums, taču būtiski ierobežo veiksmīga uzbrukuma iespējamo kaitējumu.

Ielāpa ieinstalēšana un visu darbprocesu atjaunošana

Pēc pakotņu atjauninājuma pārstartējiet katru PHP-FPM pakalpojumu. Reload gan aizstāj darbprocesus, bet pilnīga pārstartēšana atjauno arī galveno procesu un pēc drošības atjauninājumiem ir drošais ceļš.

# Piemērs Debian/Ubuntu, katrai instalētajai versijai
systemctl restart php8.3-fpm
# RHEL saime
systemctl restart php-fpm

# Kontrole: galvenā procesa un darbprocesu startēšanas laiks
ps -eo pid,lstart,cmd | grep -E 'php-fpm' | grep -v grep

Katram procesam jābūt startētam pēc atjauninājuma. Detalizēti tas aprakstīts lapā PHP-FPM un visu darbprocesu pārstartēšana.

Svarīgi

Ielāps nenoņem ļaunprātīgu programmatūru, kas tika ievadīta iepriekš. Saglabājiet Nginx piekļuves un kļūdu žurnālus no 2026. gada 20. oktobra un pārbaudiet vietnes, vai tajās nav pēdu.

Pagaidu vērtību iestatīšana pūlā

Kamēr versija nav ielāpota, php.net iesaka pagaidu pasākumus. Tie nesniedz pilnīgu aizsardzību. PHP-FPM vērtības iestatiet ar php_admin_value vai php_admin_flag pūlā, tad lietojumprogrammas tās ar ini_set() nevar pārrakstīt.

; Piemērs: /etc/php/8.3/fpm/pool.d/website.conf
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M

Ja augšupielādes funkcijas nav, php.net min post_max_size = 8M. PHP 8.5 gadījumā klāt nāk fatal_error_backtraces=0. Norādei par memory_limit=-1 nepieciešams atmiņas ierobežojums cgroup līmenī, piemēram, ar MemoryMax systemd papildinājumā FPM pakalpojumam. Nginx pielāgojiet client_max_body_size jaunajam post_max_size, lai lietotāji saņemtu saprotamus kļūdu paziņojumus. Pēc tam FPM pārstartējiet.

Nginx PHP-FPM drošības ilgtermiņa uzlabošana

Aiz akūtā gadījuma palīdz vairāki pamatnoteikumi, kas nākotnes ievainojamību gadījumos ierobežo kaitējumu:

  • Viens pūls katrai vietnei ar savu sistēmas lietotāju, savu socketu un savu open_basedir robežu. Vairāk lapā open_basedir un izolācija katrai vietnei.
  • Socket tiesības iestatīt tā, lai piekļūt var tikai Nginx, FPM portus uz āru neatvērt.
  • Izpildīt tikai esošus skriptus: PHP location iestatīt try_files $uri =404;, lai Nginx PHP nenodod ceļus, kuru nav.
  • Augšupielādes neizpildīt: augšupielāžu direktorijos aizliegt PHP izpildi. Norādes par to atrodamas lapā Failu augšupielāžu drošs ieviešums.
  • Aizsargāt statusa lapas: pm.status_path un ping.path padarīt sasniedzamus tikai iekšēji.
# Piemērs: nekādas PHP izpildes augšupielāžu direktorijā
location ~* ^/uploads/.*\.php$ {
    deny all;
}

Katru izmaiņu pārbaudiet ar nginx -t, pirms pārlādējat Nginx. Turklāt fiksējiet, kādi pūli, versijas un īpašie noteikumi serverī pastāv. Šī īsā dokumentācija nākamās kritiskās ievainojamības laikā ietaupa vērtīgu laiku, jo nevienam nav vispirms jāmeklē, kura vietne pie kura pūla pieder.

Kā PHP SOS palīdz konkrēti?

  • Mēs katru vietni piesaistām tās pūlam un PHP versijai un pārbaudām faktisko pakotņu stāvokli.
  • Mēs ielāpojam, pārstartējam visus FPM pakalpojumus un dokumentējam procesu startēšanas laikus kā pierādījumu.
  • Līdz ielāpam mēs pagaidu vērtības iestatām katram pūlam un ierobežojam atmiņu ar cgroup.
  • Savas servera nostiprināšanas ietvaros mēs sakārtoti nošķiram pūlus, tiesības un augšupielāžu direktorijus.
  • Aizdomu par ielaušanos gadījumā mēs uzņemamies Incident Response.

Biežāk uzdotie jautājumi

Vai pēc atjauninājuma PHP-FPM pietiek ar systemctl reload?

Reload atjauno darbprocesus, bet galvenais process var paturēt veco kodu. Pēc drošības atjauninājuma drošs ceļš ir pakalpojuma pilnīga pārstartēšana. Pēc tam pārbaudiet galvenā procesa un darbprocesu startēšanas laiku.

Vai pēc PHP atjauninājuma Nginx jāpārstartē?

Pats Nginx PHP nesatur, un PHP ielāpam tas nav jāpārstartē. Jāpārstartē visi PHP-FPM pakalpojumi. Ja vienlaikus mainiet Nginx konfigurāciju, pirms pārlādēšanas pārbaudiet to ar nginx -t.

Kāpēc katrai vietnei savs pūls?

Katrs pūls darbojas ar savu lietotāju un saviem ierobežojumiem. Ja viena vietne tiek kompromitēta, uzbrucējs bez grūtībām netiek pie citu vietņu failiem. Turklāt pagaidu vērtības var mērķtiecīgi iestatīt katram pūlam.

Vai pm.max_requests ir aizsardzība pret PHP2Shell?

Nē, tas ielāpu neaizstāj. Šī vērtība ierobežo, cik pieprasījumus darbprocess apstrādā, pirms tiek aizstāts. Tas var saīsināt stāvokļu mūžu procesā, bet nav php.net minēts risinājums.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība