Exim MTAのCVE-2026-45185(Dead.Letter)用のシェルベースの脆弱性スキャナー。GnuTLSビルドのuse-after-freeを検出し、バージョン、TLSライブラリ、CHUNKING設定をチェックします。CI/CD統合用のJSON出力を生成します。
LinuxシステムがCVE-2026-45185(Eximメール転送エージェントのuse-after-free脆弱性で、リモートコード実行につながる可能性がある)に対して脆弱かどうかを検出するシェルスクリプト。
CI/CDパイプライン、構成管理ツール、アドホックなシステム監査での使用を想定。人間が読める形式と機械可読(JSON)形式の両方で出力を生成。
CVE-2026-45185(別名: Dead.Letter)は、EximのBDAT(バイナリデータ)メッセージボディ解析におけるuse-after-freeバグであり、GnuTLSがTLSを処理するときに引き起こされます。
TLSシャットダウン中にEximはTLS転送バッファを解放しますが、ネストされたBDAT受信ラッパーが依然として着信バイトを処理し、ungetc()を呼び出して解放された領域に単一の\nバイトを書き込む可能性があります。この1バイトの書き込みがヒープアロケータのメタデータを破壊し、攻撃者はそこからさらなるメモリプリミティブを取得し、リモートコード実行を達成できます。
| プロパティ | 詳細 |
|---|
| CVE | CVE-2026-45185 |
| 別名 | Dead.Letter |
| 種別 | Use-After-Free (CWE-416) |
| コンポーネント | Exim BDAT/CHUNKINGハンドラ(GnuTLSビルドのみ) |
| 攻撃ベクトル | ネットワーク — 認証不要、TLS接続とCHUNKING拡張のみ必要 |
| 影響を受けるバージョン | Exim 4.97 – 4.99.2、GnuTLSビルドのみ |
| 修正バージョン | Exim 4.99.3 |
| 発見者 | Federico Kirschbaum, XBOW Security Lab(2026年5月1日報告) |
OpenSSLビルドは影響を受けません。 この脆弱性は
USE_GNUTLS=yesでコンパイルされたEximに固有です。EximがOpenSSLにリンクしている場合、バージョンに関係なく脆弱ではありません。
スクリプトは決定木を通じて動作し、決定的に安全な状態が確認され次第、システムを脆弱ではないとマークして停止します。
チェック1 — Eximの存在
$PATHおよび一般的なインストール場所(/usr/sbin/exim、/usr/sbin/exim4、/usr/local/sbin/exim)を検索します。Eximが見つからない場合、システムは脆弱ではなく、スクリプトは即座に終了します。
チェック2 — Eximのバージョン
exim -bVの出力を解析し、影響を受ける範囲(4.97 – 4.99.2)と比較します。バージョン4.99.3以上はパッチ適用済みとして扱われます。既知の範囲外のバージョンは脆弱ではないとマークされます(認識されない場合は注釈が付きます)。
チェック3 — TLSライブラリ(重要なゲート) 次の3つの検出方法を順に使用します。
exim -bVビルド情報(最も信頼性が高い — Eximはコンパイル時の機能を報告します。例: Support for: GnuTLS)ldd共有ライブラリのリンクstringsバイナリスキャン(フォールバック)OpenSSLが検出された場合 → 判定はバージョンに関係なく脆弱ではないに反転します。GnuTLSが検出された場合 → 攻撃対象領域が存在することが確認されます。どちらも判別できない場合 → 結果は不明です。
チェック4 — CHUNKING/BDAT設定(回避策チェック)
この時点でシステムがまだ脆弱とマークされている場合のみ実行します。Exim設定でchunking_advertise_hostsが明示的に空の値に設定されているかどうかをチェックし、これによりBDATのアドバタイズが無効になり、攻撃ベクトルがブロックされます。単一ファイルの設定とDebianの分割設定レイアウト(/etc/exim4/conf.d/フラグメント)の両方を処理します。
注:
chunking_advertise_hostsが設定に存在しない場合(デフォルト)、EximはCHUNKINGをすべてのホスト(*)にアドバタイズします。無効にするには、オプションを明示的に空の値に設定する必要があります。
チェック5 — 情報提供: システムの緩和策 判定は変更しませんが、悪用可能性に影響を与える要因を報告します。
/proc/sys/kernel/randomize_va_space) — 2であるべきchecksec出力(PIE、RELRO、スタックカナリア) — checksecがインストールされている場合MemoryDenyWriteExecute、NoNewPrivileges、SystemCallFilter/procファイルシステム(ASLRチェック用)を備えたLinuxgrep、awk、ldd、headchecksec(オプション — バイナリ強化解析用)systemctl(オプション — systemdユニット検査用)Debian-eximグループのユーザー)コア脆弱性チェックには外部依存関係は必要ありません。
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh
| フラグ | 説明 |
|---|---|
--json | 結果をJSONオブジェクトとして出力(下記参照) |
--quiet | すべての出力を抑制。終了コードのみ設定 |
--no-color | ANSIカラーコードを無効化(ログファイルに便利) |
--help / -h | 使用方法を表示 |
| コード | 意味 |
|---|---|
0 | 脆弱ではない(または決定的に安全な状態が見つかった) |
1 | 脆弱 |
2 | 不明 — 1つ以上の必要な情報を判別できなかった。潜在的に脆弱として扱う |
3 | スクリプトエラーまたはサポートされていない環境 |
CVE-2026-45185 (Dead.Letter) — Exim脆弱性評価
============================================================
[CHECK] Eximインストールを確認中...
[WARN] Eximバイナリが見つかりました: /usr/sbin/exim4
[CHECK] Eximバージョンを確認中...
検出されたバージョン: 4.99.1
[FAIL] Exim 4.99.1 は脆弱な範囲(4.97 – 4.99.2)に含まれます。
[CHECK] TLSライブラリのリンクを確認中(GnuTLS 対 OpenSSL)...
[FAIL] EximはGnuTLSにリンクされています — このビルドは影響を受けます。
[CHECK] CHUNKING (BDAT) アドバタイズ設定を確認中...
設定ファイル: /etc/exim4/exim4.conf
[WARN] chunking_advertise_hosts が無効になっていません — BDATがアクティブです(デフォルトですべてのホストにアドバタイズ)。
ヒント: 回避策として、メイン設定に 'chunking_advertise_hosts ='(空の値)を追加してBDATを無効にしてください。
[CHECK] システムレベルのエクスプロイト緩和策を確認中(情報提供)...
[PASS] ASLR: 完全なランダム化 (randomize_va_space=2)
glibcバージョン: 2.35 (2.32+ はより強力なヒープメタデータチェックがあります)
[WARN] systemd: MemoryDenyWriteExecute が設定されていません — ユニットに追加することを推奨
[WARN] systemd: NoNewPrivileges が設定されていません
------------------------------------------------------------
判定
------------------------------------------------------------
脆弱 — CVE-2026-45185
理由: Eximバージョン4.99.1が脆弱範囲4.97–4.99.2に含まれます
推奨アクション:
1. Eximを4.99.3以降にアップグレード(主要な修正)
2. 回避策として、Exim設定に 'chunking_advertise_hosts ='(空)を設定
3. systemdユニットに MemoryDenyWriteExecute=yes と NoNewPrivileges=yes を追加
4. ASLRが2に設定されていることを確認: echo 2 > /proc/sys/kernel/randomize_va_space
------------------------------------------------------------
--json){
"cve": "CVE-2026-45185",
"alias": "Dead.Letter",
"host": "mailserver-01",
"timestamp": "2026-05-12T17:00:00Z",
"verdict": "vulnerable",
"reason": "Exim version 4.99.1 is in vulnerable range 4.97–4.99.2",
"exit_code": 1,
"findings": {
"exim_binary": "/usr/sbin/exim4",
"exim_version": "4.99.1",
"exim_version_vulnerable": "true",
"tls_library": "gnutls",
"tls_library_detected": "gnutls",
"exim_config": "/etc/exim4/exim4.conf",
"chunking_advertised": "true",
"aslr_level": "2",
"glibc_version": "2.35"
},
"mitigations": [
"aslr=full"
]
}
- name: CVE-2026-45185をチェック
run: |
chmod +x check_cve_2026_45185.sh
./check_cve_2026_45185.sh --json | tee vuln-report.json
exit $(jq '.exit_code' vuln-report.json)
- name: 脆弱性レポートをアップロード
if: always()
uses: actions/upload-artifact@v4
with:
name: cve-2026-45185-report
path: vuln-report.json
check-exim-vuln:
stage: security
script:
- chmod +x check_cve_2026_45185.sh
- ./check_cve_2026_45185.sh --json > vuln-report.json
artifacts:
when: always
paths:
- vuln-report.json
allow_failure: false
- name: CVE-2026-45185チェックを実行
script: check_cve_2026_45185.sh --json
register: vuln_check
failed_when: vuln_check.rc == 1
changed_when: false
- name: 脆弱性レポートを表示
debug:
msg: "{{ vuln_check.stdout | from_json }}"
# 判定のみ取得
./check_cve_2026_45185.sh --json | jq -r '.verdict'
# 特定の緩和策が見つかったか確認
./check_cve_2026_45185.sh --json | jq '.mitigations | contains(["aslr=full"])'
# 複数のホストで実行し結果を収集
for host in mail1 mail2 mail3; do
ssh "$host" 'bash -s' < check_cve_2026_45185.sh --json
done | jq -s '.'
# Debian / Ubuntu
apt-get update && apt-get install --only-upgrade exim4
# RHEL / CentOS / Fedora
dnf upgrade exim
# ソースから
# https://ftp.exim.org/pub/exim/exim4/ から4.99.3をダウンロード
# 既存のLocal/Makefile設定で再ビルド
アップグレード後に確認:
exim -bV | head -1
# 期待される出力: Exim version 4.99.3 ...
すぐにアップグレードできない場合、Exim設定のメイン設定セクションに次の行を追加すると、BDATアドバタイズが完全に無効になり、攻撃ベクトルをブロックします。
chunking_advertise_hosts =
空の値は「ホストなし」を意味します — EximはEHLO応答でCHUNKING拡張をアドバタイズしなくなります。この変更後、Eximを再起動してください。
# Debian / Ubuntu
systemctl restart exim4
# その他のsystemdシステム
systemctl restart exim
CHUNKINGがアドバタイズされなくなったことを確認:
# 接続してEHLO応答を確認 — CHUNKINGが表示されてはいけない
echo QUIT | openssl s_client -connect localhost:25 -starttls smtp 2>/dev/null \
| grep -i chunking
# 出力がない = CHUNKINGが無効
これは回避策であり、修正ではありません。 一部の送信メールサーバーは大容量メッセージ配信にBDATを使用します。無効にすると、それらの送信者との互換性の問題が発生する可能性があります。できるだけ早く4.99.3にアップグレードしてください。
パッチ適用済みシステムでも、Exim systemdユニットに次のディレクティブを追加することで、将来のメモリ破壊脆弱性の影響を軽減します。
# /etc/systemd/system/exim4.service.d/hardening.conf
[Service]
NoNewPrivileges=yes
MemoryDenyWriteExecute=yes
ProtectSystem=strict
PrivateTmp=yes
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallFilter=@system-service
systemctl daemon-reload && systemctl restart exim4
lddおよびstringsにフォールバックし、信頼性が低下する可能性があります。