Ī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. Arini_set(),.user.inivai.htaccessto 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_setvaimail, 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.
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.