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 →

PHP disable_functions pareiza lietošana

Ar disable_functions bloķējat riskantas PHP funkcijas. Kā sarakstu iestatīt atbilstoši lietojumprogrammai, neparalizējot vietni.

Aktuāls uz 4 min lasīšanas laiksRokasgrāmatas

Īsi: ar PHP disable_functions bloķējat funkcijas, ar kurām PHP izpilda sistēmas komandas, piemēram, exec, shell_exec vai proc_open. Tas uzbrucējam pēc ielaušanās apgrūtina nākamo soli. Iestatījums darbojas tikai no php.ini vai FPM pūla, tam jāatbilst lietojumprogrammai, un tas neaizstāj atjauninājumu.

Kāpēc disable_functions tagad ir lietderīgs

PHP2Shell gadījumā runa ir par ļaunprātīga koda attālinātu izpildi bez pieteikšanās. Abas ievainojamības CVE-2026-109618 un CVE-2026-109619 ir pašā PHP interpretatorā, izlabotas PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35. Atjauninājums ir vienīgais veids, kā tās aizvērt.

Nostiprināšana iedarbojas par vienu līmeni vēlāk. Kas reiz var serverī izpildīt kodu, parasti grib tikt tālāk: startēt sistēmas komandas, lejupielādēt rīkus, ierīkot pastāvīgu slēpto piekļuvi. Daudzi no šiem soļiem norit caur dažām PHP funkcijām. Ja tās ir bloķētas, ceļš kļūst grūtāks un pamanāmāks.

Tāpēc disable_functions nav ielāpu aizstājējs, bet elements gadījumam, ja neskatoties uz visu piesardzību kaut kas tiek cauri. Tas attiecas gan uz nākotnes ievainojamībām, gan uz PHP2Shell.

Ko PHP disable_functions dara un ko ne

Iestatījums izņem nosauktās funkcijas no izpildes vides. Ja skripts izsauc bloķētu funkciju, PHP pārtrauc darbu ar kļūdu. Bloķēšana attiecas uz katru kodu, kas darbojas šajā PHP procesā, tātad arī uz ievadīto kodu.

Robežas jums jāzina:

  • Iestatījums nav noslēgta aizsargtelpa. PHP paplašinājumi, kļūdas interpretatorā vai programmas ārpus PHP to var apiet.
  • Tas neliedz uzbrucējam lasīt vai rakstīt failus, kam PHP lietotājam ir piekļuve. Par to atbild failu tiesības un izolācija.
  • Tas darbojas tikai no php.ini vai kā php_admin_value. Ar ini_set(), .user.ini vai .htaccess to iestatīt nevar.

Visvairāk disable_functions dod kopā ar tīru php.ini, atsevišķiem lietotājiem katrai vietnei un ierobežojošām failu tiesībām. Pamatus atradīsiet ceļvedī php.ini drošā konfigurēšana.

Kuras funkcijas vajadzētu bloķēt

Tipiskām vietnēm bez vajadzības pēc sistēmas komandām ir noderējis šāds saraksts. Tas ietver funkcijas procesu startēšanai un darbojošos procesu vadīšanai.

Grupa Funkcijas Tipisks likumīgs pielietojums
Komandu izpilde exec, shell_exec, system, passthru attēlu apstrāde, dublēšana ar skriptu
Procesu atvēršana proc_open, popen Composer, PDF rīki, pasta sūtīšana
Procesu vadība proc_nice, proc_terminate, proc_get_status rindas, fona uzdevumi
Procesu pārvaldība pcntl_exec, pcntl_fork parasti tikai komandrindā
Signāli un tiesības posix_kill, posix_setuid reti tīmekļa darbībā

Kā konfigurācija tas izskatās šādi:

; tīmekļa darbības režīma php.ini, piem., /etc/php/8.3/fpm/php.ini
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,proc_nice,proc_terminate,proc_get_status,pcntl_exec,pcntl_fork,posix_kill,posix_setuid

Ja saraksts neattiecas uz visām serverī esošajām vietnēm, iestatiet to katram FPM pūlam. Pēc pārlādes pārbaudiet, kurš saraksts šajā pūlā patiešām ir spēkā:

; /etc/php/8.3/fpm/pool.d/meine-seite.conf (fragments)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen

Lietojumprogrammu iepriekš pārbaudīt: tā izvairāties no atteikumiem

Kas sarakstu iestata nepārbaudītu, riskē, ka attēlu samazināšana, PDF rēķini vai pasta sūtīšana pēkšņi pārstās darboties. Tāpēc iepriekš kodā meklējiet skartās funkcijas:

# Kur un cik bieži funkcijas tiek izmantotas kodā?
grep -rnoE "\b(exec|shell_exec|system|passthru|proc_open|popen|pcntl_exec)\s*\(" /var/www/meine-seite --include="*.php" \
  | cut -d: -f1 | sort | uniq -c | sort -rn | head -30

Atradumi automātiski nenozīmē, ka funkcija darbībā ir vajadzīga. Daudzas bibliotēkas vispirms pārbauda, vai funkcija ir pieejama, un citādi izmanto citu ceļu. Izšķirošs ir tests starpposma (staging) vidē ar visām svarīgajām norisēm: pasūtījums, rēķins, veidlapas sūtīšana, attēla augšupielāde, ieplānotie uzdevumi.

Ja lietojumprogramma obligāti prasa kādu no šīm funkcijām, pārbaudiet ražotāja sistēmas prasības tā oficiālajā vietnē. Bieži uzdevumu var pārvietot uz atsevišķu pūlu vai komandrindas skriptu, kas nav pieejams caur tīmekli.

Iestatījuma aktivizēšana un iedarbības kontrole

Pēc izmaiņas PHP konfigurācija jānolasa no jauna. Pēc tam pārbaudiet vērtību jūsu vietnes darbības režīmā, nevis komandrindā:

sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Pārbaudīt kļūdu žurnālu, vai nav bloķēto funkciju izsaukumu
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20

Ziņojumi kļūdu žurnālā ir vērtīgi arī vēlāk. Ja tur pēkšņi parādās bloķētu funkciju izsaukumi, kaut gan jūsu lietojumprogramma tās neizmanto, tas var norādīt uz ievadītu kodu. Kā rīkoties tālāk, apraksta ceļvedis Webshell atklāšana un noņemšana.

Tipiskas kļūdas, lietojot disable_functions

Praksē nostiprināšana reti cieš tehnisku iemeslu dēļ, bet gan sīkumu dēļ. Šīs kļūdas ir sevišķi izplatītas:

  • Mainīts nepareizais fails: saraksts ir tikai komandrindas php.ini, vietne darbojas caur PHP-FPM un paliek neaizsargāta.
  • Nav pārstartēšanas: fails ir pareizs, bet darbojošies procesi vēl strādā ar veco konfigurāciju.
  • Bloķēts pārāk plaši: līdzi tiek bloķētas funkcijas, piemēram, ini_set vai mail, un svarīgas norises nemanot pārtrūkst. Kļūdas tad bieži pamana tikai pēc dienām, piemēram, kad nenāk pasūtījumu apstiprinājumi.
  • Vienreiz iestatīts, nekad nepārbaudīts: pēc pārcelšanās, PHP versijas maiņas vai atkārtotas uzstādīšanas ar hostinga paneli saraksts ir pazudis.
  • Maldinoša drošības sajūta: bloķēšanu uzskata par atjauninājumu aizstājēju. Taču tā neaizver ievainojamību interpretatorā.

Tāpēc aktīvās vērtības pārbaudi iekļaujiet savā rutīnā pēc katra PHP atjauninājuma. Īss skatiens pietiek, prasa maz laika un neļauj nostiprināšanai nemanot pazust.

Padoms

Ja serverī ir vairākas vietnes: katrai vietnei izveidojiet savu pūlu ar savu sarakstu. Papildus open_basedir ierobežo direktorijus, kuriem PHP drīkst piekļūt.

Kā PHP SOS palīdz konkrēti?

  • Pārbaudām jūsu lietojumprogrammas kodu un norises attiecībā uz kritisko funkciju izmantošanu.
  • Katrai vietnei nosakām piemērotu bloķēšanas sarakstu un pārbaudām to pirms palaišanas.
  • Bloķēšanu apvienojam ar pūliem, failu tiesībām un protokolēšanu saskaņotā nostiprināšanas koncepcijā.
  • Dokumentējam iestatījumus un uzraugām kļūdu žurnālu, vai nav aizdomīgu izsaukumu.

Kā tas norit kā kopējs risinājums, apraksta pakalpojums Servera nostiprināšana PHP tīmekļa serveriem.

Biežāk uzdotie jautājumi

Vai disable_functions drīkst iestatīt ar ini_set() vai .htaccess?

Nē. Iestatījums darbojas tikai no php.ini vai kā php_admin_value FPM pūlā, attiecīgi Apache konfigurācijā. Izpildes laikā to iestatīt nevar, un lietojumprogramma bloķētās funkcijas arī nevar atkal atļaut.

Vai disable_functions pasargā no PHP2Shell?

Nē. PHP2Shell skar pašu PHP interpretatoru, un ievainojamību aizver tikai atjauninājums. Bloķētas funkcijas tomēr var ierobežot uzbrucēja rīcības brīvību pēc sekmīgas izmantošanas.

Kāpēc php -i rāda citu sarakstu nekā mana vietne?

Komandrinda bieži nolasa savu php.ini. Vietnei svarīga ir PHP-FPM, mod_php vai LiteSpeed konfigurācija. Tāpēc vērtību pārbaudiet tajā darbības režīmā, caur kuru darbojas jūsu vietne.

Kurām lietojumprogrammām vajag proc_open vai exec?

Tas atkarīgs no lietojumprogrammas. Tipiski ir attēlu apstrāde ar ārējām programmām, PDF veidošana, pasta sūtīšana ar sendmail vai rīki, piemēram, Composer. Pārbaudiet to kodā un ražotāja sistēmas prasībās.

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