Ευπάθεια PHP-fpm που επιτρέπει την απομακρυσμένη εκτέλεση κώδικα στον διακομιστή

Διαθέσιμος διορθωτικές εκδόσεις των PHP 7.3.11, 7.1.33 και 7.2.24, στις οποίες εξαλειφθεί κρίσιμος τρωτό (CVE-2019-11043) στην επέκταση PHP-FPM (FastCGI Process Manager), η οποία σας επιτρέπει να εκτελείτε εξ αποστάσεως τον κώδικά σας στο σύστημα. Για να επιτεθούν σε διακομιστές που χρησιμοποιούν PHP-FPM σε συνδυασμό με Nginx για την εκτέλεση σεναρίων PHP, είναι ήδη δημόσια διαθέσιμο εργασίας εκμεταλλεύομαι.

Η επίθεση είναι δυνατή σε διαμορφώσεις nginx στις οποίες η προώθηση στο PHP-FPM πραγματοποιείται με διαχωρισμό τμημάτων της διεύθυνσης URL χρησιμοποιώντας το "fastcgi_split_path_info" και ορίζοντας τη μεταβλητή περιβάλλοντος PATH_INFO, αλλά χωρίς πρώτα να ελέγξετε την ύπαρξη του αρχείου χρησιμοποιώντας το "try_files $fastcgi_script_name" οδηγία ή το "if (!-f $) document_root$fastcgi_script_name)". Το πρόβλημα είναι επίσης εκδηλώνεται στις ρυθμίσεις που προσφέρονται για την πλατφόρμα NextCloud. Για παράδειγμα, διαμορφώσεις με δομές όπως:

τοποθεσία ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

Μπορείτε να παρακολουθήσετε την επίλυση του προβλήματος στα κιτ διανομής σε αυτές τις σελίδες: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, αψίδα, Μαλακό καπέλλο. Ως λύση, μπορείτε να προσθέσετε έναν έλεγχο για την ύπαρξη του ζητούμενου αρχείου PHP μετά τη γραμμή "fastcgi_split_path_info":

try_files $fastcgi_script_name =404;

Το πρόβλημα προκαλείται από ένα σφάλμα κατά τον χειρισμό δεικτών σε ένα αρχείο sapi/fpm/fpm/fpm_main.c. Κατά την εκχώρηση ενός δείκτη, θεωρείται ότι η τιμή της μεταβλητής περιβάλλοντος PATH_INFO πρέπει να περιέχει ένα πρόθεμα που ταιριάζει με τη διαδρομή προς το σενάριο PHP.
Εάν η οδηγία fastcgi_split_path_info καθορίζει τον διαχωρισμό της διαδρομής του σεναρίου χρησιμοποιώντας μια κανονική έκφραση ευαίσθητη στη νέα γραμμή (για παράδειγμα, πολλά παραδείγματα προτείνουν τη χρήση "^(.+?\.php)(/.*)$"), τότε ένας εισβολέας θα μπορούσε να διασφαλίσει ότι κενή τιμή εγγράφεται στη μεταβλητή περιβάλλοντος PATH_INFO. Σε αυτή την περίπτωση, περαιτέρω κατά μήκος της εκτέλεσης πραγματοποιήθηκε γράφοντας path_info[0] στο μηδέν και καλώντας το FCGI_PUTENV.

Ζητώντας μια διεύθυνση URL μορφοποιημένη με συγκεκριμένο τρόπο, ένας εισβολέας μπορεί να επιτύχει μια μετατόπιση του δείκτη path_info στο πρώτο byte της δομής «_fcgi_data_seg» και η εγγραφή ενός μηδέν σε αυτό το byte θα οδηγήσει στη μετακίνηση του «char* pos». δείκτη σε μια περιοχή μνήμης που βρίσκεται προηγουμένως. Το επόμενο που ονομάζεται FCGI_PUTENV θα αντικαταστήσει τα δεδομένα σε αυτήν τη μνήμη με μια τιμή που μπορεί να ελέγξει ο εισβολέας. Η καθορισμένη μνήμη αποθηκεύει επίσης τις τιμές άλλων μεταβλητών FastCGI και γράφοντας τα δεδομένα τους, ένας εισβολέας μπορεί να δημιουργήσει μια πλασματική μεταβλητή PHP_VALUE και να επιτύχει την εκτέλεση του κώδικά του.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο