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 →

memory_limit pareizi iestatīt

memory_limit ierobežo atmiņu katram PHP pieprasījumam. Pēc PHP2Shell php.net pagaidām iesaka pretējo. Kas spēkā ikdienas darbībā, pārejas posmā un pēc atjauninājuma.

Aktuāls uz 4 min lasīšanas laiksNostiprināšana un konfigurācija

Īsi sakot: memory_limit nosaka, cik daudz atmiņas drīkst aizņemt viens PHP pieprasījums; noklusējums ir 128M. Ikdienas darbībā iestatiet galīgu vērtību, kas atbilst lietojumprogrammai, un bloķējiet to ar php_admin_value. Kamēr PHP2Shell nav ielāpots, php.net pagaidām iesaka memory_limit=-1, nepārrakstāmu un kombinētu ar robežu caur konteineru vai cgroup, nevis caur RLIMIT_AS vai RLIMIT_DATA. Pēc atjauninājuma atkal spēkā ir galīga vērtība.

Ikdienas iestatījums, kas pēkšņi kļūst par drošības jautājumu

Gadiem memory_limit bija regulēšanas skrūve izstrādātājiem. Ja vietne ziņo „Allowed memory size exhausted”, vērtību palielina, un problēma ir atrisināta. Ar PHP2Shell tas ir kļuvis par drošības jautājumu, un php.net ieteikums no pirmā acu uzmetiena šķiet paradoksāls: pārejas laikam PHP paša atmiņas robežai pilnībā jāatkrīt.

Fons ir CVE-2026-109618. Saskaņā ar PHP projektu Out-of-Memory stāvoklis var pārtraukt PHP brīdī, kad pieprasījuma dati ir tikai daļēji inicializēti. Pieprasījuma sakopšana tad nederīgus datus var uzskatīt par derīgiem. Tehniskās detaļas atrodamas sadaļā CVE-2026-109618, kas atmiņas trūkuma gadījumā notiek PHP iekšienē, izskaidro memory_limit un Out-of-Memory. Uzturētājiem svarīgs ir jautājums: kura vērtība kad ir spēkā un kur tai jābūt?

Ko memory_limit dara ikdienas darbībā

Saskaņā ar PHP rokasgrāmatu memory_limit ierobežo atmiņu, ko drīkst aizņemt skripts, un tā pasargā serveri no slikti rakstīta koda. Noklusējums ir 128M, -1 nozīmē bez robežas. Saīsinātie pieraksti, piemēram, 256M vai 1G, ir atļauti.

Drošībai svarīgas divas īpašības. Pirmkārt, vērtību var mainīt jebkur, arī izpildes laikā ar ini_set(). Daudzi CMS un veikali to paši palielina, piemēram, importiem vai attēlu apstrādei. Kas grib vērtību uzspiest, tam tā jāiestata ar php_admin_value; saskaņā ar rokasgrāmatu šādi iestatītās vērtības nevar pārrakstīt ar ini_set(). Otrkārt, rokasgrāmata iesaka, lai memory_limit būtu lielāks par post_max_size.

Kāda vērtība der, atkarīgs no lietojumprogrammas. Skatiens kļūdu žurnālā parāda, vai parādās ziņojumi par izsmeltu atmiņu un kuros izsaukumos. Sevi ir apliecinājusi vērtības noteikšana katrai vietnei savā FPM pūlā: devīgāka veikalam ar importiem, šaurāka vienkāršai uzņēmuma vietnei. Vispārīgi ļoti augsta vērtība visām vietnēm izšķiež aizsargājošo efektu, jo tad viens kļūdains vai ļaunprātīgi izmantots pieprasījums var piesaistīt daudz atmiņas.

Kopš PHP 8.5 ir arī max_memory_limit. Šo iestatījumu var iestatīt tikai startējot, un tas ierobežo, cik augstu memory_limit vispār drīkst iestatīt. Augstākas vērtības tiek nogrieztas ar brīdinājumu. Noklusējums -1 nozīmē bez augšējās robežas.

memory_limit pēc PHP2Shell: php.net pārejas pasākums

Serveriem, kas vēl nav atjaunināti uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprinātu backport, php.net 2026. gada 21. oktobra drošības paziņojumā min šādus soļus. Tie samazina atsevišķu uzbrukuma ceļu risku, bet saskaņā ar php.net instalāciju nepadara drošu:

  1. Iestatīt memory_limit=-1, pēc iespējas tā, lai lietojumprogrammas vērtību nevarētu pārrakstīt, piemēram, ar php_admin_value FPM pūlā vai Apache konfigurācijā.
  2. Pārbaudīt, ka nekur atkal netiek iestatīta galīga robeža, ne citā pūlā, ne direktorijas konfigurācijā, ne lietojumprogrammā.
  3. Iestatīt atmiņas robežu caur konteineru vai cgroup, kā pieejamības aizsardzību, pēc iespējas tā, lai pārsniegšanas gadījumā tiktu pārtraukts tikai skartais worker.
  4. Neizmantot RLIMIT_AS vai RLIMIT_DATA. Šīs robežas saskaņā ar php.net var izraisīt tieši ievainojamo kļūdu atmiņas pieprasīšanā.

php.net par to skaidro, ka -1 novērš mērķtiecīgi izraisāmu PHP atmiņas robežas sasniegšanu, bet atmiņas kļūda dziļākā līmenī ievainojamo ceļu joprojām var sasniegt. Visu pārejas pasākumu pārskats atrodams sadaļā Tūlītēji pasākumi, ja vēl nevarat ielāpot.

; FPM pūls, piem., /etc/php/8.3/fpm/pool.d/www.conf (tikai līdz atjauninājumam)
php_admin_value[memory_limit] = -1
# Kur visur tiek iestatīts memory_limit (tikai lasīšana)
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

Kā iestatīt cgroup robežu FPM pakalpojumam, apraksta Atmiņas robežu iestatīšana ar systemd un cgroups. Bez šīs ārējās robežas viens pieprasījums var visu serveri novest atmiņas trūkumā.

Svarīgi

Pēc katras izmaiņas pārstartējiet visus PHP worker procesus. Darbojošs worker saglabā savas vecās vērtības.

Kas spēkā pēc atjauninājuma

Ar labotajām versijām saskaņā ar PHP rokasgrāmatu ir mainījusies arī memory_limit uzvedība. Sākot ar 8.5.12, 8.4.27, 8.3.36 un 8.2.35 tā ir mīksta robeža: atmiņas pieprasījumam, kas to pārsniedz, vairumā gadījumu vēl drīkst tikt pabeigts, pirms tiek izraisīta kļūda. Jauns iestatījums memory_hard_limit_percent nosaka stingru robežu, kas nekad netiek pārsniegta.

Iestatījums Vērtība Ietekme saskaņā ar rokasgrāmatu
memory_hard_limit_percent nav iestatīts vai -1 noklusējums stingrā robeža divreiz augstāka par memory_limit līdz 1G, virs tā memory_limit plus 1G
memory_hard_limit_percent = 150 piemērs ja memory_limit=128M, stingrā robeža 192M
memory_limit = -1 bez robežas tad nav arī stingras robežas

Rokasgrāmata min praktisku pārbaudes punktu: ja memory_hard_limit_percent netiek atpazīts, izmantotā PHP versija ir skarta un jāatjaunina. Distributīvu backport gadījumā stāvokli papildus pārbaudiet pēc pakotnes changelog.

# Vai FPM binārfails pazīst jauno iestatījumu? (pielāgot versijas numuru)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'

Pēc atjauninājuma memory_limit=-1 ir izpildījis savu mērķi. Atgriezieties pie galīgas vērtības, kas atbilst lietojumprogrammai, un bloķējiet to ar php_admin_value. Cgroup robeža var saglabāties kā papildu aizsardzības slānis.

Kā PHP SOS palīdz konkrēti?

  • Mēs noskaidrojam, kur jūsu serverī memory_limit tiek iestatīts un pārrakstīts, ieskaitot lietojumprogrammas.
  • Mēs ieviešam php.net pārejas pasākumus pareizajā vietā un papildinām ar cgroup robežu FPM pakalpojumam.
  • Ar PHP ielāpu pakalpojumu mēs PHP novedam līdz labotam stāvoklim un pārstartējam visus worker procesus.
  • Pēc tam mēs atkal iestatām piemērotu galīgu vērtību un dokumentējam iestatījumus.

Biežāk uzdotie jautājumi

Kāda ir memory_limit noklusējuma vērtība?

Saskaņā ar PHP rokasgrāmatu 128M. Vērtība ierobežo, cik daudz atmiņas drīkst aizņemt viens skripts. To var mainīt php.ini, servera konfigurācijā, FPM pūlā un izpildes laikā ar ini_set(), ja vien tā nav bloķēta ar php_admin_value.

Kāpēc php.net PHP2Shell gadījumā iesaka memory_limit=-1?

Viena no ievainojamībām, CVE-2026-109618, ir saistīta ar stāvokli atmiņas trūkuma gadījumā. Saskaņā ar php.net memory_limit=-1 novērš mērķtiecīgi izraisāmu PHP atmiņas robežas sasniegšanu, bet ne katru atmiņas kļūdu. Pasākums nav pilnīga aizsardzība, un tas jākombinē ar atmiņas robežu caur konteineru vai cgroup.

Vai robežu drīkstu tā vietā iestatīt ar ulimit?

Nē. php.net nepārprotami atsaka kā aizstājēju izmantot RLIMIT_AS vai RLIMIT_DATA, jo šīs robežas var izraisīt tieši ievainojamo kļūdu atmiņas pieprasīšanā. Ieteicama robeža caur konteineru vai cgroup.

Kas spēkā pēc atjauninājuma uz labotu PHP versiju?

Saskaņā ar rokasgrāmatu labotajās versijās memory_limit ir mīksta robeža, ko papildina stingrā robeža caur memory_hard_limit_percent. Pārejas pasākums ar -1 tad ir izpildījis savu mērķi, un atkal jāpiemēro galīga, lietojumprogrammai piemērota vērtība.

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