Stručne: memory_limit určuje, koľko pamäte smie obsadiť jedna požiadavka PHP; štandard je 128M. V bežnej prevádzke nastavte konečnú hodnotu, ktorá zodpovedá aplikácii, a zablokujte ju pomocou php_admin_value. Kým PHP2Shell nie je zaplátané, php.net dočasne radí memory_limit=-1, neprepísateľné a v kombinácii s hranicou cez kontajner alebo cgroup, nie cez RLIMIT_AS alebo RLIMIT_DATA. Po aktualizácii opäť platí konečná hodnota.
Rutinné nastavenie, ktoré sa zrazu stalo bezpečnostnou témou
Roky bol memory_limit nastavovacou skrutkou pre vývojárov. Ak web ohlási „Allowed memory size exhausted“, hodnota sa zvýši a problém je vybavený. S PHP2Shell sa z toho stala bezpečnostná otázka a odporúčanie php.net pôsobí na prvý pohľad paradoxne: pre prechodné obdobie má vlastná pamäťová hranica PHP úplne odpadnúť.
Pozadím je CVE-2026-109618. Podľa projektu PHP môže stav nedostatku pamäte (out-of-memory) prerušiť PHP v čase, keď sú údaje požiadavky inicializované len čiastočne. Upratovanie požiadavky potom môže neplatné údaje považovať za platné. Technické podrobnosti sú pri CVE-2026-109618, čo sa pri nedostatku pamäte deje vo vnútri PHP, vysvetľuje memory_limit a Out-of-Memory. Pre prevádzkovateľov rozhoduje otázka: ktorá hodnota platí kedy a kde musí byť zapísaná?
Čo memory_limit zabezpečuje v bežnej prevádzke
Podľa príručky PHP memory_limit obmedzuje pamäť, ktorú smie skript obsadiť, a chráni tak server pred zle napísaným kódom. Štandard je 128M, -1 znamená žiadnu hranicu. Skrátené zápisy ako 256M alebo 1G sú povolené.
Dve vlastnosti sú pre bezpečnosť dôležité. Po prvé, hodnotu možno zmeniť všade, aj za behu cez ini_set(). Mnohé CMS a e-shopy ju samy zvyšujú, napríklad pre importy alebo spracovanie obrázkov. Kto chce hodnotu vynútiť, musí ju nastaviť pomocou php_admin_value; podľa príručky sa takto nastavené hodnoty nedajú prepísať cez ini_set(). Po druhé, príručka odporúča, aby bol memory_limit väčší ako post_max_size.
Ktorá hodnota sedí, závisí od aplikácie. Pohľad do chybového protokolu ukáže, či sa vyskytujú hlásenia o vyčerpanej pamäti a pri ktorých otvoreniach. Osvedčilo sa nastaviť hodnotu pre každý web v jeho vlastnom poole FPM: štedrejšie pre e-shop s importmi, úspornejšie pre jednoduchú firemnú stránku. Plošne veľmi vysoká hodnota pre všetky weby premrhá ochranný účinok, pretože potom môže jedna chybná alebo zneužitá požiadavka viazať veľa pamäte.
Od PHP 8.5 existuje navyše max_memory_limit. Toto nastavenie sa dá určiť len pri štarte a obmedzuje, ako vysoko sa môže memory_limit vôbec nastaviť. Vyššie hodnoty sa s upozornením orežú. Štandard -1 znamená žiadnu hornú hranicu.
memory_limit po PHP2Shell: prechodné opatrenie od php.net
Pre servery, ktoré ešte nie sú aktualizované na 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35 alebo potvrdený backport, uvádza php.net v bezpečnostnej správe z 21. 10. 2026 nasledujúce kroky. Znižujú riziko jednotlivých ciest útoku, inštaláciu však podľa php.net nerobia bezpečnou:
- Nastaviť
memory_limit=-1, podľa možnosti tak, aby aplikácie hodnotu nemohli prepísať, napríklad pomocouphp_admin_valuev poole FPM alebo v konfigurácii Apache. - Overiť, že sa nikde znova nenastavuje konečná hranica, ani v inom poole, ani v konfigurácii adresára, ani v aplikácii.
- Nastaviť pamäťovú hranicu cez kontajner alebo cgroup, ako ochranu dostupnosti, podľa možnosti tak, aby sa pri prekročení ukončil len dotknutý worker.
- Nepoužívať
RLIMIT_ASaniRLIMIT_DATA. Tieto hranice môžu podľa php.net vyvolať práve zraniteľnú chybu pri požiadavke na pamäť.
php.net k tomu vysvetľuje, že -1 odstráni cielene vyvolateľné dosiahnutie pamäťovej hranice PHP, no chyba pamäte na hlbšej úrovni môže zraniteľnú cestu stále dosiahnuť. Prehľad všetkých prechodných opatrení je pri Okamžité opatrenia, ak ešte nemôžete záplatovať.
; Pool FPM, napr. /etc/php/8.3/fpm/pool.d/www.conf (len do aktualizácie)
php_admin_value[memory_limit] = -1
# Kde všade sa memory_limit nastavuje (len čítanie)
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
Ako nastaviť hranicu cgroup pre službu FPM, opisuje Nastavenie pamäťových hraníc pomocou systemd a cgroups. Bez tejto vonkajšej hranice môže jediná požiadavka priviesť celý server do nedostatku pamäte.
Po každej zmene reštartujte všetkých workerov PHP. Bežiaci worker si ponecháva staré hodnoty.
Čo platí po aktualizácii
S opravenými verziami sa podľa príručky PHP zmenilo aj správanie memory_limit. Od 8.5.12, 8.4.27, 8.3.36 a 8.2.35 je mäkkou hranicou: požiadavka na pamäť, ktorá ju prekročí, sa v väčšine prípadov ešte smie dokončiť skôr, než sa vyvolá chyba. Nové nastavenie memory_hard_limit_percent určuje tvrdú hranicu, ktorá sa nikdy neprekročí.
| Nastavenie | Hodnota | Účinok podľa príručky |
|---|---|---|
memory_hard_limit_percent nenastavené alebo -1 |
štandard | tvrdá hranica dvojnásobok memory_limit do 1G, nad to memory_limit plus 1G |
memory_hard_limit_percent = 150 |
príklad | pri memory_limit=128M tvrdá hranica 192M |
memory_limit = -1 |
žiadna hranica | potom neexistuje ani tvrdá hranica |
Príručka uvádza praktický kontrolný bod: ak sa memory_hard_limit_percent nerozpozná, používaná verzia PHP je dotknutá a musí sa aktualizovať. Pri backportoch distribúcií skontrolujte stav navyše cez changelog balíka.
# Pozná binárny súbor FPM nové nastavenie? (upraviť číslo verzie)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'
Po aktualizácii memory_limit=-1 splnilo svoj účel. Vráťte sa ku konečnej hodnote, ktorá zodpovedá aplikácii, a zablokujte ju pomocou php_admin_value. Hranica cgroup môže zostať ako ďalšia ochranná vrstva.
Ako konkrétne pomáha PHP SOS?
- Zistíme, kde sa na vašom serveri
memory_limitnastavuje a prepisuje, vrátane aplikácií. - Prechodné opatrenia php.net zavedieme na správnom mieste a doplníme hranicu cgroup pre službu FPM.
- Cez službu záplat PHP uvedieme PHP na opravený stav a reštartujeme všetkých workerov.
- Potom opäť nastavíme vhodnú konečnú hodnotu a nastavenia zdokumentujeme.
Časté otázky
Aká je štandardná hodnota memory_limit?
Podľa príručky PHP 128M. Hodnota obmedzuje, koľko pamäte smie obsadiť jeden skript. Dá sa zmeniť v php.ini, v konfigurácii servera, v poole FPM a za behu cez ini_set(), pokiaľ nie je zablokovaná pomocou php_admin_value.
Prečo php.net pri PHP2Shell radí memory_limit=-1?
Jedna zo zraniteľností, CVE-2026-109618, súvisí so stavom pri nedostatku pamäte. Podľa php.net memory_limit=-1 odstráni cielene vyvolateľné dosiahnutie pamäťovej hranice PHP, nie však každú chybu pamäte. Opatrenie nie je úplnou ochranou a musí sa kombinovať s pamäťovou hranicou cez kontajner alebo cgroup.
Smiem hranicu namiesto toho nastaviť pomocou ulimit?
Nie. php.net výslovne odrádza od použitia RLIMIT_AS alebo RLIMIT_DATA ako náhrady, pretože tieto hranice môžu vyvolať práve zraniteľnú chybu pri požiadavke na pamäť. Odporúča sa hranica cez kontajner alebo cgroup.
Čo platí po aktualizácii na opravenú verziu PHP?
Podľa príručky je memory_limit v opravených verziách mäkkou hranicou, doplnenou tvrdou hranicou cez memory_hard_limit_percent. Prechodné opatrenie s -1 tým splnilo svoj účel a opäť by mala platiť konečná hodnota zodpovedajúca aplikácii.