Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

Pravilna nastavitev memory_limit

memory_limit omejuje pomnilnik na zahtevo PHP. Po PHP2Shell php.net začasno svetuje nasprotno. Kaj velja v običajnem delovanju, v prehodu in po posodobitvi.

Stanje 5 min branjaUtrjevanje in konfiguracija

Na kratko: memory_limit določa, koliko pomnilnika sme zasesti posamezna zahteva PHP; privzeto je 128M. V običajnem delovanju nastavite končno vrednost, ki ustreza aplikaciji, in jo zaklenite s php_admin_value. Dokler PHP2Shell ni popravljen, php.net začasno svetuje memory_limit=-1, ki ga ni mogoče prepisati in je združen z mejo prek vsebnika ali cgroup, ne prek RLIMIT_AS ali RLIMIT_DATA. Po posodobitvi spet velja končna vrednost.

Rutinska nastavitev, ki je nenadoma varnostna tema

Leta je bil memory_limit vijak za razvijalce. Če spletna stran javi »Allowed memory size exhausted«, se vrednost poveča in težava je rešena. S PHP2Shell je to postalo varnostno vprašanje, priporočilo php.net pa je na prvi pogled paradoksalno: za prehod naj lastna pomnilniška meja PHP v celoti odpade.

Ozadje je CVE-2026-109618. Po projektu PHP lahko stanje brez pomnilnika (out-of-memory) prekine PHP, medtem ko so podatki zahteve inicializirani le delno. Čiščenje zahteve potem lahko neveljavne podatke obravnava kot veljavne. Tehnične podrobnosti so pod CVE-2026-109618, kaj se ob pomanjkanju pomnilnika dogaja v notranjosti PHP, pojasnjuje memory_limit in out-of-memory. Za upravljavce šteje vprašanje: katera vrednost velja kdaj in kje mora biti zapisana?

Kaj memory_limit počne v običajnem delovanju

Po priročniku PHP memory_limit omejuje pomnilnik, ki ga sme skript zasesti, in tako strežnik varuje pred slabo napisano kodo. Privzeto je 128M, -1 pomeni brez meje. Dovoljeni so skrajšani zapisi, kot sta 256M ali 1G.

Dve lastnosti sta pomembni za varnost. Prvič, vrednost je mogoče spremeniti povsod, tudi med izvajanjem z ini_set(). Številni CMS in trgovine jo sami povečajo, na primer za uvoze ali obdelavo slik. Kdor želi vrednost prisiliti, jo mora nastaviti s php_admin_value; po priročniku tako nastavljenih vrednosti ni mogoče prepisati z ini_set(). Drugič, priročnik priporoča, da je memory_limit večji od post_max_size.

Katera vrednost ustreza, je odvisno od aplikacije. Pogled v dnevnik napak pokaže, ali se pojavljajo sporočila o izčrpanem pomnilniku in ob katerih klicih. Obneslo se je, da se vrednost določi za vsako spletno stran v lastnem poolu FPM: radodarneje za trgovino z uvozi, skromneje za preprosto podjetniško stran. Splošno zelo visoka vrednost za vse spletne strani zapravi zaščitni učinek, ker lahko ena sama napačna ali zlorabljena zahteva veže veliko pomnilnika.

Od PHP 8.5 obstaja dodatno max_memory_limit. To nastavitev je mogoče nastaviti samo ob zagonu in omejuje, kako visoko sme biti memory_limit sploh nastavljen. Višje vrednosti se z opozorilom odrežejo. Privzeto -1 pomeni brez zgornje meje.

memory_limit po PHP2Shell: prehodni ukrep php.net

Za strežnike, ki še niso posodobljeni na 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 oziroma na potrjen backport, php.net v varnostnem obvestilu z dne 21. 10. 2026 navaja naslednje korake. Zmanjšajo tveganje posameznih poti napada, vendar namestitve po php.net ne naredijo varne:

  1. Nastavite memory_limit=-1, po možnosti tako, da aplikacije vrednosti ne morejo prepisati, na primer s php_admin_value v poolu FPM ali v konfiguraciji Apache.
  2. Preverite, da se nikjer znova ne nastavi končna meja, ne v drugem poolu, ne v konfiguraciji imenika in ne v aplikaciji.
  3. Nastavite pomnilniško mejo prek vsebnika ali cgroup, kot zaščito razpoložljivosti, po možnosti tako, da se ob prekoračitvi konča samo prizadeti delavec.
  4. Ne uporabljajte RLIMIT_AS ali RLIMIT_DATA. Ti meji lahko po php.net sprožita prav ranljivo napako pri zahtevi za pomnilnik.

php.net v zvezi s tem pojasnjuje, da -1 odstrani ciljno sprožljiv doseg pomnilniške meje PHP, da pa napaka pomnilnika na nižji ravni ranljivo pot še vedno lahko doseže. Pregled vseh prehodnih ukrepov je pod Takojšnji ukrepi, če popravka še ne morete namestiti.

; Pool FPM, npr. /etc/php/8.3/fpm/pool.d/www.conf (samo do posodobitve)
php_admin_value[memory_limit] = -1
# Kje vse je nastavljen memory_limit (samo bralno)
grep -rn 'memory_limit' /etc/php/ /etc/apache2/ 2>/dev/null
grep -rn --include='*.php' -E "ini_set\s*\(\s*['\"]memory_limit" /var/www | head -20
grep -rn --include='.user.ini' 'memory_limit' /var/www

Kako nastavite mejo cgroup za storitev FPM, opisuje Nastavitev pomnilniških mej s systemd in cgroups. Brez te zunanje meje lahko ena sama zahteva spravi celoten strežnik v pomnilniško stisko.

Pomembno

Po vsaki spremembi znova zaženite vse delavce PHP. Tekoči delavec obdrži svoje stare vrednosti.

Kaj velja po posodobitvi

S popravljenimi različicami se je po priročniku PHP spremenilo tudi obnašanje memory_limit. Od 8.5.12, 8.4.27, 8.3.36 in 8.2.35 je mehka meja: zahtevo za pomnilnik, ki jo preseže, je v večini primerov še dovoljeno zaključiti, preden se sproži napaka. Nova nastavitev, memory_hard_limit_percent, določa trdo mejo, ki se nikoli ne preseže.

Nastavitev Vrednost Učinek po priročniku
memory_hard_limit_percent ni nastavljen ali -1 privzeto trda meja dvakrat tolikšna kot memory_limit do 1G, nad tem memory_limit plus 1G
memory_hard_limit_percent = 150 primer pri memory_limit=128M trda meja 192M
memory_limit = -1 brez meje potem ni niti trde meje

Priročnik navaja praktično preverjalno točko: če memory_hard_limit_percent ni prepoznan, je uporabljena različica PHP prizadeta in jo je treba posodobiti. Pri backportih distribucij stanje dodatno preverite prek dnevnika sprememb paketa.

# Ali dvojiška datoteka FPM pozna novo nastavitev? (prilagodite številko različice)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'

Po posodobitvi je memory_limit=-1 opravil svoj namen. Vrnite se na končno vrednost, ki ustreza aplikaciji, in jo zaklenite s php_admin_value. Meja cgroup lahko ostane kot dodatna zaščitna plast.

Kako PHP SOS pomaga konkretno?

  • Ugotovimo, kje je na vašem strežniku memory_limit nastavljen in prepisan, vključno z aplikacijami.
  • Prehodne ukrepe php.net izvedemo na pravem mestu in dodamo mejo cgroup za storitev FPM.
  • Prek storitve popravljanja PHP PHP pripeljemo na popravljeno stanje in znova zaženemo vse delavce.
  • Nato spet nastavimo ustrezno končno vrednost in nastavitve dokumentiramo.

Pogosta vprašanja

Kakšna je privzeta vrednost memory_limit?

Po priročniku PHP 128M. Vrednost omejuje, koliko pomnilnika sme zasesti posamezen skript. Spremeniti jo je mogoče v php.ini, v konfiguraciji strežnika, v poolu FPM in med izvajanjem z ini_set(), če ni zaklenjena s php_admin_value.

Zakaj php.net pri PHP2Shell svetuje memory_limit=-1?

Ena od ranljivosti, CVE-2026-109618, je povezana s stanjem ob pomanjkanju pomnilnika. Po php.net memory_limit=-1 odstrani ciljno sprožljiv doseg pomnilniške meje PHP, ne pa vsake napake pomnilnika. Ukrep ni popolna zaščita in ga je treba združiti z mejo pomnilnika prek vsebnika ali cgroup.

Ali smem mejo namesto tega nastaviti z ulimit?

Ne. php.net izrecno odsvetuje uporabo RLIMIT_AS ali RLIMIT_DATA kot nadomestila, ker lahko ti meji sprožita prav ranljivo napako pri zahtevi za pomnilnik. Priporočena je meja prek vsebnika ali cgroup.

Kaj velja po posodobitvi na popravljeno različico PHP?

Po priročniku je memory_limit v popravljenih različicah mehka meja, dopolnjena s trdo mejo prek memory_hard_limit_percent. Prehodni ukrep z -1 je takrat opravil svoj namen in spet naj velja končna vrednost, ki ustreza aplikaciji.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč