客「ごめんくださ〜い」俺「俺はいませんよ」客「は?」

今日はSMTP脆弱性について少し。

VRFYコマンド

VRFYコマンドはSMTPで使えるコマンドの一つで、引数にアカウントを指定することで、そのアカウントのメールボックスの存在を確認するコマンドです。
これを利用すると任意のアカウントの有無が分ってしまいます。

やってみます

まずSMTP接続

[farmedgeek@localhost ~]$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.localhost.com ESMTP Postfix

farmedgeek っていう私のアカウントで試してみます。

VRFY farmedgeek
252 2.0.0 farmedgeek

252 っていうステータスが返ってきました。

次に、私のサーバには存在しない naturalgeek っていうアカウントを試してみます。

VRFY naturalgeek
550 5.1.1 <naturalgeek>: Recipient address rejected: User unknown in local recipient table

今度は550っていう反応が来ました。

  • 存在するアカウントだと252
  • 存在しないアカウントだと550

が返されます。アカウントの有無で挙動が変わる訳ですね。
これを利用して「いない、いない、いる、いない、いる」とかやってると、いずれ存在するアカウントのリストができてしまいますね。
これはSMTPが持っている脆弱性で、このコマンドは使えないようにするのが推奨されています。

VRFYコマンドを駄目だこいつ早くなんとかするやり方

main.cfを編集。

[farmedgeek@localhost ~]$ sudo emacs /etc/postfix/main.cf

以下の一文を追記。

disable_vrfy_command = yes

以上です。簡単ですね。

では先ほどと同様にVRFYコマンドを叩いてみます。

VRFY farmedgeek
502 5.5.1 VRFY command is disabled
VRFY naturalgeek
502 5.5.1 VRFY command is disabled

はい。無事に怒られました。アカウントの有無に関わらず、同じ怒られ方ですね。
こうしておけばとりあえずVRFYコマンドでコソコソとアカウントの有無を探られる心配はありません。

ちなみにSMTPではEXPNコマンドも用意されており、これはメーリングリストの存在確認用のコマンドで、脆弱性としてはVRFYと同様ですが、Postfixでは元々使えないコマンドなので今回はスルーします。
Postfix以外のMTAを使っている場合は、これも無効にしておいた方がいいみたいですね。