# Ασφάλεια του FrankenPHP

> Ασφάλεια FrankenPHP μετά το PHP2Shell: έλεγχος της ενσωματωμένης έκδοσης PHP, νέο build του binary ή του image, σωστή επανεκκίνηση των workers και σκλήρυνση τιμών.

Πηγή: https://phpsos.de/el/server/frankenphp/  
Ημερομηνία: 25/10/2026  
Πάροχος: PHP SOS, Επείγουσα βοήθεια PHP και ασφάλεια διακομιστών. Άμεση βοήθεια μέσω WhatsApp: https://wa.me/491736494914?text=%CE%93%CE%B5%CE%B9%CE%B1%20%CF%83%CE%B1%CF%82%2C%20PHP%20SOS%2C%20%CF%87%CF%81%CE%B5%CE%B9%CE%B1%CE%B6%CF%8C%CE%BC%CE%B1%CF%83%CF%84%CE%B5%20%CE%B2%CE%BF%CE%AE%CE%B8%CE%B5%CE%B9%CE%B1%20%CE%BC%CE%B5%20%CF%84%CE%BF%CE%BD%20%CE%B4%CE%B9%CE%B1%CE%BA%CE%BF%CE%BC%CE%B9%CF%83%CF%84%CE%AE%20PHP%20%CE%BC%CE%B1%CF%82.%20%CE%95%CF%84%CE%B1%CE%B9%CF%81%CE%B5%CE%AF%CE%B1%3A%20%E2%80%A6%20%CE%99%CF%83%CF%84%CF%8C%CF%84%CE%BF%CF%80%CE%BF%CF%82%3A%20%E2%80%A6

**Εν συντομία:** Το FrankenPHP είναι ένας διακομιστής εφαρμογών με βάση το Caddy, που ενσωματώνει την PHP στο δικό του πρόγραμμα. Για την ασφάλεια FrankenPHP μετά το PHP2Shell αυτό σημαίνει: δεν μετράνε τα πακέτα PHP της διανομής, αλλά η έκδοση PHP μέσα στο binary του FrankenPHP ή στο image του container. Χτίστε ή κατεβάστε μια έκδοση με διορθωμένη PHP και επανεκκινήστε όλους τους workers.

## Γιατί το FrankenPHP λαμβάνει patch διαφορετικά

Στις κλασικές διατάξεις η διανομή παραδίδει την PHP ως πακέτο και μια ενημέρωση αντικαθιστά τα αρχεία. Το FrankenPHP αντίθετα περιέχει την PHP ως ενσωματωμένη βιβλιοθήκη. Όποιος χρησιμοποιεί το επίσημο binary ή ένα image container που βασίζεται σε αυτό, παίρνει μαζί και την PHP. Ένα `apt upgrade` στον host δεν αλλάζει τίποτα σε αυτό.

Το PHP2Shell περιλαμβάνει τα CVE-2026-109618 και CVE-2026-109619, με CVSS v4.0 9,2 το καθένα. Το έργο PHP αναφέρει ρητά το FrankenPHP ανάμεσα στους επηρεαζόμενους τρόπους λειτουργίας. Διορθωμένες είναι οι PHP 8.5.12, 8.4.27, 8.3.36 και 8.2.35. Αποφασιστικό είναι επομένως με ποια έκδοση PHP χτίστηκε το FrankenPHP σας.

## Λειτουργία worker και PHP2Shell

Το FrankenPHP μπορεί να λειτουργεί εφαρμογές σε λειτουργία worker. Εκεί η εφαρμογή φορτώνεται μία φορά και εξυπηρετεί στη συνέχεια πολλά αιτήματα διαδοχικά στην ίδια διεργασία. Αυτό φέρνει ταχύτητα, παρατείνει όμως τη διάρκεια ζωής κάθε διεργασίας.

Το CVE-2026-109619 περιγράφει εσωτερική κατάσταση ενός αιτήματος που μπορεί να παραμείνει μετά την αποδέσμευση της μνήμης· ένα μεταγενέστερο αίτημα στον ίδιο worker μπορεί να τη χρησιμοποιήσει προτού επανέλθει. Στη λειτουργία worker η αλληλεπίδραση πολλών αιτημάτων σε μία διεργασία είναι η κανονική περίπτωση. Αυτό δεν είναι λόγος να αποφύγετε τη λειτουργία worker, είναι όμως σαφής λόγος να εφαρμόζετε ενημερώσεις και επανεκκινήσεις με ιδιαίτερη προσοχή. Τεχνικές λεπτομέρειες υπάρχουν στη σελίδα [CVE-2026-109619](https://phpsos.de/el/php2shell/cve-2026-109619/).

## Ασφάλεια FrankenPHP: έλεγχος έκδοσης

Ελέγξτε την ενσωματωμένη έκδοση PHP απευθείας στο σύστημα που εκτελείται. Οι παρακάτω εντολές μόνο διαβάζουν· τα ονόματα υπηρεσιών και containers είναι παραδείγματα.

```bash
# Εγκατεστημένο binary
frankenphp version

# Στο container που εκτελείται (το όνομα του container είναι παράδειγμα)
docker exec app frankenphp version
docker exec app php -v

# Ποιο image εκτελείται πραγματικά; (το digest δείχνει την ακριβή κατάσταση)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
```

Σημειώστε την έκδοση PHP από την έξοδο. Αν βρίσκεται πριν από τις διορθωμένες εκδόσεις, το σύστημα είναι ευάλωτο. Ελέγχετε πάντα το container που εκτελείται και όχι μόνο το τελευταίο image που χτίστηκε, επειδή ένα νέο image ισχύει μόνο μετά την αντικατάσταση των containers.

## Εφαρμογή της ενημέρωσης και επανεκκίνηση όλων των workers

Το πώς γίνεται η ενημέρωση εξαρτάται από την εγκατάστασή σας:

- **Binary στον host:** εγκατάσταση νέας έκδοσης FrankenPHP με διορθωμένη έκδοση PHP, επανεκκίνηση της υπηρεσίας.
- **Container:** λήψη βασικού image με διορθωμένη έκδοση PHP, νέο build του δικού σας image, χωρίς cache για το βασικό επίπεδο, αντικατάσταση των containers.
- **Μεταγλωττισμένο από εσάς:** νέο build με τη διορθωμένη έκδοση PHP, επαναδημιουργία όλων των επεκτάσεων με την ίδια έκδοση.

```bash
# Παράδειγμα εγκατάστασης στον host ως υπηρεσία systemd
systemctl restart frankenphp

# Παράδειγμα Docker Compose: νέο build χωρίς cache και αντικατάσταση των containers
docker compose build --pull --no-cache
docker compose up -d --force-recreate
```

Στη συνέχεια ελέγξτε ξανά την έκδοση PHP στο container που εκτελείται και την ώρα εκκίνησης των διεργασιών. Στη λειτουργία worker κάθε worker πρέπει να έχει επανεκκινηθεί. Στο Kubernetes ισχύουν πρόσθετα βήματα, που περιγράφονται στη σελίδα [Patch της PHP στο Kubernetes](https://phpsos.de/el/server/kubernetes/), για τα containers γενικά στη σελίδα [Patch της PHP σε containers Docker](https://phpsos.de/el/php2shell/docker-container-patchen/).

> **Σημαντικό:**
> Ένα tag όπως το `latest` ή μια κύρια έκδοση στο όνομα του image δεν εγγυάται ότι έχετε την πιο πρόσφατη κατάσταση. Κατεβάστε ενεργά εκ νέου το βασικό image και ελέγξτε στη συνέχεια την έκδοση PHP στο container που εκτελείται.

## Προσωρινά μέτρα και σκλήρυνση

Αν η ενημέρωση δεν μπορεί να γίνει άμεσα, το php.net συνιστά προσωρινά μέτρα που δεν προσφέρουν πλήρη προστασία. Στο FrankenPHP ορίζετε τις τιμές στο php.ini που φορτώνει το FrankenPHP ή μέσω των ρυθμίσεων PHP στη διαμόρφωση του Caddy, όχι με `ini_set()` στην εφαρμογή.

```ini
; php.ini στο container ή στον host
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
```

Με λειτουργία upload το php.net αναφέρει `post_max_size = 32M`. Στην PHP 8.5 προστίθεται το `fatal_error_backtraces=0`. Το όριο μνήμης ανήκει σε επίπεδο container, για παράδειγμα μέσω ορίου μνήμης του container, και όχι μέσω `RLIMIT_AS` ή `RLIMIT_DATA`. Μετά από κάθε αλλαγή επανεκκινήστε όλους τους workers.

Για τη μόνιμη λειτουργία αξίζει να αναφέρετε images με σταθερό digest, να τα χτίζετε εκ νέου τακτικά και αυτοματοποιημένα και να συμπεριλάβετε έναν σαρωτή images στην αλυσίδα build. Ένα patch επίσης δεν αφαιρεί κακόβουλο λογισμικό που εισήχθη νωρίτερα. Διατηρήστε τα logs από τις 20/10/2026· στα containers αυτό σημαίνει να τα διασώσετε πριν από την αντικατάσταση.

Όποιος χρησιμοποιεί το FrankenPHP ως στατικά χτισμένο binary, πρέπει να γνωρίζει ότι εκεί εκτός από την PHP είναι μόνιμα ενσωματωμένες και όλες οι επεκτάσεις. Μια ενημέρωση σημαίνει γι' αυτό πάντοτε αντικατάσταση ολόκληρου του binary. Ελέγξτε μετά την αντικατάσταση την έκδοση και τη λίστα των φορτωμένων επεκτάσεων, ώστε να είναι όλα διαθέσιμα όπως πριν, και δοκιμάστε την εφαρμογή προτού απορρίψετε την παλιά κατάσταση. Σε περιβάλλοντα container συνιστάται να επισημαίνετε κάθε image με την ημερομηνία του build. Έτσι μπορείτε ανά πάσα στιγμή να αναπαραστήσετε ποια κατάσταση εκτελέστηκε πότε και, σε περίπτωση αμφιβολίας, να επιστρέψετε στοχευμένα χωρίς να πέσετε ξανά σε ευάλωτη κατάσταση. Καταγράψτε την αντιστοίχιση image, έκδοσης PHP και χρονικού σημείου στην τεκμηρίωσή σας.

## Πώς βοηθά συγκεκριμένα το PHP SOS;

- Ελέγχουμε ποια έκδοση PHP περιέχουν πράγματι τα binaries FrankenPHP και τα containers σας που εκτελούνται.
- Μέσω της [υπηρεσίας PHP-Patch](https://phpsos.de/el/leistungen/php-patch-service/) χτίζουμε εκ νέου images, αντικαθιστούμε containers και επανεκκινούμε όλους τους workers, με απόδειξη.
- Διασώζουμε logs πριν από την αντικατάσταση και ελέγχουμε την εφαρμογή για ίχνη.
- Για τη μόνιμη λειτουργία εγκαθιστούμε αυτοματοποιημένα rebuilds και ελέγχους images στο πλαίσιο της [σκλήρυνσης διακομιστών](https://phpsos.de/el/leistungen/server-haertung/).


## Συχνές ερωτήσεις

**Βοηθά μια ενημέρωση apt ή dnf στο FrankenPHP;**  
Μόνο αν το ίδιο το FrankenPHP προέρχεται από αυτές τις πηγές πακέτων και έχει χτιστεί με την PHP που έχει patch. Συχνά η PHP περιλαμβάνεται μόνιμα στο binary του FrankenPHP ή στο image του container. Τότε πρέπει να ενημερώσετε το binary ή το image.

**Γιατί η λειτουργία worker είναι ιδιαίτερα σημαντική στο PHP2Shell;**  
Στη λειτουργία worker η εφαρμογή παραμένει στη μνήμη και εξυπηρετεί πολλά αιτήματα διαδοχικά στην ίδια διεργασία. Το CVE-2026-109619 αφορά ακριβώς εσωτερική κατάσταση που μπορεί να παραμείνει ανάμεσα σε αιτήματα στον ίδιο worker. Η επανεκκίνηση όλων των workers μετά την ενημέρωση είναι γι' αυτό υποχρεωτική.

**Πώς ελέγχω ποια έκδοση PHP περιέχει το FrankenPHP;**  
Το binary του FrankenPHP εμφανίζει κατά την κλήση έκδοσης την ενσωματωμένη έκδοση PHP. Σε container μπορείτε να εκτελέσετε την εντολή μέσω docker exec. Προσέξτε να ελέγχετε την έκδοση στο container που εκτελείται πραγματικά και όχι στο image που μόλις χτίστηκε.

**Υπάρχουν ειδικά προσωρινά μέτρα για το FrankenPHP;**  
Ισχύουν οι γενικές υποδείξεις του php.net. Ορίζετε τις τιμές στο php.ini που φορτώνει το FrankenPHP ή στη διαμόρφωση PHP του αρχείου Caddy, όχι με ini_set() στην εφαρμογή. Στη συνέχεια επανεκκινήστε όλους τους workers.

## Πηγές

- [php.net: Ανακοινώσεις ασφαλείας](https://www.php.net/)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
