testing session.upload_progress.enabled = Off

Guide d'Atténuation d'Urgence : Désactivation de session.upload_progress et Rétroportage des Correctifs EOL

php2shell.run Research Lab •

Guide d'Atténuation d'Urgence : Désactivation de session.upload_progress et Rétroportage des Correctifs EOL

<time datetime="2026-10-23">Vérifié le: 23 octobre 2026</time> · Niveau d'urgence opérationnelle: Priorité Absolue (P0)

La confirmation de campagnes d'exploitation active des vulnérabilités critiques PHP2Shell (CVE-2026-109618 et CVE-2026-109619) exige une action défensive immédiate de la part des administrateurs d'infrastructure et des équipes d'exploitation.

Ce guide opérationnel présente les méthodes exactes permettant d'éradiquer la surface d'attaque sans aucun temps d'arrêt (Zero-Downtime) sur les serveurs de production Linux, ainsi que le protocole de compilation manuelle de correctifs pour les parcs applicatifs maintenus sur des versions de PHP ayant dépassé leur cycle de vie officiel (End-of-Life: PHP 8.1, 8.0 et 7.4).


1. Matrice de Priorisation des Actions de Réponse à Incident

Niveau de PrioritéPérimètre ConcernéAction RecommandéeTemps de RéalisationImpact Opérationnel
P0 (Immédiat)Tous les serveurs PHPDésactiver session.upload_progress.enabledMoins de 5 minutesAucun (Graceful Reload)
P1 (Périmètre)Proxies Nginx / HAProxy / WAFRejeter les requêtes multipart anomales15 minutesAucun
P2 (Définitif)PHP sous support (8.2 à 8.5)Mettre à niveau vers les versions officielles30 à 60 minutesMaintenance programmée
P3 (Systèmes EOL)Branches PHP 8.1 et antérieuresCompiler et appliquer les correctifs C2 à 4 heuresValidation de non-régression

2. Procédure d'Atténuation Immédiate sans Interruption de Service

Le mécanisme déclencheur de la double libération de mémoire et du Use-After-Free réside exclusivement dans la fonctionnalité de suivi de téléversement (session.upload_progress). En désactivant cette directive au sein du fichier de configuration du moteur, le chemin de code vulnérable en C est rendu totalement inatteignable.

Étape 2.1 : Détection des fichiers php.ini actifs

Chaque interface SAPI (PHP-FPM, interface en ligne de commande CLI, Apache) possède son propre fichier de configuration :

# Identifier le fichier de configuration utilisé par le CLI
php --ini | grep "Loaded Configuration File"

# Localiser tous les fichiers php.ini présents sur le serveur
find /etc/ -name "php.ini" 2>/dev/null

Sur les distributions Debian et Ubuntu, les chemins courants sont /etc/php/8.x/fpm/php.ini et /etc/php/8.x/cli/php.ini. Sur CentOS, RHEL, Rocky Linux ou les serveurs cPanel/CloudLinux, les fichiers se situent dans /etc/php.ini ou /opt/cpanel/ea-phpXX/root/etc/php.ini.

Étape 2.2 : Application de la directive de sécurisation

Éditez le fichier correspondant en vous assurant que la directive n'est pas précédée d'un point-virgule de commentaire :

; Durcissement d'urgence contre CVE-2026-109618 et CVE-2026-109619
[Session]
session.upload_progress.enabled = Off
session.upload_progress.cleanup = On

Pour les déploiements automatisés à grande échelle, déposez un fichier d'extension prioritaire (drop-in) :

echo -e "; Correctif PHP2Shell\nsession.upload_progress.enabled = Off" | sudo tee /etc/php/8.3/mods-available/php2shell.ini
sudo phpenmod php2shell

Étape 2.3 : Rechargement gracieux du service

Ne lancez jamais la commande restart, sous peine d'interrompre brutalement les requêtes HTTP et transactions en cours de traitement. Utilisez l'instruction reload :

# Pour Debian et Ubuntu
sudo systemctl reload php8.3-fpm

# Pour RHEL, Rocky Linux et AlmaLinux
sudo systemctl reload php-fpm

# Contrôle syntaxique du fichier de configuration
sudo php-fpm8.3 -t

3. Filtrage en Périmètre Réseau avec Nginx

Si votre architecture comprend un proxy inverse Nginx en amont de vos fermes de serveurs PHP, vous pouvez bloquer les charges malveillantes avant même qu'elles ne parviennent aux sockets FastCGI.

Les exploits ciblant PHP2Shell injectent obligatoirement le paramètre PHP_SESSION_UPLOAD_PROGRESS au sein d'une charge utile multipart/form-data.

Configuration Nginx (/etc/nginx/conf.d/php2shell_shield.conf) :

# Détection des méthodes POST multipart
map $http_content_type $is_multipart_request {
    default 0;
    ~*multipart/form-data 1;
}

server {
    listen 443 ssl http2;
    server_name monsite.fr;

    # Allocation de buffer pour l'inspection des en-têtes de corps
    client_body_buffer_size 128k;

    location / {
        # Intégration de règles ModSecurity ou Coraza WAF
        # SecRule REQUEST_HEADERS:Content-Type "@rx (?i)multipart/form-data" \
        #     "id:10261091,phase:2,chain,deny,status:403,log,msg:'Blocage PHP2Shell sur Nginx'"
        # SecRule REQUEST_BODY "@rx (?i)PHP_SESSION_UPLOAD_PROGRESS"

        proxy_pass http://backend_pool;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Rechargez Nginx sans aucune interruption de trafic :

sudo nginx -t && sudo systemctl reload nginx

4. Rétroportage et Compilation pour les Versions PHP 8.1 EOL

Les systèmes fonctionnant sous des versions de PHP dont le support officiel s'est achevé (notamment PHP 8.1, PHP 8.0 ou PHP 7.4) ne recevront aucune mise à jour automatique via les gestionnaires de paquets standards. Pour les organisations qui ne peuvent migrer immédiatement vers PHP 8.2 ou 8.3, la compilation d'un correctif sur le code source en langage C est indispensable.

Le Correctif C pour ext/session/session.c :

Ce patch garantit que le pointeur résiduel cached_post_bytes est proprement désalloué et réinitialisé à NULL lors de la réinitialisation de la session, éliminant ainsi toute condition de Use-After-Free :

--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -1480,6 +1480,12 @@ PHP_SESSION_API void php_session_cleanup(void)
 	if (PS(cached_post_bytes)) {
 		efree(PS(cached_post_bytes));
 		PS(cached_post_bytes) = NULL;
+	}
+
+	/* CVE-2026-109619: Elimination des pointeurs pendants dans l'etat global */
+	if (PS(upload_progress_key)) {
+		zend_string_release(PS(upload_progress_key));
+		PS(upload_progress_key) = NULL;
 	}
 }

Instructions de Compilation et d'Installation :

# 1. Installer les dépendances de compilation du système
sudo apt-get update && sudo apt-get build-dep -y php8.1

# 2. Récupérer l'arborescence source de la branche EOL
git clone --depth 1 --branch PHP-8.1.31 https://github.com/php/php-src.git
cd php-src

# 3. Appliquer le correctif
patch -p1 < /chemin/vers/correctif-php2shell.patch

# 4. Configurer l'environnement de production sécurisé
./buildconf --force
./configure --prefix=/opt/php8.1-hardened \
            --enable-fpm \
            --with-fpm-user=www-data \
            --with-fpm-group=www-data \
            --with-openssl \
            --with-zlib \
            --with-curl \
            --enable-mbstring

# 5. Compiler et exécuter la suite de tests
make -j$(nproc)
make test
sudo make install

5. Gestion des Conteneurs Docker et des Pods Kubernetes

Dans les infrastructures conteneurisées où les pods sont créés et détruits dynamiquement, une modification manuelle dans un conteneur en cours d'exécution est volatile et sera écrasée lors du prochain redémarrage.

Dockerfile Sécurisé :

FROM php:8.3-fpm-alpine

# Injection permanente de la directive d'atténuation
RUN echo "session.upload_progress.enabled = Off" > /usr/local/etc/php/conf.d/security-php2shell.ini

USER www-data
CMD ["php-fpm"]

Dans les déploiements Kubernetes, créez une ressource ConfigMap contenant le fichier security-php2shell.ini et montez-la en volume sur /usr/local/etc/php/conf.d/ afin de garantir que chaque nouveau réplica soit immunisé dès son initialisation.


6. Script d'Audit et de Conformité Automatisé

Intégrez ce script dans vos outils de supervision (Nagios, Zabbix, Datadog) ou vos pipelines Ansible pour auditer en continu l'immunité de vos serveurs :

#!/usr/bin/env bash
set -euo pipefail

echo "=== AUDIT DE CONFORMITÉ SÉCURITÉ PHP2SHELL ==="
echo "Hôte : $(hostname -f)"
echo "Date d'analyse : $(date -u)"

PHP_BIN=$(command -v php || true)
if [ -z "$PHP_BIN" ]; then
    echo "Aucun interpréteur PHP détecté sur cette machine."
    exit 0
fi

VERSION=$(php -r "echo PHP_VERSION;")
echo "Version PHP détectée : ${VERSION}"

STATUS=$(php -r "echo ini_get('session.upload_progress.enabled') ? 'VULNÉRABLE' : 'SÉCURISÉ';")
echo "Statut de session.upload_progress : ${STATUS}"

if [ "$STATUS" == "SÉCURISÉ" ]; then
    echo "RÉSULTAT : [VALIDE] Le serveur est protégé contre l'exploitation RCE."
    exit 0
else
    echo "RÉSULTAT : [ALERTE CRITIQUE] Le serveur est VULNÉRABLE. Désactivez session.upload_progress sans attendre."
    exit 1
fi

7. Rôle d'Automatisation Ansible pour Déploiement en Grappe

Pour déployer la désactivation en masse sur l'ensemble de votre parc de serveurs :

- name: Neutraliser la directive session.upload_progress
  ansible.builtin.lineinfile:
    path: "{{ item }}"
    regexp: '^;?\s*session\.upload_progress\.enabled\s*='
    line: 'session.upload_progress.enabled = Off'
    state: present
  loop:
    - /etc/php/8.3/fpm/php.ini
    - /etc/php/8.2/fpm/php.ini
    - /etc/php/8.1/fpm/php.ini
  notify: Recharger PHP-FPM

Ce rôle assure la remédiation en quelques secondes sur des centaines d'hôtes simultanément sans interruption de service.