Τρέχουσα κατάσταση: PHP2Shell. Δύο κρίσιμες ευπάθειες της PHP (CVSS 9.2) επιτρέπουν κακόβουλο κώδικα χωρίς σύνδεση. Patches από τις 21/10/2026.Τι πρέπει να γίνει τώρα →

Απενεργοποίηση του session.upload_progress: σωστά και μόνιμα

Η λύση για το CVE-2026-115560 και ένα από τα μεταβατικά μέτρα του PHP2Shell ορίζεται γρήγορα. Για να κρατήσει, πρέπει να βρίσκεται στο σωστό σημείο, να είναι κλειδωμένη και να ελέγχεται ξανά μετά από κάθε ενημέρωση.

Ημερομηνία 6 λεπτά ανάγνωσηςΣκλήρυνση και διαμόρφωση

Εν ολίγοις: Ορίστε το session.upload_progress.enabled=0 στο php.ini, στο pool του PHP-FPM ή στη διαμόρφωση διακομιστή του Apache, ποτέ με ini_set() ή .user.ini, και επανεκκινήστε στη συνέχεια όλους τους workers της PHP. Το μέτρο γίνεται μόνιμο μόνο όταν η τιμή είναι κλειδωμένη κατά της επανενεργοποίησης, ισχύει σε κάθε τρόπο λειτουργίας και σε κάθε εγκατεστημένη έκδοση PHP και ελέγχεται ξανά μετά τις ενημερώσεις.

Μια μικρή ρύθμιση με διπλό αποτέλεσμα

Σπάνια μια μεμονωμένη ρύθμιση της PHP έχει τραβήξει τόση προσοχή. Όταν το php.net δημοσίευσε στις 21 Οκτωβρίου 2026 τα patches για το PHP2Shell, το session.upload_progress.enabled=0 βρισκόταν στη λίστα των μεταβατικών μέτρων. Δύο ημέρες αργότερα ακολούθησε η υπόδειξη για το CVE-2026-115560 και η προτεινόμενη λύση ήταν η ίδια ρύθμιση.

Πολλοί διαχειριστές την όρισαν γρήγορα εκείνες τις ημέρες. Το αν ισχύει παντού είναι άλλο ζήτημα. Τα τυπικά κενά απαριθμούνται εύκολα: η τιμή βρίσκεται μόνο στη διαμόρφωση CLI, μια δεύτερη έκδοση PHP ξεχάστηκε ή ένας πίνακας ελέγχου φιλοξενίας αντικατέστησε το αρχείο στην επόμενη αποθήκευση. Αυτό το άρθρο δείχνει πώς θα υλοποιήσετε το μέτρο ώστε να ισχύει και σε τρεις μήνες.

Σημαντικό εκ των προτέρων: η απενεργοποίηση δεν αντικαθιστά την ενημέρωση της PHP. Σύμφωνα με τεχνικές αναφορές, το session.upload_progress.enabled=0 από μόνο του δεν κλείνει και τις δύο ευπάθειες του PHP2Shell. Τι ακριβώς αφορά το CVE-2026-115560, εξηγεί η σελίδα CVE-2026-115560: υπόδειξη για το Session Upload Progress.

Τι κάνει η λειτουργία και ποιος τη χρειάζεται

Το Session Upload Progress γράφει διαρκώς την πρόοδο στο session κατά τη διάρκεια ενός ανεβάσματος αρχείου, ώστε μια εφαρμογή να μπορεί να εμφανίσει γραμμή προόδου. Στην PHP η λειτουργία είναι από προεπιλογή ενεργοποιημένη. Το εγχειρίδιο της PHP επισημαίνει το ίδιο ότι τα ονόματα αρχείων και πεδίων που παρέχει ο αποστολέας καταλήγουν αδιαφανώς στη μνήμη του session, και συνιστά την απενεργοποίηση της λειτουργίας όταν η εφαρμογή δεν τη χρησιμοποιεί.

Το αν η εφαρμογή σας τη χρησιμοποιεί, το διαπιστώνετε με μια αναζήτηση μόνο ανάγνωσης στον κώδικα:

# Αναζητά χρήσεις της λειτουργίας προόδου στον κώδικα της εφαρμογής
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/

Αν η αναζήτηση δεν βρει τίποτα, μπορείτε να απενεργοποιήσετε τη λειτουργία χωρίς αισθητές συνέπειες. Αν υπάρχουν ευρήματα, η εφαρμογή χάνει μόνο την ένδειξη προόδου και όχι το ανέβασμα. Οι σύγχρονες φόρμες μετρούν συνήθως την πρόοδο ούτως ή άλλως στον περιηγητή.

Ορισμός του session.upload_progress.enabled στο σωστό σημείο

Η ρύθμιση έχει, σύμφωνα με το εγχειρίδιο της PHP, τον τρόπο INI_PERDIR. Αυτό σημαίνει: μπορεί να οριστεί στο php.ini, στη διαμόρφωση του διακομιστή, στο .htaccess (μόνο mod_php) και στο .user.ini (μόνο FPM και CGI), αλλά όχι κατά την εκτέλεση. Το php.net αποκλείει ρητά το .user.ini ως σημείο για το μέτρο. Ο παρακάτω πίνακας δείχνει τα λογικά σημεία ανά τρόπο λειτουργίας.

Τρόπος λειτουργίας Συνιστώμενο σημείο Κλειδώνει κατά της αντικατάστασης; Επανεκκίνηση μετά
PHP-FPM αρχείο pool με php_admin_flag ναι κάθε υπηρεσία FPM
PHP-FPM php.ini του SAPI FPM όχι, το .user.ini θα μπορούσε να αντικαταστήσει κάθε υπηρεσία FPM
Apache με mod_php VirtualHost ή διαμόρφωση διακομιστή με php_admin_flag ναι Apache πλήρως
php-cgi, LiteSpeed, FrankenPHP php.ini του εκάστοτε περιβάλλοντος εκτέλεσης ελέγξτε ανάλογα με τη δομή όλες οι διεργασίες του περιβάλλοντος
Εικόνα Docker ξεχωριστό αρχείο στο /usr/local/etc/php/conf.d/ κατά το χτίσιμο ναι, αν δεν επιτρέπεται override επαναδημιουργία του container

Οι δύο ανθεκτικές παραλλαγές μοιάζουν ως εξής:

; PHP-FPM, π.χ. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache με mod_php, στο VirtualHost ή σε επίπεδο διακομιστή
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>

Επιπλέον αξίζει η καταχώριση στο php.ini κάθε SAPI ιστού ως βασική τιμή. Τότε η ρύθμιση ισχύει και για νέα pools που θα δημιουργήσει κάποιος αργότερα. Γιατί το php_admin_flag κάνει τη διαφορά, περιγράφει το άρθρο php_admin_value: κλείδωμα ρυθμίσεων κατά της αντικατάστασης.

Έλεγχος της αποτελεσματικότητας στο πλαίσιο του web

Η γραμμή εντολών διαβάζει συχνά άλλο php.ini από τον διακομιστή ιστού. Ένα php -i αποδεικνύει γι' αυτό λίγα. Ούτε το php-fpm8.3 -i δείχνει παρά μόνο τις τιμές του php.ini, όχι τις εγγραφές από τα pools. Αξιόπιστο είναι μόνο ένα ερώτημα που εκτελείται πράγματι μέσω του pool.

Έτσι προχωράτε:

  1. Επανεκκινήστε όλες τις υπηρεσίες PHP, για παράδειγμα systemctl restart php8.3-fpm ή τον Apache με mod_php. Χωρίς επανεκκίνηση συνεχίζει να ισχύει η παλιά τιμή.
  2. Τοποθετήστε στον φάκελο webroot ένα σύντομο αρχείο ελέγχου με τυχαίο όνομα, που εμφανίζει μόνο την τρέχουσα τιμή.
  3. Καλέστε το αρχείο μία φορά μέσω του πραγματικού domain και σημειώστε το αποτέλεσμα.
  4. Διαγράψτε αμέσως το αρχείο και επαναλάβετε το βήμα για κάθε ιστότοπο και κάθε pool.
<?php
// Αρχείο ελέγχου: αφήστε το μόνο για λίγο, μετά διαγράψτε το αμέσως
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";

Αναμένεται κενή τιμή ή '0'. Αν εμφανίζεται '1', η ρύθμισή σας δεν ισχύει σε αυτό το pool. Μετά από μια ενημέρωση της PHP ελέγχετε επιπλέον αν έχουν επανεκκινηθεί όλοι οι workers, όπως περιγράφεται στο Επανεκκίνηση του PHP-FPM και όλων των workers.

Σημαντικό

Μην αφήνετε ποτέ αρχεία ελέγχου. Αποκαλύπτουν εκδόσεις και διαμόρφωση και αποτελούν αγαπημένο στόχο αυτοματοποιημένων σαρώσεων.

Ώστε η ρύθμιση να παραμείνει μόνιμα

Οι περισσότερες υποτροπές δεν προκαλούνται από επιτιθέμενους, αλλά από τη λειτουργία. Ένα νέο pool αντιγράφεται από παλιό πρότυπο, μια ενημέρωση πακέτου δημιουργεί νέο php.ini ή κάποιος αλλάζει την έκδοση PHP στον πίνακα ελέγχου φιλοξενίας. Κατά τέτοιων υποτροπών βοηθούν σταθερές συνήθειες.

  • Κάλυψη όλων των εκδόσεων: Σε πολλούς διακομιστές εκτελούνται παράλληλα περισσότερες εκδόσεις PHP. Καθεμία έχει δικούς της φακέλους διαμόρφωσης και χρειάζεται την καταχώριση.
  • Προσαρμογή προτύπων: Τα πρότυπα pool, οι ρόλοι Ansible, τα Dockerfiles και τα πρότυπα του πίνακα ελέγχου περιέχουν την τιμή, ώστε οι νέοι ιστότοποι να την κληρονομούν αυτόματα.
  • Χρήση ρυθμίσεων του πίνακα ελέγχου: Στους πίνακες ελέγχου φιλοξενίας η τιμή ανήκει στις πρόσθετες οδηγίες που προβλέπει ο πίνακας, αλλιώς η επόμενη αλλαγή αντικαθιστά τη χειροκίνητη εργασία.
  • Έλεγχος μετά τις ενημερώσεις: Ο έλεγχος της προηγούμενης ενότητας ανήκει στη λίστα ελέγχου κάθε ενημέρωσης PHP.
  • Τεκμηρίωση: Καταγράψτε ημερομηνία, διακομιστή, pools και αποτέλεσμα. Αυτό βοηθά αργότερα έναντι της διοίκησης, του ασφαλιστή ή των ελεγκτών.

Όποιος δεν χρησιμοποιεί καθόλου .user.ini μπορεί να απενεργοποιήσει εντελώς την ανάγνωση τέτοιων αρχείων με user_ini.filename = στο php.ini. Αυτό επηρεάζει όμως όλες τις ρυθμίσεις που αποθέτουν εκεί οι εφαρμογές. Δοκιμάστε γι' αυτό το βήμα εκ των προτέρων, ιδίως σε CMS που γράφουν δικά τους αρχεία .user.ini.

Τα υπόλοιπα μεταβατικά μέτρα του php.net, όπως τα όρια για το post_max_size και το όριο μνήμης μέσω cgroup, υπάρχουν συγκεντρωμένα στο Άμεσα μέτρα όταν δεν μπορείτε ακόμη να εφαρμόσετε patch. Πώς οργανώνει η PHP καταρχήν τα επίπεδα διαμόρφωσής της, εξηγεί το Το php.ini εξηγημένο.

Πώς βοηθά συγκεκριμένα η PHP SOS;

  • Καταγραφή της υπάρχουσας κατάστασης: Εντοπίζουμε όλες τις εκδόσεις PHP, τους τρόπους λειτουργίας και τα pools στους διακομιστές σας και διαβάζουμε τις αποτελεσματικές τιμές στο πλαίσιο του web.
  • Σωστός ορισμός: Καταχωρίζουμε τη ρύθμιση κλειδωμένη στα pools και στη διαμόρφωση του διακομιστή και επανεκκινούμε ελεγχόμενα όλους τους workers.
  • Δοκιμή λειτουργίας: Ελέγχουμε φόρμες ανεβάσματος και διαχείριση πολυμέσων μετά τη μετάβαση.
  • Πρόληψη υποτροπών: Προσαρμόζουμε πρότυπα, deployments και ρυθμίσεις του πίνακα ελέγχου και τεκμηριώνουμε την κατάσταση στο πλαίσιο της σκλήρυνσης διακομιστή.

Συχνές ερωτήσεις

Γιατί το session.upload_progress.enabled=0 δεν λειτουργεί μέσω ini_set();

Η ρύθμιση ανήκει, σύμφωνα με το εγχειρίδιο της PHP, στον τρόπο INI_PERDIR. Δεν μπορεί επομένως καθόλου να αλλάξει κατά την εκτέλεση με ini_set(). Το php.net αναφέρει ως σωστά σημεία το php.ini, το pool FPM ή τη διαμόρφωση του διακομιστή και αποκλείει ρητά το .user.ini.

Λειτουργούν τα ανεβάσματα αρχείων μετά την απενεργοποίηση;

Ναι. Απενεργοποιείται μόνο η αναφορά προόδου που γράφει η PHP στο session κατά τη διάρκεια ενός ανεβάσματος. Το ίδιο το ανέβασμα συνεχίζεται. Επηρεάζονται μόνο εφαρμογές που χτίζουν τη γραμμή προόδου ακριβώς με αυτή τη λειτουργία της PHP.

Μπορεί μια εφαρμογή να ενεργοποιήσει ξανά τη λειτουργία;

Μέσω ενός αρχείου .htaccess με mod_php ή ενός .user.ini με PHP-FPM αυτό είναι καταρχήν δυνατό, εφόσον η τιμή δεν είναι κλειδωμένη. Με php_admin_flag στο pool ή στη διαμόρφωση του Apache το εμποδίζετε.

Πρέπει να επαναφέρω την τιμή μετά την επόμενη ενημέρωση της PHP;

Όχι, δεν χρειάζεται. Τη λειτουργία δεν τη χρειάζονται οι περισσότερες εφαρμογές και το εγχειρίδιο της PHP συνιστά το ίδιο να την απενεργοποιείτε σε τέτοιες περιπτώσεις. Ελέγχετε μετά από κάθε ενημέρωση μόνο αν η τιμή εξακολουθεί να ισχύει.

Πηγές

Άμεση επικοινωνία

Κάθε ώρα μετράει. Γράψτε μας τώρα.

Περιγράψτε σύντομα το σύστημα, την έκδοση PHP και ό,τι παρατηρείτε. Θα επικοινωνήσουμε μαζί σας, θα διευκρινίσουμε την κατάσταση και θα εργαστούμε εξ αποστάσεως μέχρι το περιστατικό να κλείσει και να τεκμηριωθεί.

Άμεση βοήθεια