Shift_JISメールを「蛍」から書き始めるとamavisdにBANNEDされる場合がある

amavisd-newを使ったメールサーバーで、正常なメールが
Blocked BANNED (text/plain,.exe,.exe-ms)
として遮断される現象に遭遇した。
原因を調べたところ、Shift_JISで「蛍」という文字から本文を書き始めたことが引き金になっていた。
原因
amavisdは、メールのMIME Content-Typeや添付ファイル名だけでなく、各MIMEパートの中身についてもLinuxの `file` コマンドを使って種類を判定する。
これは、例えば実行ファイルを
Content-Type: text/plain
などと偽装して送る攻撃を見抜くための仕組みである。
ところが「蛍」をShift_JISで表現すると、先頭は
8C 75
というバイト列になる。
このため、Shift_JISの
蛍……
で始まるテキストが、環境によっては
DOS executable (COM)
と誤認される。
amavisdはこの判定を内部的に `.exe-ms` として扱うため、/etc/amavisd/amavisd.confにある
$banned_filename_re = new_RE(
qr’^\.(exe-ms|dll)$’,
…
);
に一致してしまい、正常な `text/plain` メールがBANNEDになる。
つまり流れは、
Shift_JIS本文が「蛍」で始まる
↓
先頭バイトが 8C 75 …
↓
fileコマンドがDOS実行ファイルと誤認
↓
amavisdが .exe-ms と判定
↓
qr’^\.(exe-ms|dll)$’ に一致
↓
BANNED
となる。
「蛍」で始まるメール本文がbanされる環境
`qr’^\.(exe-ms|dll)$’` が「蛍」という文字を直接検査しているわけではない。
また、すべての環境で必ず発生するわけでもない。
少なくとも、
* 本文がShift_JISで送信される
* `file` コマンドがそのバイト列をDOS実行ファイルと判定する
* amavisdがその判定を利用する
* `.exe-ms` が禁止対象になっている
という条件が重なった場合に起こる。
したがって、ユーザーに「蛍から本文を書き始めないよう注意する」と求めるような問題ではなく、サーバー側の誤検知対策として考えるべきである。
対処例
今回の環境では、
qr’^\.(exe-ms|dll)$’,
を
qr’^\.dll$’,
へ変更し、`file` コマンドによる `.exe-ms` 判定だけをBANNEDの根拠から外すことにした。
実行ファイルについては別に、
qr’^application/x-msdownload$’i,
qr’^application/x-msdos-program$’i,
というMIME型による判定や、
qr’.\.(exe|vbs|pif|scr|cpl)$’i,
というファイル名による判定も残っている。
さらにClamAVによるウイルス検査も行なっているため、今回の環境では `.exe-ms` の粗い内容判定を外しても、防御全体への影響は大きくないと判断した。
設定には後で理由が分かるよう、例えば次のようなコメントを残しておくとよいだろう。
# 2026-08-23:
# Disable exe-ms detection because Shift_JIS plain text
# beginning with “蛍” may be misidentified as a DOS executable.
qr’^\.dll$’,
