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

というバイト列になる。

file コマンドが参照するファイル形式判定用のmagicデータには、先頭バイト 0x8C を古いMS-DOSのCOM実行ファイルで使われるx86命令の特徴として扱う規則がある。COM形式にはEXEのような明確なヘッダがなく、先頭の機械語らしいバイト列から推測するしかないため、8C 75 ... という通常のShift_JIS文字列が偶然その規則に一致し、DOS executable (COM) と誤認される。

このため、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$’,