Rapport de correction
Vérification de la correction de PHP2Shell
Score de santé
BonÀ améliorerÀ risque
Avant 48
Avant 31
Avant 58
Avant 38
Avant 92
Les scores résument les contrôles de ce rapport, pondérés à 40 % sécurité, 25 % sauvegardes, 20 % mises à jour et 15 % performance. Ils décrivent le risque au moment constaté et ne constituent pas une certification.
1Synthèse
Le serveur web de production exécutait PHP 8.3.35, version affectée par les deux vulnérabilités PHP2Shell. Pendant le créneau de maintenance convenu, nous avons mis à jour PHP vers 8.3.36, redémarré tous les processus PHP-FPM et confirmé que l’application est désormais servie par l’environnement corrigé. Tous les contrôles fonctionnels convenus ont réussi et aucune nouvelle erreur n’a été enregistrée.
L’examen a également relevé un pool PHP 7.4 en fin de vie hors du périmètre convenu, un redémarrage du noyau en attente et des lacunes dans la couverture des sauvegardes. Ces points n’affectent pas la correction de PHP2Shell, mais doivent être traités. Chacun figure avec sa priorité dans les recommandations.
- Statut PHP2Shell
- Corrigé
- Contrôles fonctionnels
- 8 sur 8 réussis
- Interruption de service
- Aucune constatée
- Actions de suivi
- 6, dont 2 de priorité haute
2Périmètre et méthode
Dans le périmètre
- Un serveur de production,
web-01 - Pool PHP-FPM
wwwqui exécute l’application de la boutique - PHP CLI utilisé par les tâches planifiées
- Contrôles convenus pour la connexion, la recherche, le passage de commande, les formulaires, les téléversements et les tâches planifiées
Hors périmètre
- Pool PHP 7.4
legacy(signalé, non modifié) - Fonctionnement interne du serveur de base de données et code applicatif
- Recherche de logiciels malveillants ou investigation de compromission
- Environnements de préproduction et de développement
Méthode
Inventaire en lecture seule via SSH avec une clé à durée limitée ; provenance des paquets vérifiée par rapport au dépôt du fournisseur et à l’avis de sécurité PHP ; instantané vérifié au démarrage avant tout changement ; mise à jour appliquée via le gestionnaire de paquets du système ; redémarrage des processus ; contrôles fonctionnels avec les comptes de test du client. L’accès temporaire a été supprimé à 22:31.
3Inventaire du serveur
Relevé au début du créneau d’intervention, avant tout changement.
| Nom d’hôte | web-01.example-retail.test |
|---|---|
| Rôle | Serveur web et applicatif de production |
| Hébergement | Serveur privé virtuel, 4 vCPU, 8 Go de mémoire |
| Système d’exploitation | Ubuntu 24.04.3 LTS |
| Noyau actif | 6.8.0-85-generic Noyau plus récent installé, redémarrage en attente |
| Durée de fonctionnement | 142 jours |
| Disque | Volume système de 80 Go, utilisé à 61 % |
| Serveur web | nginx 1.24.0 |
| Pools PHP-FPM | www (PHP 8.3), legacy (PHP 7.4) |
| Base de données | MySQL 8.0.43 sur un serveur géré distinct |
| Source des paquets PHP | ppa:ondrej/php |
| Mises à jour de sécurité automatiques | Désactivées |
| Synchronisation de l’heure | Active |
| Supervision | Contrôle de disponibilité uniquement ; aucune alerte sur les ressources ni sur les erreurs applicatives |
4Environnements d’exécution PHP
Tous les binaires et pools PHP du serveur ont été identifiés, y compris ceux situés hors du périmètre convenu.
| Moteur PHP | Usage | Avant | Après | Statut |
|---|---|---|---|---|
php8.3-fpm / www | Application de la boutique | 8.3.35 | 8.3.36 | Corrigé |
php8.3-cli | Tâches planifiées | 8.3.35 | 8.3.36 | Corrigé |
php7.4-fpm / legacy | Boutique archivée sous /old-shop | 7.4.33 | 7.4.33 | Action requise |
PHP 7.4 est en fin de vie depuis novembre 2022 et ne reçoit plus de correctifs de sécurité en amont. L’exposition du pool legacy n’a pas pu être exclue sur la seule base de la version ; voir la recommandation R1.
Observations sur la configuration
expose_phpest désactivé etdisplay_errorsest désactivé en production.- OPcache est activé avec 128 Mo de mémoire, ce qui suffit pour l’application.
session.upload_progress.enabledest activé mais n’est pas utilisé par l’application.- Chaque pool s’exécute sous son propre utilisateur système, avec un socket distinct.
5État des vulnérabilités
| Avis de sécurité | Environnement concerné | Avant | Après | Preuve |
|---|---|---|---|---|
CVE-2026-109618 | php8.3 | Vulnérable | Corrigé | Journal des modifications du paquet et version en cours d’exécution |
CVE-2026-109619 | php8.3 | Vulnérable | Corrigé | Journal des modifications du paquet et version en cours d’exécution |
CVE-2026-109618, CVE-2026-109619 | php7.4 | Non évalué | Non évalué | Hors du périmètre convenu |
Un correctif rétroporté par le fournisseur peut porter un autre numéro de version. Le rapport réel s’appuie sur l’avis du fournisseur concerné. Une vérification concluante du correctif ne prouve pas qu’un environnement n’a jamais été compromis.
6Sauvegardes et restauration
Les sauvegardes ont été examinées avant tout changement. La mise à jour ne pouvait commencer qu’une fois un instantané vérifié disponible.
| Sauvegarde | Fréquence | Dernière réussite | Conservation | Emplacement | Test de restauration |
|---|---|---|---|---|---|
| Export de la base de données | Quotidienne, 03:15 | 2026-10-22 03:16 | 14 jours | Hors site, chiffrée | Jamais |
| Fichiers de l’application | Quotidienne, 03:40 | 2026-10-22 03:52 | 14 jours | Même fournisseur, volume distinct | Jamais |
| Instantané du serveur avant changement | Réalisé pour cette intervention | 2026-10-22 21:04 | 7 jours | Hébergeur | Démarrage vérifié |
Constats
- La sauvegarde des fichiers exclut
/var/www/shop/uploads, où sont stockés environ 6,2 Go de documents clients. - Aucun test de restauration n’a été consigné pour les deux sauvegardes planifiées. Une sauvegarde qui n’a jamais été restaurée ne permet pas de garantir une reprise.
- Les exports de base de données sont chiffrés et stockés chez un autre fournisseur, ce qui les protège en cas de perte du serveur ou du compte d’hébergement.
Plan de retour arrière pour ce changement
Réinstaller les paquets PHP précédents depuis le cache local des paquets et recharger PHP-FPM, ou démarrer sur l’instantané pris avant le changement. Durée de rétablissement estimée : 15 minutes. Le retour arrière n’a pas été nécessaire.
7Journal des changements
| Heure | Action | Résultat |
|---|---|---|
21:00 | Accès ouvert ; état de référence des versions, des services et des temps de réponse consigné | Terminé |
21:04 | Instantané du serveur créé avant changement, démarrage vérifié | Terminé |
21:12 | Contrôles fonctionnels de référence exécutés | 8 sur 8 réussis |
21:18 | Paquets PHP 8.3 mis à jour de 8.3.35 vers 8.3.36 | Terminé |
21:20 | PHP-FPM redémarré ; plus aucun processus de l’ancienne version | Terminé |
21:24 | Version en cours d’exécution confirmée via le serveur web et la CLI | Terminé |
21:31 | Contrôles fonctionnels après changement exécutés | 8 sur 8 réussis |
21:55 | Journaux d’erreurs et temps de réponse surveillés pendant 20 minutes | Aucune nouvelle erreur |
22:31 | Clé d’accès temporaire supprimée et session fermée | Terminé |
8Vérification après changement
| Contrôle | Méthode | Résultat |
|---|---|---|
| Version PHP servie aux requêtes web | Script de diagnostic temporaire, supprimé après usage | 8.3.36 |
| Processus PHP-FPM | Liste des processus et état du service | Réussi |
| Connexion client | Compte de test du client | Réussi |
| Connexion administrateur | Compte de test du client | Réussi |
| Recherche de produits | Trois termes de recherche convenus avec le client | Réussi |
| Passage de commande | Commande de test en mode test du prestataire de paiement | Réussi |
| Formulaire de contact | Envoi de test, réception confirmée par le client | Réussi |
| Téléversement de fichier | Document de test téléversé puis téléchargé | Réussi |
| E-mail de réinitialisation du mot de passe | Compte de test, e-mail reçu | Réussi |
| Tâches planifiées | Exécution planifiée suivante vérifiée dans les journaux | Réussi |
| Journal des erreurs | Comparaison des 30 minutes avant et après le changement | Aucune nouvelle erreur |
| Temps de réponse de la page d’accueil | Médiane de 20 requêtes | 182 ms → 176 ms |
9Constats et recommandations
Classés par priorité. Aucun de ces points ne bloque la correction de PHP2Shell.
| ID | Priorité | Constat | Recommandation |
|---|---|---|---|
R1 | Haute | Le pool PHP 7.4 est en fin de vie et peut être exposé. | Retirer la boutique archivée ou en restreindre l’accès aux utilisateurs authentifiés. Si elle doit rester en ligne, la migrer vers une version de PHP prise en charge. Devis séparé. |
R2 | Haute | Un noyau plus récent est installé mais n’est pas actif ; le serveur n’a pas été redémarré depuis 142 jours. | Planifier un redémarrage lors du prochain créneau de maintenance, puis vérifier le noyau actif. |
R3 | Moyenne | 23 mises à jour du système d’exploitation sont en attente, dont OpenSSL et nginx. | Les appliquer lors d’un créneau planifié et activer les mises à jour de sécurité automatiques. |
R4 | Moyenne | Les sauvegardes n’ont jamais fait l’objet d’un test de restauration, et la sauvegarde des fichiers exclut les téléversements des clients. | Ajouter le répertoire des téléversements à la sauvegarde des fichiers et effectuer chaque trimestre un test de restauration documenté. |
R5 | Basse | Le suivi de progression des téléversements est activé mais inutilisé. | Désactiver session.upload_progress.enabled pour réduire la surface d’attaque. |
R6 | Basse | La supervision ne couvre que la disponibilité. | Ajouter des alertes sur l’espace disque, la saturation de PHP-FPM et les erreurs applicatives. |
10Preuves et remise
- Identifiants des environnements et créneau d’intervention convenu
- Source du paquet, version complète et avis du fournisseur applicable
- Référence de sauvegarde, journal des changements et preuves du redémarrage des processus
- Contrôles fonctionnels convenus, résultats et limites
- Transcription complète des commandes et extraits du journal des modifications des paquets
11Limites
Le rapport couvre l’environnement et les contrôles convenus à la date et à l’heure consignées. Il ne constitue ni une certification de sécurité, ni une garantie contre les vulnérabilités futures, ni un constat d’absence de compromission antérieure. Toute suspicion de compromission nécessite une investigation distincte.