Dabartinė padėtis: PHP2Shell. Du kritiniai PHP pažeidžiamumai (CVSS 9,2) leidžia vykdyti kenkėjišką kodą be prisijungimo. Pataisos nuo 2026-10-21.Ką dabar daryti →

session.upload_progress išjungimas: teisingai ir visam laikui

Priemonė nuo CVE-2026-115560 ir viena iš PHP2Shell pereinamųjų priemonių nustatoma greitai. Kad ji išliktų, ji turi būti tinkamoje vietoje, užrakinta ir po kiekvieno atnaujinimo patikrinama iš naujo.

Būsena 5 min. skaitymoSutvirtinimas ir konfigūracija

Trumpai: nustatykite session.upload_progress.enabled=0 php.ini, PHP-FPM baseine arba Apache serverio konfigūracijoje, niekada per ini_set() ar .user.ini, ir po to iš naujo paleiskite visus PHP darbinius procesus (worker). Priemonė tampa nuolatinė tik tada, kai reikšmė užrakinta nuo įjungimo iš naujo, galioja kiekvienu veikimo režimu ir kiekvienoje įdiegtoje PHP versijoje ir yra tikrinama po atnaujinimų.

Mažas nustatymas su dvigubu poveikiu

Retai kuris pavienis PHP nustatymas sulaukė tiek dėmesio. Kai php.net 2026 m. spalio 21 d. paskelbė pataisas nuo PHP2Shell, session.upload_progress.enabled=0 buvo pereinamųjų priemonių sąraše. Po dviejų dienų sekė pastaba dėl CVE-2026-115560, ir rekomenduota priemonė buvo tas pats nustatymas.

Daugelis administratorių per tas dienas jį greitai nustatė. Ar jis veikia visur, yra kitas klausimas. Tipiškos spragos išvardijamos greitai: reikšmė yra tik CLI konfigūracijoje, pamiršta antra PHP versija arba hostingo valdymo skydelis perrašė failą kitą kartą išsaugodamas. Šis straipsnis parodo, kaip priemonę įgyvendinti taip, kad ji galiotų ir po trijų mėnesių.

Svarbu iš anksto: išjungimas nepakeičia PHP atnaujinimo. Pasak specializuotų pranešimų, vien session.upload_progress.enabled=0 neuždaro abiejų PHP2Shell spragų. Ką tiksliai apima CVE-2026-115560, paaiškina puslapis CVE-2026-115560: pastaba dėl sesijos įkėlimo eigos.

Ką funkcija daro ir kam jos reikia

Sesijos įkėlimo eiga (Session-Upload-Progress) failo įkėlimo metu nuolat rašo eigą į sesiją, kad programa galėtų rodyti eigos juostą. PHP funkcija numatytai įjungta. PHP vadovas pats nurodo, kad siuntėjo pateikti failų ir laukų pavadinimai tada nepatikrinti patenka į sesijos saugyklą, ir rekomenduoja funkciją išjungti, jei programa jos nenaudoja.

Ar jūsų programa ją naudoja, išsiaiškinsite tik skaitančia paieška kode:

# Ieško eigos funkcijos naudojimo programos kode
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/

Jei paieška nieko neranda, funkciją galite išjungti be juntamų pasekmių. Jei atitikmenų yra, programa praranda tik eigos rodymą, ne įkėlimą. Šiuolaikinės formos eigą dažniausiai ir taip matuoja naršyklėje.

session.upload_progress.enabled nustatymas tinkamoje vietoje

Pasak PHP vadovo, nustatymas turi režimą INI_PERDIR. Tai reiškia: jį galima nustatyti php.ini, serverio konfigūracijoje, .htaccess (tik mod_php) ir .user.ini (tik FPM ir CGI), bet ne vykdymo metu. php.net aiškiai atmeta .user.ini kaip priemonės vietą. Toliau pateiktoje lentelėje parodytos prasmingos vietos pagal veikimo režimą.

Veikimo režimas Rekomenduojama vieta Užrakina nuo perrašymo? Po to paleisti iš naujo
PHP-FPM baseino failas su php_admin_flag taip kiekvieną FPM paslaugą
PHP-FPM FPM SAPI php.ini ne, .user.ini galėtų perrašyti kiekvieną FPM paslaugą
Apache su mod_php VirtualHost arba serverio konfigūracija su php_admin_flag taip Apache visiškai
php-cgi, LiteSpeed, FrankenPHP atitinkamos vykdymo aplinkos php.ini tikrinti pagal sandarą visus vykdymo aplinkos procesus
Docker atvaizdas atskiras failas /usr/local/etc/php/conf.d/ kuriant taip, jei perrašymas neleidžiamas konteinerį sukurti iš naujo

Du patikimi variantai atrodo taip:

; PHP-FPM, pvz., /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache su mod_php, VirtualHost arba visame serveryje
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>

Papildomai verta įrašyti ir kiekvienos žiniatinklio SAPI php.ini kaip bazinę reikšmę. Tada nustatymas galioja ir naujiems baseinams, kuriuos kas nors sukurs vėliau. Kodėl php_admin_flag lemia skirtumą, aprašo straipsnis php_admin_value: nustatymų užrakinimas nuo perrašymo.

Veiksmingumo patikra žiniatinklio kontekste

Komandinė eilutė dažnai skaito kitą php.ini nei žiniatinklio serveris. Todėl php -i mažai ką įrodo. Net php-fpm8.3 -i rodo tik php.ini reikšmes, o ne įrašus iš baseinų. Patikima tik užklausa, kuri iš tikrųjų vyksta per baseiną.

Elkitės taip:

  1. Iš naujo paleiskite visas PHP paslaugas, pavyzdžiui, systemctl restart php8.3-fpm arba Apache su mod_php. Be paleidimo iš naujo toliau veikia sena reikšmė.
  2. Į žiniatinklio šakninį katalogą padėkite trumpą patikros failą su atsitiktiniu pavadinimu, kuris išveda tik dabartinę reikšmę.
  3. Failą vieną kartą iškvieskite per tikrąjį domeną ir užsirašykite rezultatą.
  4. Failą iš karto ištrinkite ir žingsnį pakartokite kiekvienai svetainei ir kiekvienam baseinui.
<?php
// Patikros failas: padėti tik trumpam, po to iš karto ištrinti
header('Content-Type: text/plain');
echo 'session.upload_progress.enabled = ', var_export(ini_get('session.upload_progress.enabled'), true), "\n";
echo 'PHP ', PHP_VERSION, ' / SAPI ', PHP_SAPI, "\n";

Tikimasi tuščios reikšmės arba '0'. Jei ten '1', jūsų nustatymas šiame baseine neveikia. Po PHP atnaujinimo papildomai patikrinkite, ar visi darbiniai procesai (worker) paleisti iš naujo, kaip aprašyta skyriuje PHP-FPM ir visų darbinių procesų paleidimas iš naujo.

Svarbu

Niekada nepalikite patikros failų. Jie išduoda versijas ir konfigūraciją ir yra mėgstamas automatizuotų skenavimų taikinys.

Kad nustatymas išliktų

Dauguma sugrįžimų atsiranda ne dėl užpuolikų, o dėl veiklos. Naujas baseinas nukopijuojamas iš seno šablono, paketo atnaujinimas sukuria naują php.ini arba kas nors hostingo skydelyje perjungia PHP versiją. Nuo tokių sugrįžimų padeda tvirti įpročiai.

  • Apimti visas versijas: daugelyje serverių lygiagrečiai veikia kelios PHP versijos. Kiekviena turi savo konfigūracijos aplankus ir jai reikia įrašo.
  • Pritaikyti šablonus: baseinų šablonuose, Ansible vaidmenyse, Dockerfile ir skydelio šablonuose turi būti reikšmė, kad naujos svetainės ją paveldėtų automatiškai.
  • Naudoti skydelio nustatymus: hostingo skydeliuose reikšmė priklauso skydelio numatytoms papildomoms direktyvoms, kitaip kitas pakeitimas perrašo rankinį darbą.
  • Tikrinti po atnaujinimų: ankstesnio skyriaus patikra priklauso kiekvieno PHP atnaujinimo kontroliniam sąrašui.
  • Dokumentuoti: užfiksuoti datą, serverį, baseinus ir rezultatą. Tai vėliau padeda vadovybei, draudikui ar auditoriams.

Kas .user.ini apskritai nenaudoja, gali visiškai išjungti tokių failų skaitymą su user_ini.filename = php.ini. Tačiau tai paveikia visus nustatymus, kuriuos ten laiko programos. Todėl šį žingsnį iš anksto išbandykite, ypač su CMS, kurios rašo savo .user.ini failus.

Kitos php.net pereinamosios priemonės, pavyzdžiui, post_max_size ribos ir atminties riba per cgroup, surinktos skyriuje Skubios priemonės, kai dar negalite pataisyti. Kaip PHP iš esmės tvarko savo konfigūracijos lygius, paaiškina php.ini paaiškinimas.

Kaip PHP SOS padeda konkrečiai?

  • Aprėpti esamą būklę: nustatome visas PHP versijas, veikimo režimus ir baseinus jūsų serveriuose ir nuskaitome veiksmingas reikšmes žiniatinklio kontekste.
  • Nustatyti švariai: įrašome nustatymą užrakintą baseinuose ir serverio konfigūracijoje ir kontroliuojamai iš naujo paleidžiame visus darbinius procesus (worker).
  • Išbandyti funkciją: po perėjimo patikriname įkėlimo formas ir medijos valdymą.
  • Užkirsti kelią sugrįžimams: pritaikome šablonus, diegimus ir skydelio nustatymus ir dokumentuojame būklę serverio sutvirtinimo rėmuose.

Dažni klausimai

Kodėl session.upload_progress.enabled=0 neveikia per ini_set()?

Pasak PHP vadovo, nustatymas priklauso INI_PERDIR režimui. Todėl jo apskritai negalima pakeisti vykdymo metu per ini_set(). php.net kaip tinkamas vietas nurodo php.ini, FPM baseiną arba serverio konfigūraciją ir aiškiai atmeta .user.ini.

Ar failų įkėlimai po išjungimo vis dar veikia?

Taip. Išjungiamas tik eigos pranešimas, kurį PHP įkėlimo metu rašo į sesiją. Pats įkėlimas tęsiasi. Paveiktos tik programos, kurios savo eigos juostą kuria būtent per šią PHP funkciją.

Ar programa gali funkciją vėl įjungti?

Per .htaccess failą su mod_php arba .user.ini su PHP-FPM iš principo tai įmanoma, kol reikšmė neužrakinta. Su php_admin_flag baseine ar Apache konfigūracijoje tai užkertate kelią.

Ar po kito PHP atnaujinimo reikšmę reikia atstatyti?

Ne, to nereikia. Daugumai programų funkcija nereikalinga, o PHP vadovas pats pataria tokiais atvejais ją išjungti. Po kiekvieno atnaujinimo tik patikrinkite, ar reikšmė vis dar galioja.

Šaltiniai

Skubus kontaktas

Kiekviena valanda svarbi. Parašykite mums dabar.

Trumpai aprašykite sistemą, PHP versiją ir pastebėjimus. Mes atsakysime, išsiaiškinsime padėtį ir dirbsime nuotoliu, kol incidentas bus užbaigtas ir dokumentuotas.

Skubi pagalba