10月2日、チリ最大手の年金基金運用会社のひとつであるAFP ProVidaから、「Aviso Ingreso Reclamo」(苦情受付のお知らせ)という件名のメールが届きました。複数の従業員の年金保険料を支払っていないと当社を非難し、延滞利息に触れたうえで、法的な債権回収の警告で締めくくられていました。申し立ての詳細を見るには、リンクをクリックする必要がありました。
これは詐欺でした。しかし、メール自体は偽物ではありませんでした。ProVida自身のシステムが、ProVida自身のドメインから送信していたのです。詐欺師は年金基金になりすます必要すらありませんでした。メールを分析した結果からは、同社が一般に公開している苦情受付フォームが悪用されたと考えられます。
あなたの会社に、自動でメール返信し、その返信に申請者が書いた内容を含める公開のWebフォームがあるなら、同じことが起こりえます。
届いたメール
一見すると、不自然な点は見当たりません。差出人は atencionclientes@provida.cl、ロゴはProVidaのもの、問い合わせ窓口の電話番号も本物で、フッターには支店一覧へのリンクがあります。文章もよく書けていて、督促状らしい言葉づかいで、雇用主なら誰もが真剣に受け止める従業員の年金保険料を持ち出しています。
「Ver Detalle del Reclamo」(申し立ての詳細を見る)というリンクの行き先は provida.cl ではありません。年金基金の名前をまねた .icu ドメインの、PDFを装ったファイルを指しています。私たちはそのリンクを開いていません。ドメインにはアクセスせずに公開の登録情報を調べたところ、メールが届く前日の10月1日に登録されており、10月10日に確認した時点ですでに停止されていました。
なぜメールの認証をすり抜けたのか
GmailやOutlookなどのメールサービスは、メッセージが名乗っているとおりの相手から届いたかを判断するために、3つの点を確認します。送信したサーバーがそのドメインから許可されているか(SPF)、メッセージにそのドメインのデジタル署名があり途中で改ざんされていないか(DKIM)、そしてその2つが受信者に見えているアドレスと一致しているか(DMARC)です。これらに失敗すると、ドメイン側の設定に応じて、メールは迷惑メールに振り分けられるか、受信を拒否されます。
このメールは3つともクリアしていました。ProVidaの親会社であるMetLifeのサーバーから送られ、provida.cl の鍵で署名されていたのです。これでわかるのは誰が送ったかであって、中身については何もわかりません。送信者が認証されても、内容が安全だという保証にはならないのです。一部のフィルターが行うリンクの解析など、ほかの仕組みであれば、このようなメールやそのリンクを検出できる可能性はあります。
世の中のアドバイスのほとんど(「差出人を確認する」「見慣れないドメインに注意する」)は、詐欺師が誰かになりすましていることを前提にしています。このメールの場合、差出人を確認するだけでは不十分でした。
苦情受付フォームがフィッシングの経路になる仕組み
ProVidaには、多くの企業と同じように、苦情を受け付けるWebフォームがあります。誰かが入力すると、システムは指定されたアドレスに確認メールを送ります。「Estimado(a) [氏名], te informamos que tu reclamo ha sido ingresado correctamente」([氏名]様、お客様の苦情を受け付けましたのでお知らせします)という内容です。
問題は、そのメールにフォームへの入力内容がそのまま含まれる場合に起こります。システムがその内容をチェックしなければ、名前の代わりに、見出しや段落、リンクを含んだ手紙をまるごと書き込むことも止められません。連絡先アドレスに被害者のメールアドレスを入れるだけです。システムは確認メールを組み立て、あいさつ文の中に手紙を差し込み、企業の署名付きで送信します。
私たちはProVidaのシステムにアクセスできないため詳細は確認できませんが、メールを分析した結果は、この種の悪用を示しています。スクリーンショットを見ると、継ぎ目がわかります。「Notificación de Reclamo por Cotizaciones Pendientes」(保険料未払いに関する申し立て通知)の全文が、「Estimado(a)」の直後、つまりあいさつ文の中に入っています。最後のハイフンの列が、テンプレート本来の文章を下へ押し出していますが、その文章はちゃんと残っています。「Te informamos que tu Reclamo ha sido ingresado correctamente」という一文です。
標的を選ぶのも難しくありません。企業の正式な社名とメールアドレスは、たいてい公開されています。
あなたのフォームにも同じリスクがある
これは年金基金や苦情受付フォームに限った問題ではありません。リスクが生じるのは、システムが次の2つの条件を満たす場合です。誰も確認していないアドレスにメールを送ること、そしてそのメールにフォームの入力者が書いた内容が含まれることです。入力内容を何も繰り返さない定型文だけの自動返信なら、同じリスクはありません。
この2つの条件は、ごく身近なところにあります。「控えを自分に送る」オプション付きの問い合わせフォームは、送信者本人にメッセージを送り返しますが、その送信者は誰でもかまいません。アカウント登録では、ウェルカムメールで名前を呼んであいさつします。見積もり依頼、予約申し込み、イベントやニュースレターの登録も、入力内容の要約を添えて確認メールを送ることがよくあります。どの場合も、本文と送信先アドレスを操れる人なら、企業のシステムを自分のもののように使えてしまいます。
被害は受信者だけにとどまりません。自社のドメインからフィッシングメールが送られ始めると、メールサービス事業者がそのドメインの評価を下げることがあります。そうなると、請求書やパスワード再設定といった正規のメールまで迷惑メールに振り分けられるようになり、しかも詐欺メールに表示されるのは自社の名前です。
穴をふさぐ方法
入力内容はプレーンテキストとして扱う
確認メールがHTML形式なら、ユーザーが入力した内容は差し込む前にエスケープする必要があります。そうすれば、<a> タグはリンクではなく、ただの文字として表示されます。ほとんどのプログラミング言語やテンプレートエンジンにはそのための関数があります。問題が起きやすいのは、手作りのメールテンプレートです。Webサイトほど注意深く見直されることがないからです。
メッセージからタグとリンクを取り除く
HTMLをエスケープするだけでは、すべては解決しません。タグなしのプレーンテキストで書かれたURLは控えにそのまま載り、GmailやOutlookなど多くのメールソフトが自動的にクリックできるリンクに変えてしまいます。そのため、申請者のメッセージを確認し、どのメールに含める場合でも、事前にタグと外部サイトへのリンクを取り除いておくべきです。サポート窓口のフォームで、不具合が起きているページのURLを顧客に貼り付けてもらう場合のように、どうしてもリンクを受け取る必要があるなら、リンクは社内チームには届けてもかまいません。ただし、確認メールで申請者に送り返す必要はありません。
申請者が書いた内容を繰り返さない
確認メールで何かを繰り返す必要は本当にあるでしょうか。「苦情を受け付けました。受付番号12345」で、名前入りのあいさつと同じ役目は果たせますし、攻撃者が入り込む余地もありません。どうしても名前を表示するなら、文字数と使える文字を制限すると効果的です。本物の名前に2,000文字も、< や > の記号も必要ありません。
送信量を制限する
CAPTCHAや、アドレス単位・IP単位の送信回数制限では、単発の悪用は防げません。しかし、フォームを使って何千通ものメールを送られることは防げます。また、受信したフォームをときどき見直し、名前があるべき場所にリンクやHTMLが入っていないかを確認すれば、第三者から指摘される前に悪用に気づけます。
セキュリティ窓口を公開する
セキュリティ窓口を公開しておけば、問題に気づいた人が知らせてくれやすくなります。そのための標準として、連絡先を示す security.txt ファイルがあります。私たちがProVidaに知らせようとしたとき、その窓口は見つかりませんでした。
メールを受け取る側になったら
次のサインは、差出人が本物であっても、どんなメールにも当てはまります。最初の4つは今回のケースで実際に見られたものです。
- リンク先が別のドメインになっている。クリックする前にリンクにカーソルを合わせ(スマートフォンなら長押しし)、実際のアドレスを確認しましょう。
- 内容がメールの種類と合っていない。自動送信の確認メールに突然督促状が入っていたり、自分がしていない手続きの確認が届いたりする場合です。
- 緊急性と脅し。罰則、利息、法的な債権回収を並べたうえで、すぐにクリックするよう求めてきます。
- 重要な書類がリンクの先にある。まともな機関が、外部サイトに置いた督促書類を送ってくることはまずありません。通常は公式サイトの中で確認する形になります。
- 個人情報やユーザー名・パスワードを求められる。通常、それをメールで求めることはありません。
迷ったときは、メールに書かれた情報を確認のために使わないでください。アドレスを自分で入力して機関の公式サイトにアクセスするか、公式サイトに載っている番号に電話しましょう。チリの年金保険料であれば、雇用主が支払いに使うプラットフォームのPreviredか、AFPのサイトで未払いがないかを確認できます。
この記事では、悪用の再現につながるリンクや技術的な詳細は公開していません。フォームが修正されるまでは、誰でも同じ手口を使えてしまうからです。また、ProVidaの対応の悪さを責めることが目的でもありません。この事例を紹介するのは、受け取るメールに注意してもらうため、そして何より、知らないうちに自社のブランドを危険にさらしかねない状況に対して、企業がよい慣行を取り入れるきっかけにしてもらうためです。