客「ごめんくださ〜い」俺「俺はいませんよ」客「は?」
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を使っている場合は、これも無効にしておいた方がいいみたいですね。