Εν συντομία: Το composer audit συγκρίνει τα πακέτα του έργου PHP με γνωστές ανακοινώσεις ασφαλείας και εμφανίζει τις επηρεαζόμενες εκδόσεις. Εκτελέστε την εντολή σε κάθε build και τακτικά στην κατάσταση παραγωγής. Σημαντικό μετά το PHP2Shell: ο έλεγχος καλύπτει βιβλιοθήκες και όχι τον ίδιο τον διερμηνέα PHP.
Γιατί οι εξαρτήσεις χρειάζονται προσοχή ακριβώς τώρα
Οι σύγχρονες εφαρμογές PHP αποτελούνται κατά το μεγαλύτερο μέρος από ξένο κώδικα. Ένα κατάστημα βασισμένο στο Symfony ή ένα portal με Laravel φέρνει εύκολα αρκετές δεκάδες έως εκατοντάδες πακέτα, πολλά από αυτά έμμεσα μέσω άλλων πακέτων. Κάθε μία από αυτές τις βιβλιοθήκες μπορεί να περιέχει μια ευπάθεια. Το OWASP Top 10 καταγράφει γι' αυτό τα παλαιά και ευάλωτα εξαρτήματα ως ξεχωριστή κατηγορία κινδύνου.
Τον Οκτώβριο του 2026 το PHP2Shell έδειξε πόσο γρήγορα εξαπλώνεται μια κρίσιμη ευπάθεια. Οι δύο ευπάθειες CVE-2026-109618 και CVE-2026-109619 αφορούν μεν την ίδια την PHP και όχι πακέτα Composer. Πολλές ομάδες όμως έλεγξαν αυτές τις ημέρες ολόκληρη την αλυσίδα τους και διαπίστωσαν ότι δεν γνωρίζουν καν με ακρίβεια την κατάσταση των εξαρτήσεών τους.
Αυτό το κενό στην επισκόπηση κλείνει με ελάχιστη προσπάθεια. Το Composer περιλαμβάνει ήδη το κατάλληλο εργαλείο στις τρέχουσες εκδόσεις του.
Τι ελέγχει το composer audit και τι όχι
Η εντολή διαβάζει τα εγκατεστημένα πακέτα ή το αρχείο lock και ρωτά για γνωστές ανακοινώσεις ασφαλείας σχετικά με αυτά τα πακέτα. Για κάθε εύρημα εμφανίζει το πακέτο, το επηρεαζόμενο εύρος εκδόσεων, τη σοβαρότητα, τον αναγνωριστικό αριθμό της ανακοίνωσης και έναν σύνδεσμο προς την περιγραφή.
| Επίπεδο | Ελέγχεται από το composer audit; | Πώς να ελέγξετε αντί γι' αυτό |
|---|---|---|
| Πακέτα Composer στο έργο | ναι | composer audit |
| Διερμηνέας PHP (π.χ. PHP2Shell) | όχι | Επίπεδο πακέτων, επιβεβαίωση παρόχου |
| Επεκτάσεις PHP από το σύστημα | όχι | Διαχείριση πακέτων της διανομής |
| Πακέτα JavaScript στο frontend | όχι | Εργαλείο του αντίστοιχου διαχειριστή πακέτων |
| Δικός σας κώδικας εφαρμογής | όχι | Code review, έλεγχος ασφάλειας |
Η εντολή λαμβάνει υπόψη και έμμεσες εξαρτήσεις, δηλαδή πακέτα που δεν ζητήσατε ποτέ οι ίδιοι, αλλά έρχονται μαζί μέσω άλλων πακέτων. Ακριβώς εκεί οι ευπάθειες παραμένουν συχνά απαρατήρητες, επειδή κανείς στην ομάδα δεν γνωρίζει αυτά τα πακέτα. Νεότερες εκδόσεις του Composer επισημαίνουν επιπλέον πακέτα που οι δημιουργοί τους έχουν χαρακτηρίσει ως εγκαταλελειμμένα. Τέτοια πακέτα κατά κανόνα δεν λαμβάνουν πλέον διορθώσεις και πρέπει να αντικατασταθούν.
Ένα καθαρό αποτέλεσμα σημαίνει λοιπόν μόνο ότι για τις εγκατεστημένες εκδόσεις πακέτων δεν υπάρχει γνωστή ανακοίνωση. Άγνωστες ευπάθειες και σφάλματα στον δικό σας κώδικα το εργαλείο δεν τα βρίσκει. Πώς ελέγχετε την ίδια την κατάσταση της PHP, περιγράφει το άρθρο Σωστός έλεγχος έκδοσης PHP και επιπέδου patch.
Εκτέλεση του composer audit και ανάγνωση των αποτελεσμάτων
Στον κατάλογο του έργου αρκεί μία εντολή. Οι παραλλαγές διαφέρουν ως προς το τι ελέγχεται και πώς εμφανίζεται το αποτέλεσμα.
# Έλεγχος εγκατεστημένων πακέτων
composer audit
# Έλεγχος μόνο του αρχείου lock, π.χ. σε build χωρίς εγκατεστημένα πακέτα
composer audit --locked
# Παράλειψη εξαρτήσεων ανάπτυξης (κατάσταση όπως στον διακομιστή)
composer audit --no-dev
# Έξοδος αναγνώσιμη από μηχανή για ανάλυση ή σύστημα εισιτηρίων
composer audit --format=json > audit-$(date +%F).json
Αν η εντολή βρει ευπάθειες, τερματίζει με κωδικό σφάλματος. Αυτό είναι επιθυμητό, επειδή έτσι διακόπτεται ένα αυτοματοποιημένο build. Αξιολογήστε κάθε εύρημα: χρησιμοποιείται το πακέτο στον διακομιστή, χρησιμοποιείται η επηρεαζόμενη λειτουργία, υπάρχει διορθωμένη έκδοση;
# Ποιες άμεσες εξαρτήσεις είναι παρωχημένες;
composer outdated --direct
# Γιατί είναι εγκατεστημένο ένα συγκεκριμένο πακέτο;
composer why vendor/paket
# Στοχευμένη ενημέρωση, μαζί με τις εξαρτήσεις
composer update vendor/paket --with-dependencies
Δοκιμάστε κάθε ενημέρωση σε περιβάλλον staging. Οι ενημερώσεις ασφαλείας εντός της ίδιας κύριας έκδοσης είναι συνήθως ακίνδυνες, ενώ μια νέα κύρια έκδοση μπορεί να απαιτήσει προσαρμογές στον κώδικα.
Αυτοματοποίηση του ελέγχου
Μια εφάπαξ εκτέλεση βοηθά λίγο, επειδή νέες ευπάθειες γίνονται διαρκώς γνωστές. Ενσωματώστε γι' αυτό το composer audit σε δύο σημεία: στο build pipeline σε κάθε αλλαγή και σε έναν τακτικό έλεγχο της κατάστασης παραγωγής, ακόμη και όταν δεν αλλάζει τίποτα στον κώδικα.
Ένα απλό script για καθημερινή εκτέλεση στον διακομιστή build ή ελέγχου μπορεί να μοιάζει έτσι:
#!/bin/sh
# Καθημερινός έλεγχος της παραδιδόμενης κατάστασης (προσαρμόστε τη διαδρομή)
cd /srv/build/meine-anwendung || exit 1
if ! composer audit --locked --no-dev --format=plain > /var/log/composer-audit.log 2>&1; then
logger -t composer-audit "Lücken in meine-anwendung gefunden, siehe /var/log/composer-audit.log"
fi
Προωθήστε το μήνυμα από το log συστήματος στην παρακολούθησή σας, στο εσωτερικό γραμματοκιβώτιό σας ή στο σύστημα εισιτηρίων. Σημαντικό είναι να υπάρχει κάποιος υπεύθυνος για την αξιολόγηση των μηνυμάτων. Ένας έλεγχος του οποίου τις προειδοποιήσεις δεν διαβάζει κανείς, δεν προστατεύει.
Ορίστε στο composer.json, στο config.platform.php, την έκδοση PHP που εκτελείται στον διακομιστή. Τότε το Composer επιλύει μόνο πακέτα που ταιριάζουν με αυτή την κατάσταση και το composer check-platform-reqs εμφανίζει αποκλίσεις.
Καθαρή παράδοση: deployment χωρίς παρενέργειες
Και ο δρόμος προς τον διακομιστή επηρεάζει την ασφάλεια. Ορισμένοι βασικοί κανόνες έχουν αποδειχθεί αποτελεσματικοί:
- Συμπεριλάβετε το
composer.lockστο αποθετήριο και εκτελείτε στον διακομιστή μόνοcomposer install, ποτέcomposer update. - Εγκαταστήστε με
--no-dev, ώστε εργαλεία δοκιμών και αποσφαλμάτωσης να μην καταλήγουν στον διακομιστή παραγωγής. - Κρατήστε τον φάκελο
vendor/έξω από τον ριζικό κατάλογο του ιστού, ώστε να μην είναι άμεσα προσβάσιμος μέσω URL. - Εκτελείτε το
composer validateστο build, για να εντοπίζετε νωρίς εσφαλμένα ή αντιφατικά στοιχεία.
composer validate --strict
composer install --no-dev --prefer-dist --classmap-authoritative --no-interaction
Προσέξτε επιπλέον την υποστήριξη της ίδιας της έκδοσης PHP. Οι βιβλιοθήκες απαιτούν όλο και περισσότερο τρέχοντες κλάδους PHP. Όποιος παραμένει ακόμη σε PHP 8.1 ή παλαιότερη, δεν λαμβάνει πλέον επίσημες ενημερώσεις για την ίδια την PHP και συχνά δεν μπορεί πια να εγκαταστήσει νεότερες εκδόσεις πακέτων με διορθώσεις ασφαλείας. Τον σχεδιασμό γι' αυτό περιγράφει ο οδηγός PHP End-of-Life: κίνδυνοι των παρωχημένων εκδόσεων. Υποδείξεις ειδικά για framework θα βρείτε στη σελίδα Ασφάλεια εφαρμογών Laravel.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Καταγράφουμε την κατάσταση όλων των εξαρτήσεων και αξιολογούμε τα ευρήματα με βάση την πραγματική χρήση.
- Στήνουμε αυτοματοποιημένους ελέγχους στο build και στη λειτουργία, με σαφή αρμοδιότητα για τα ευρήματα.
- Σχεδιάζουμε και δοκιμάζουμε ενημερώσεις, ακόμη και όταν νέες κύριες εκδόσεις απαιτούν προσαρμογές.
- Ελέγχουμε, κατόπιν αιτήματος, και τον δικό σας κώδικα και τη διαμόρφωση, εκεί όπου κανένα αυτόματο εργαλείο δεν κοιτάζει.
Έναν έλεγχο από τρίτους περιγράφει η υπηρεσία Έλεγχος ασφάλειας και penetration test.
Συχνές ερωτήσεις
Βρίσκει το composer audit και το PHP2Shell;
Όχι. Το composer audit ελέγχει τα πακέτα στο έργο σας και όχι τον διερμηνέα PHP στον διακομιστή. Το PHP2Shell βρίσκεται στην ίδια την PHP και διορθώνεται μόνο με ενημέρωση της PHP και επανεκκίνηση όλων των διεργασιών PHP.
Πρέπει το composer.lock να βρίσκεται στο αποθετήριο;
Στις εφαρμογές ναι. Το αρχείο lock καταγράφει ακριβώς ποιες εκδόσεις είναι εγκατεστημένες. Μόνο έτσι το composer audit ελέγχει την κατάσταση που εκτελείται πράγματι στον διακομιστή και κάθε deployment εγκαθιστά τις ίδιες εκδόσεις.
Τι κάνω αν για ένα επηρεαζόμενο πακέτο δεν υπάρχει ενημέρωση;
Ελέγξτε αν το έργο σας χρησιμοποιεί καν την επηρεαζόμενη λειτουργία και τεκμηριώστε την αξιολόγηση. Αν δεν υπάρχει διόρθωση, έρχονται σε αναζήτηση ένα πακέτο αντικατάστασης, ένα δικό σας patch ή μια προσωρινή προστασία σε επίπεδο διακομιστή.
Πόσο συχνά πρέπει να εκτελώ το composer audit;
Σε κάθε build και επιπλέον τακτικά, π.χ. καθημερινά, ακόμη και χωρίς αλλαγή κώδικα. Νέες ευπάθειες αναφέρονται διαρκώς και μια κατάσταση που ήταν χθες καθαρή μπορεί σήμερα να επηρεάζεται.