Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Issettja limiti tal-memorja b'systemd u cgroups

php.net jirrakkomanda bħala miżura tranżitorja ta' PHP2Shell memory_limit=-1 u limitu tal-memorja barra minn PHP. Hekk tissettja dan il-limitu b'systemd u cgroups, mingħajr ma worker wieħed jieħu magħha s-servizz kollu.

Stat 6 min. qariTisħiħ u konfigurazzjoni

Fil-qosor: Għall-miżura tranżitorja ta' PHP2Shell memory_limit=-1, PHP-FPM għandu bżonn limitu tal-memorja barra minn PHP. Taħt systemd tissettjah b'MemoryHigh= bħala brejk u MemoryMax= bħala limitu massimu iebes f'fajl supplimentari għas-servizz FPM. ulimit, LimitAS= jew LimitDATA= huma għal dan, skont php.net, mhux adattati. Ivverifika wkoll OOMPolicy=, biex worker wieħed ma jtemmx is-servizz kollu.

Rakkomandazzjoni li l-ewwel tqajjem mistoqsijiet

Fost il-miżuri tranżitorji li php.net ippubblika fil-21 ta' Ottubru 2026 dwar PHP2Shell hemm waħda li ħalliet ħafna amministraturi jistagħġbu: memory_limit=-1, jiġifieri l-ebda limitu tal-memorja f'PHP innifsu. Għal snin sħaħ l-oppost kien jitqies prattika tajba.

Konnessjoni mad-deskrizzjoni tal-vulnerabbiltà hija ovvja. F'CVE-2026-109618 stat ta' out-of-memory jista' jinterrompi PHP waqt li d-data tat-talba tkun inizjalizzata biss parzjalment. Il-miżura tranżitorja ċċaqlaq il-limitu tal-memorja minn PHP lejn is-sistema operattiva. php.net jorbotha espliċitament ma' żewġ kundizzjonijiet: il-valur irid ikun imblukkat kontra sostituzzjoni, u l-limitu jrid jiġi minn container jew cgroup, mhux minn RLIMIT_AS jew RLIMIT_DATA.

Min jimplimenta biss l-ewwel nofs ikollu server mingħajr l-ebda limitu tal-memorja. Dan l-artikolu juri t-tieni nofs. Anke flimkien il-miżura tibqa' tranżizzjoni: il-vulnerabbiltà hija rranġata biss b'PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 jew backport ikkonfermat.

cgroups spjegati f'żewġ sentenzi

Control Groups, fil-qosor cgroups, huma funzjoni tal-kernel ta' Linux li tiġbor il-proċessi f'gruppi u tillimita r-riżorsi tagħhom. systemd joħloq awtomatikament cgroup proprja għal kull servizz, u l-proċessi kollha tas-servizz, ma' servizz FPM għalhekk il-master u l-workers kollha, jappartjenu lilha.

L-għażliet tal-memorja ta' systemd jissettjaw valuri tal-memory controller ta' cgroup v2. Jekk is-sistema tiegħek tużax cgroup v2 turi kmand qasir:

# "cgroup2fs" ifisser: cgroup v2 hija attiva
stat -fc %T /sys/fs/cgroup/

Verżjonijiet attwali tad-distribuzzjonijiet komuni jużaw cgroup v2 b'mod standard. Jekk il-kmand juri xi ħaġa oħra, iċċara dan qabel il-bidla, għax id-dokumentazzjoni ta' systemd tiddeskrivi l-għażliet qodma v1 bħala skaduti.

Issettja systemd MemoryMax għal PHP-FPM

Il-limitu jmur f'fajl supplimentari, l-hekk imsejjaħ drop-in. Hekk il-fajl tal-unit tal-pakkett jibqa' mhux mibdul, u aġġornament ma jikteb fuq l-issettjar tiegħek. L-ismijiet tas-servizzi jvarjaw skont id-distribuzzjoni; l-eżempju juża Debian u Ubuntu b'PHP 8.3.

# Tiftaħ editur għad-drop-in: sudo systemctl edit php8.3-fpm
# Riżultat: /etc/systemd/system/php8.3-fpm.service.d/override.conf
[Service]
MemoryAccounting=yes
MemoryHigh=1536M
MemoryMax=2G
MemorySwapMax=0
OOMPolicy=continue

L-għażliet f'ħarsa ġenerali, skont id-dokumentazzjoni ta' systemd:

Għażla Effett Nota għal PHP-FPM
MemoryHigh= limitu ta' throttling: il-proċessi jitbaxxew ħafna, il-memorja tittieħed lura il-valur ta' kontroll veru, ftit taħt MemoryMax
MemoryMax= limitu assolut: jekk ma jistax jinżamm, l-OOM-killer jidħol fis-seħħ fis-servizz l-aħħar linja ta' difiża
MemorySwapMax= limitu għall-iswapping 0 jipprevjeni li s-servizz jaħrab fl-swap minflok
OOMPolicy= imġiba wara avveniment OOM: continue, stop jew kill continue iħalli l-workers l-oħra jkomplu jaħdmu
LimitAS=, LimitDATA= rlimits għal kull proċess skont php.net mhux adattati għal din il-miżura

OOMPolicy= jixraq attenzjoni partikolari. Ma' stop jew kill, systemd wara avveniment OOM itemm is-servizz kollu, u l-websajts kollha ta' dan is-servizz FPM jaqgħu. Liema valur japplika mingħajr indikazzjoni proprja jiddeċiedi l-istandard tas-sistema DefaultOOMPolicy=. Ivverifika l-valur effettiv għalhekk, minflok ma tassumih.

Wara erġa' ibda s-servizz u ibblokka memory_limit fil-pool:

sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p MemoryHigh -p MemoryMax -p MemorySwapMax -p OOMPolicy -p MemoryCurrent
; Fajl tal-pool, pereżempju /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_value[memory_limit] = -1

Kif jaħdem il-blokk jiddeskrivih php_admin_value: ibblokka l-issettjar kontra sostituzzjoni.

Sib il-valur it-tajjeb

Limitu skars żżejjed joħloq twaqqif fl-operat normali, wieħed ġeneruż żżejjed jipproteġi ftit. Il-punt tat-tluq huwa l-konsum reali.

  1. Osserva l-ħtieġa attwali tal-memorja tal-proċessi FPM kollha fuq ftit jiem, anke fil-quċċati tat-tagħbija.
  2. Iddetermina l-ħtieġa tipika ta' worker wieħed u immultiplika b'pm.max_children tal-pools kollha tas-servizz.
  3. Ippjana żieda għall-proċess master, OPcache u l-quċċati.
  4. Issettja MemoryHigh= ftit 'il fuq mill-quċċata mkejla, MemoryMax= b'ftit distanza 'il fuq minnha.
  5. Irranġa l-valuri wara ġimgħa skont il-kejl u l-avvenimenti OOM.
# Memorja tal-proċessi PHP-FPM kollha f'MB (Resident Set Size)
ps -C php-fpm8.3 -o rss= | awk '{s+=$1} END {printf "%.0f MB\n", s/1024}'
# Ħarsa ġenerali kontinwa tal-cgroups kollha ordnati skont il-memorja
systemd-cgtop -m

Il-valur ta' memory_limit qabel il-bidla għandek tinnotah. Wara l-aġġornament tista' terġa' lura għal limitu fiss f'PHP; kif tagħżlu sew jinsab taħt Issettja memory_limit sew.

Issorvelja: meta jaħdem il-limitu

Limitu tal-memorja li ħadd ma jinduna meta jaħdem huwa sors siekta ta' żbalji. Il-kernel jgħodd avvenimenti OOM għal kull cgroup, u systemd kif ukoll il-protokoll tal-kernel jirreġistrawhom.

# Il-counter OOM tas-cgroup tas-servizz (mogħdija ma' cgroup v2)
cat /sys/fs/cgroup/system.slice/php8.3-fpm.service/memory.events
# Messaġġi tal-OOM-killer fil-protokoll tal-kernel
journalctl -k --since "-1 day" | grep -i "out of memory"

Jekk il-counter oom_kill jogħla, il-kernel jtemm workers. Dan jista' jindika limitu skars żżejjed, applikazzjoni difettuża jew talbiet mhux tas-soltu. Fis-sitwazzjoni attwali jixraq li avvenimenti bħal dawn jitqabblu mal-protokolli tal-aċċess fl-istess ħin.

Importanti

Il-limitu tal-memorja huwa miżura tranżitorja u ma jissostitwixxix l-aġġornament ta' PHP. Ippjana l-aġġornament parallelament, u wara erġa' ibda l-proċessi kollha ta' PHP. Il-miżuri tranżitorji kollha f'ħarsa ġenerali jinsabu taħt Miżuri immedjati meta ma tistax tippatchja għadek.

X'jiġri ġewwa PHP meta tonqos il-memorja jispjegah memory_limit u Out-of-Memory. Ma' Apache b'mod_php l-istess teknika tapplika għas-servizz Apache, imma PHP imbagħad jaqsam il-limitu mas-server tal-web innifsu.

Konklużjoni: tinsiex it-tieni nofs

memory_limit=-1 huwa miżura tranżitorja ammissibbli biss flimkien ma' limitu estern. systemd jagħmel dan il-limitu possibbli b'ftit linji: MemoryHigh bħala brejk, MemoryMax bħala limitu massimu iebes, MemorySwapMax kontra l-ħarba fl-swap u OOMPolicy magħżula konxjament. Ikkejjel minn qabel, osserva wara, u żomm f'moħħok li l-pools kollha ta' servizz jaqsmu l-limitu.

Aktar minn kollox: ippjana t-tmiem tal-miżura. Wara l-aġġornament għal verżjoni rranġata ta' PHP terġa' lura għal memory_limit fiss. Il-limitu tas-cgroup tista' żżommu bħala protezzjoni addizzjonali kontra proċessi li joħorġu mill-limiti.

Kif tgħin PHP SOS b'mod konkret?

  • Inkejlu: niġbru l-ħtieġa tal-memorja tas-servizzi PHP tiegħek u nikkalkulaw minn hemm limiti adattati.
  • Nimplimentaw: nissettjaw drop-ins b'MemoryHigh, MemoryMax u OOMPolicy xierqa, nibblokkaw memory_limit fil-pool u nerġgħu nibdew is-servizzi b'mod ikkontrollat.
  • Nosservaw: nintegraw l-avvenimenti OOM fil-monitoraġġ u nirranġaw il-valuri.
  • Nwasslu għall-patch: permezz tas-Servizz ta' patch ta' PHP ninstallaw l-aġġornament u nneħħu l-valuri tranżitorji wara b'mod ordnat.

Mistoqsijiet frekwenti

Għaliex memory_limit għandu jkun -1? Mhuwiex perikoluż?

Waħdu kien ikun. php.net jirrakkomanda memory_limit=-1 bħala miżura tranżitorja espliċitament flimkien ma' limitu tal-memorja permezz ta' container jew cgroup. Il-limitazzjoni tmur b'hekk minn PHP għas-sistema operattiva. Mingħajr dan il-limitu estern m'għandekx tissettja l-valur.

Nista' nuża minflok ulimit jew LimitAS=?

Le. php.net jiskoraġġixxi espliċitament RLIMIT_AS u RLIMIT_DATA, u eżattament dawn il-limiti jissettjaw ulimit -v, LimitAS= u LimitDATA=. Id-dokumentazzjoni ta' systemd tindika wkoll li LimitAS= jillimita l-ispazju tal-indirizzi, mhux il-konsum tal-memorja.

X'jiġri meta PHP-FPM jilħaq il-limitu?

Ma' MemoryHigh il-kernel inaqqas il-veloċità tal-proċessi u jieħu lura l-memorja. Ma' MemoryMax jidħol fis-seħħ l-OOM-killer fis-servizz u jtemm proċess, ġeneralment worker kbir. Jekk wara jieqaf is-servizz kollu jiddeċiedi OOMPolicy=.

Il-limitu japplika għal kull pool waħdu?

Le. Il-pools kollha ta' servizz FPM jaqsmu cgroup waħda u għalhekk limitu komuni. Limiti separati għal kull websajt jeħtieġu servizzi FPM jew containers separati.

Kif nissettja l-limitu f'Docker jew Kubernetes?

Permezz tal-limitu tal-memorja tal-container, pereżempju l-għażla --memory ma' docker run jew resources.limits.memory f'Kubernetes. It-tnejn jużaw ukoll cgroups. Il-prinċipju jibqa' l-istess: limitu barra minn PHP, memory_limit f'PHP imblukkat.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata