Εν συντομία: Με το PHP disable_functions αποκλείετε συναρτήσεις μέσω των οποίων η PHP εκτελεί εντολές συστήματος, όπως οι exec, shell_exec ή proc_open. Αυτό δυσκολεύει τους επιτιθέμενους στο επόμενο βήμα μετά από μια εισβολή. Η ρύθμιση ισχύει μόνο από το php.ini ή το pool του FPM, πρέπει να ταιριάζει με την εφαρμογή και δεν αντικαθιστά την ενημέρωση.
Γιατί το disable_functions έχει νόημα ακριβώς τώρα
Στο PHP2Shell πρόκειται για την απομακρυσμένη εκτέλεση κακόβουλου κώδικα χωρίς σύνδεση. Οι δύο ευπάθειες CVE-2026-109618 και CVE-2026-109619 βρίσκονται στον ίδιο τον διερμηνέα PHP και διορθώθηκαν στις PHP 8.5.12, 8.4.27, 8.3.36 και 8.2.35. Η ενημέρωση είναι ο μόνος τρόπος να κλείσουν.
Η θωράκιση εφαρμόζεται ένα επίπεδο αργότερα. Όποιος μπορέσει μία φορά να εκτελέσει κώδικα σε έναν διακομιστή, θέλει συνήθως να προχωρήσει: να εκκινήσει εντολές συστήματος, να κατεβάσει εργαλεία, να στήσει μια μόνιμη κερκόπορτα. Πολλά από αυτά τα βήματα περνούν από λίγες συναρτήσεις PHP. Αν αυτές είναι αποκλεισμένες, ο δρόμος γίνεται επίπονος και πιο ευδιάκριτος.
Το disable_functions δεν είναι γι' αυτό υποκατάστατο των patches, αλλά συστατικό για την περίπτωση που, παρά κάθε προσοχή, κάτι περάσει. Αυτό ισχύει για μελλοντικές ευπάθειες όπως και για το PHP2Shell.
Τι προσφέρει το PHP disable_functions και τι όχι
Η ρύθμιση αφαιρεί τις αναφερόμενες συναρτήσεις από το περιβάλλον εκτέλεσης. Αν ένα script καλέσει μια αποκλεισμένη συνάρτηση, η PHP διακόπτει με σφάλμα. Ο αποκλεισμός ισχύει για κάθε κώδικα που εκτελείται σε αυτή τη διεργασία PHP, άρα και για κώδικα που έχει εισαχθεί κρυφά.
Τα όρια πρέπει να τα γνωρίζετε:
- Η ρύθμιση δεν είναι κλειστός προστατευτικός χώρος. Επεκτάσεις PHP, σφάλματα στον διερμηνέα ή προγράμματα εκτός PHP μπορούν να την παρακάμψουν.
- Δεν εμποδίζει έναν επιτιθέμενο να διαβάζει ή να γράφει αρχεία στα οποία έχει πρόσβαση ο χρήστης PHP. Γι' αυτό είναι υπεύθυνα τα δικαιώματα αρχείων και η απομόνωση.
- Ισχύει μόνο από το php.ini ή ως
php_admin_value. Μεini_set(),.user.iniή.htaccessδεν μπορεί να οριστεί.
Το μεγαλύτερο όφελος το φέρνει το disable_functions σε συνδυασμό με ένα καθαρό php.ini, ξεχωριστούς χρήστες ανά ιστότοπο και περιοριστικά δικαιώματα αρχείων. Τα βασικά αναφέρονται στον οδηγό Ασφαλής διαμόρφωση του php.ini.
Ποιες συναρτήσεις πρέπει να αποκλείσετε
Για τυπικούς ιστοτόπους χωρίς ανάγκη εντολών συστήματος έχει αποδειχθεί αποτελεσματική η παρακάτω λίστα. Περιλαμβάνει συναρτήσεις για την εκκίνηση διεργασιών και τον έλεγχο διεργασιών που εκτελούνται.
| Ομάδα | Συναρτήσεις | Τυπική νόμιμη χρήση |
|---|---|---|
| Εκτέλεση εντολών | exec, shell_exec, system, passthru |
Επεξεργασία εικόνας, αντίγραφα ασφαλείας μέσω script |
| Άνοιγμα διεργασιών | proc_open, popen |
Composer, εργαλεία PDF, αποστολή αλληλογραφίας |
| Έλεγχος διεργασιών | proc_nice, proc_terminate, proc_get_status |
Ουρές, εργασίες παρασκηνίου |
| Διαχείριση διεργασιών | pcntl_exec, pcntl_fork |
συνήθως μόνο στη γραμμή εντολών |
| Σήματα και δικαιώματα | posix_kill, posix_setuid |
σπάνια στη λειτουργία ιστού |
Ως διαμόρφωση μοιάζει έτσι:
; php.ini του τρόπου λειτουργίας ιστού, π.χ. /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
Αν η λίστα δεν ισχύει για όλους τους ιστοτόπους στον διακομιστή, ορίστε την ανά pool του FPM. Ελέγξτε μετά το reload ποια λίστα ισχύει πράγματι σε αυτό το pool:
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (απόσπασμα)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
Έλεγχος της εφαρμογής εκ των προτέρων: έτσι αποφεύγετε τις διακοπές
Όποιος ορίσει τη λίστα χωρίς έλεγχο, διακινδυνεύει να σταματήσουν ξαφνικά η σμίκρυνση εικόνων, τα τιμολόγια PDF ή η αποστολή αλληλογραφίας. Αναζητήστε γι' αυτό εκ των προτέρων στον κώδικα τις επηρεαζόμενες συναρτήσεις:
# Πού και πόσο συχνά χρησιμοποιούνται οι συναρτήσεις στον κώδικα;
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
Τα ευρήματα δεν σημαίνουν αυτόματα ότι η συνάρτηση χρειάζεται κατά τη λειτουργία. Πολλές βιβλιοθήκες ελέγχουν πρώτα αν μια συνάρτηση είναι διαθέσιμη και αλλιώς καταφεύγουν σε εναλλακτική. Αποφασιστική είναι μια δοκιμή σε περιβάλλον staging με όλες τις σημαντικές διαδικασίες: παραγγελία, τιμολόγιο, αποστολή φόρμας, upload εικόνας, προγραμματισμένες εργασίες.
Αν μια εφαρμογή απαιτεί οπωσδήποτε μία από αυτές τις συναρτήσεις, ελέγξτε τις απαιτήσεις συστήματος του κατασκευαστή στην επίσημη σελίδα του. Συχνά η εργασία μπορεί να μεταφερθεί σε ξεχωριστό pool ή σε ένα script γραμμής εντολών που δεν είναι προσβάσιμο μέσω ιστού.
Ενεργοποίηση της ρύθμισης και έλεγχος του αποτελέσματος
Μετά την αλλαγή η PHP πρέπει να διαβάσει ξανά τη διαμόρφωση. Ελέγξτε στη συνέχεια την τιμή στον τρόπο λειτουργίας του ιστότοπού σας και όχι στη γραμμή εντολών:
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Έλεγχος του log σφαλμάτων για κλήσεις αποκλεισμένων συναρτήσεων
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
Τα μηνύματα στο log σφαλμάτων είναι πολύτιμα και αργότερα. Αν εμφανιστούν ξαφνικά εκεί κλήσεις αποκλεισμένων συναρτήσεων, παρόλο που η εφαρμογή σας δεν τις χρησιμοποιεί, αυτό μπορεί να δείχνει κώδικα που έχει εισαχθεί κρυφά. Πώς προχωρείτε τότε, περιγράφει ο οδηγός Εντοπισμός και αφαίρεση webshell.
Τυπικά λάθη στη χρήση του disable_functions
Στην πράξη η θωράκιση σπάνια αποτυγχάνει λόγω τεχνικής, συνήθως λόγω λεπτομερειών. Αυτά τα λάθη είναι ιδιαίτερα συχνά:
- Αλλαγή λάθος αρχείου: Η λίστα υπάρχει μόνο στο php.ini της γραμμής εντολών, ο ιστότοπος εκτελείται μέσω PHP-FPM και παραμένει απροστάτευτος.
- Καμία επανεκκίνηση: Το αρχείο είναι σωστό, αλλά οι διεργασίες που εκτελούνται εργάζονται ακόμη με την παλιά διαμόρφωση.
- Υπερβολικά ευρύς αποκλεισμός: Συναρτήσεις όπως οι
ini_setήmailαποκλείονται μαζί και σημαντικές διαδικασίες διακόπτονται απαρατήρητα. Τα σφάλματα γίνονται τότε συχνά αντιληπτά μόλις μετά από ημέρες, π.χ. από τις απούσες επιβεβαιώσεις παραγγελιών. - Μία φορά ορίστηκε, ποτέ δεν ελέγχθηκε: Μετά από μετεγκατάσταση, αλλαγή έκδοσης PHP ή νέα εγκατάσταση μέσω του πάνελ φιλοξενίας, η λίστα έχει εξαφανιστεί.
- Ψευδής αίσθηση ασφάλειας: Ο αποκλεισμός εκλαμβάνεται ως υποκατάστατο των ενημερώσεων. Δεν κλείνει όμως καμία ευπάθεια στον διερμηνέα.
Συμπεριλάβετε γι' αυτό τον έλεγχο της ενεργής τιμής στη ρουτίνα σας μετά από κάθε ενημέρωση PHP. Μια σύντομη ματιά αρκεί, κοστίζει ελάχιστο χρόνο και αποτρέπει να χαθεί σιωπηλά μια θωράκιση.
Σε περισσότερους ιστοτόπους στον ίδιο διακομιστή: δημιουργήστε για κάθε ιστότοπο ένα δικό του pool με δική του λίστα. Συμπληρωματικά, το open_basedir περιορίζει τους καταλόγους στους οποίους επιτρέπεται η πρόσβαση της PHP.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Ελέγχουμε τον κώδικα και τις διαδικασίες της εφαρμογής σας για τη χρήση κρίσιμων συναρτήσεων.
- Ορίζουμε ανά ιστότοπο μια κατάλληλη λίστα αποκλεισμού και τη δοκιμάζουμε πριν την παραγωγή.
- Συνδυάζουμε τον αποκλεισμό με pools, δικαιώματα αρχείων και καταγραφή σε μια συνεκτική έννοια θωράκισης.
- Τεκμηριώνουμε τις ρυθμίσεις και παρακολουθούμε το log σφαλμάτων για ύποπτες κλήσεις.
Πώς εξελίσσεται αυτό ως ενιαίο πακέτο, περιγράφει η υπηρεσία Θωράκιση διακομιστών PHP.
Συχνές ερωτήσεις
Μπορώ να ορίσω το disable_functions με ini_set() ή .htaccess;
Όχι. Η ρύθμιση ισχύει μόνο από το php.ini ή ως php_admin_value στο pool του FPM ή στη διαμόρφωση του Apache. Δεν μπορεί να οριστεί κατά την εκτέλεση και η εφαρμογή δεν μπορεί επίσης να ξεκλειδώσει ξανά αποκλεισμένες συναρτήσεις.
Προστατεύει το disable_functions από το PHP2Shell;
Όχι. Το PHP2Shell αφορά τον ίδιο τον διερμηνέα PHP και η ευπάθεια κλείνει μόνο με την ενημέρωση. Οι αποκλεισμένες συναρτήσεις μπορούν όμως να περιορίσουν το περιθώριο ενός επιτιθέμενου μετά από μια επιτυχημένη εκμετάλλευση.
Γιατί το php -i εμφανίζει διαφορετική λίστα από τον ιστότοπό μου;
Η γραμμή εντολών διαβάζει συχνά δικό της php.ini. Για τον ιστότοπο μετρά η διαμόρφωση του PHP-FPM, του mod_php ή του LiteSpeed. Ελέγξτε γι' αυτό την τιμή στον τρόπο λειτουργίας μέσω του οποίου εκτελείται ο ιστότοπός σας.
Ποιες εφαρμογές χρειάζονται proc_open ή exec;
Εξαρτάται από την εφαρμογή. Τυπικά είναι η επεξεργασία εικόνας μέσω εξωτερικών προγραμμάτων, η δημιουργία PDF, η αποστολή αλληλογραφίας μέσω sendmail ή εργαλεία όπως το Composer. Ελέγξτε το στον κώδικα και στις απαιτήσεις συστήματος του κατασκευαστή.