本記事は2024年2月にNTTセキュリティホールディングス株式会社が発表した論文『ChatSpamDetector: Leveraging Large Language Models for Effective Phishing Email Detection [1]』の内容を解説したものです。
こんにちは、グローバル技術開発部の小出です。
フィッシング攻撃は日々進化し、より洗練されて検出が難しくなっています。従来、スパムフィルターや電子メールのセキュリティプロトコルは、フィッシングメールを防ぐ上で重要な役割を果たしてきました。しかし、多くのメールサービスが、迷惑メールフォルダに振り分けられたメールについて、なぜ疑わしいと判断したのか、ユーザーに明確な理由を提供していません。最終的に、メールを信用して開くかどうかの判断はユーザーに委ねられています。フィッシングメールの見逃しや誤検知によるユーザの不利益を防ぐためには、判定結果だけでなく根拠とともに明確な理由を説明する必要があります。
そこで我々は、ChatGPTに代表される大規模言語モデル(LLM)を活用してフィッシングメールを検出するシステムChatSpamDetectorを開発しました。ChatSpamDetectorは、フィッシングメールを高精度で検出するだけでなく、具体的な根拠とともにフィッシング判定の理由を提供することができます。
主な特徴
- 高精度: 99.70%という高精度でフィッシングメールを検出します。
- 詳細な説明: フィッシング判定した理由の説明によりユーザの意思決定を支援します。
- 高度な分析: メールのヘッダーと本文の両方を分析することで、ブランドのなりすましや偽の情報を含む幅広いフィッシングの戦略を発見します。
関連記事
ChatGPTはフィッシングサイトを検出できるか | NTTセキュリティ テクニカルブログ
ChatSpamDetector

ChatSpamDetectorの仕組みを見てみましょう。このシステムはEML形式(.eml)のメールデータを解析し、LLMに入力するプロンプトに変換します。検出する対象は、メッセージ中のリンクをクリックするとフィッシングサイトへ到達するフィッシングメールです。基本的なアイディアは前回の記事と同様です。あらかじめ用意したプロンプトのテンプレートにメールの情報を挿入してLLMによる解析を行います。以下では、メールのデコード、メールの簡略化、プロンプトの作成について詳しく説明します。
メールのデコード
EML形式のメールデータにはヘッダと本文が含まれます。ヘッダには送受信者のアドレス、件名、送信日時のほか、通信経路の情報などが記述されています。本文にはメールのメッセージが含まれ、プレーンテキスト形式やHTML形式で記述されます。これらの情報はすべてテキストデータですが、非ASCII文字や特殊文字が含まれる場合は異なる文字セットやエンコード形式で表現されます。
例として「こんにちは」という件名のメールがどのように表現されるか見てみましょう。UTF-8文字セット、Base64エンコーディングで件名をエンコードすると以下のようになります。
Subject: =?utf-8?b?44GT44KT44Gr44Gh44Gv?=
LLMがこのような文を直接解析するのは困難です。短い文であればLLMの高度な解析能力で元の文を把握できますが、長い文章であれば失敗する可能性が高まります。そこでメールのヘッダや本文に含まれるエンコードされた文字列をデコードし、可読なテキストに変換して置き換えます。
メールの簡略化
LLMには固有のコンテキストウィンドウ(処理可能な文の長さ)が設定されており、メールによっては上限を超えてしまうことがあります。そこで、ChatSpamDetectorはデコードしたメールのトークン数を計測し、上限を超える場合はトークン数を削減する処理を行います。
まず、複数のMIMEタイプのコンテンツを持つマルチパートのメールの場合、text/html形式のメッセージを優先して他のコンテンツを削除します。このとき、添付ファイルが含まれる場合はバイナリ部分を削除してファイル名のみに置き換えます。次に、メッセージの簡略化を行います。text/html形式のメッセージの場合は前回の記事でWebサイトのHTMLを簡略化した処理と同様の方法で処理します。メッセージ内に含まれる、フィッシングメールを特徴づける重要な箇所を残したまま、不要な箇所を削除します。例えばstyleタグのHTMLエレメントはメッセージ内容と関係がない大量のスタイル情報が含まれることがあります。
text/plain形式のメッセージの場合は行ごとに処理をします。メッセージの先頭や末尾に宛先や署名などの重要な情報が含まれることが多いため、中央部分から順番にトークン数の上限を下回るまで繰り返し行を削除します。
プロンプトの作成
簡略化したメールをもとに、LLMの入力であるプロンプトを作成します。プロンプトエンジニアリングのテクニックを利用して構築した以下のテンプレートにメールを挿入します。
プロンプトのテンプレート
I want you to act as a spam detector to determine whether a given email is a phishing email or a legitimate email. Your analysis should be thorough and evidence-based. Phishing emails often impersonate legitimate brands and use social engineering techniques to deceive users. These techniques include, but are not limited to: fake rewards, fake warnings about account problems, and creating a sense of urgency or interest. Spoofing the sender address and embedding deceptive HTML links are also common tactics. Analyze the email by following these steps: 1. Identify any impersonation of well-known brands. 2. Examine the email header for spoofing signs, such as discrepancies in the sender name or email address. Evaluate the subject line for typical phishing characteristics (e.g., urgency, promise of reward). Note that the To address has been replaced with a dummy address. 3. Analyze the email body for social engineering tactics designed to induce clicks on hyperlinks. Inspect URLs to determine if they are misleading or lead to suspicious websites. 4. Provide a comprehensive evaluation of the email, highlighting specific elements that support your conclusion. Include a detailed explanation of any phishing or legitimacy indicators found in the email. 5. Summarize your findings and provide your final verdict on the legitimacy of the email, supported by the evidence you gathered. Email: ``` {ここに簡略化したメールを挿入する} ``` |
最初に「スパム検出器」という役割を設定することで、回答の精度を向上する工夫をしています。その後、「フィッシングメール検出」というタスクを与え、それを実行するための具体的なサブタスクを記載しています。サブタスクの中身は以下のとおりです。
- ブランドのなりすましを特定する
- ヘッダーを解析して、送信者と送信元アドレスの不一致や受信者を惹きつける件名になっているか調べる
- 本文を解析して、フィッシングサイトへのリンクをクリックさせるようなソーシャルエンジニアリングの手法が使用されているか調べる
- フィッシングメールまたは正規のメールと判断される具体的な根拠を説明する
- 収集した根拠をもとに最終的な判断を下す
LLMのアウトプットを機械的に処理するには、あらかじめ出力形式を指定しておく必要があります。ChatSpamDetectorは、出力形式を指定するためにFunction Callingを使用します。Function Callingは外部関数を呼び出すために必要な引数をJSON形式で出力する機能です。ここでは実際には外部関数を呼び出しませんが、システムの出力を調整するためにこの機能を設定します。これにより指定したJSON形式で文章を生成できるようになります。「print_phishing_result」というファンクション名を設定し、以下のプロパティで出力するように設定しました。
ファンクション
Property | Type | Description |
is_phishing | boolean | A boolean value indicating whether the email is phishing (true) or legitimate (false). |
phishing_score | Type | Phishing risk confidence score as an integer on a scale from 0 to 10. |
brand_impersonated | string | Brand name associated with the email, if applicable. |
rationales | string | Detailed rationales for the determination, up to 500 words. |
brief_reason | string | Brief reason for the determination. |
is_phishingはフィッシング判定結果を表し、trueまたはfalseが出力されます。
phishing_scoreはメールの怪しさのスコアを0から10の整数で出力します。
brand_impersonatedはフィッシングメールがなりすますブランド名です。
rationalesではフィッシングメールまたは正規メールと判断した詳細な根拠が説明されます。
それを簡潔にまとめたものがbrief_reasonとして出力されます。
実験
それでは実際にフィッシングメールの検出を試してみましょう。実験のために、フィッシングメールと正規メールを含む検証用のデータセットを用意しました。フィッシングメールはハニーポットを通じて収集されたフィッシングメールの公開レポジトリを利用しました。2022年8月から2023年10月にかけて収集されたメールの中から、フィッシングサイトへのリンクを含む1,010件のメールをフィッシングメールのデータセットとして選びました。これらのフィッシングメールは19種類の言語で書かれていました。正規メールに関しては、フィッシングメールと正規メールの公開データセットであるCSDMC SPAM corpusから、およそ同数の1,000件の正規メールをランダムにサンプリングしました。これらの正規メールは12種類の言語で書かれていました。
実験ではGPT-4、GPT-3.5、Llama 2 70B、Gemini Proの4種類のLLMを使用しました。実験結果は以下の表のとおりです。GPT-4がFalse Positive(誤ってフィッシング判定した正規メール)、False Negative(誤って正規判定したフィッシングメール)ともに最も少なく、99.70%の検出精度を達成しました。この結果は、我々の期待をはるかに上回るものでした。続いてGemini Pro(98.01%)、GPT-3.5(96.92%)、LLama 2 70B(79.05%)の順で高い検出精度が得られました。フィッシングメール対策のためのセキュリティシステムの運用には、通常、大量の学習データを用意したり、ブロックリストを整備するなど様々な労力を必要とします。GPT-4の驚異的な性能により、外部データの参照や追加学習を必要とせず、高精度なフィッシングメール検出が可能であることが分かりました。
実験結果
LLM | True Positive | False Positive | True Negative | False Negative | Accuracy |
GPT-4 | 1,007 | 3 | 997 | 3 | 99.70% |
GPT-3.5 | 980 | 32 | 968 | 30 | 96.92% |
Llama 2 70B | 950 | 361 | 639 | 60 | 79.05% |
Gemini Pro | 991 | 21 | 979 | 19 | 98.01% |
検出例
なぜLLMはこのような高精度でフィッシングメールを判定できたのでしょうか。その理由を探るために、LLMの出力を詳細に見てみましょう。AmazonとAppleになりすます2件のフィッシングメールをGPT-4で解析しました。以下の例では、日本語で解析結果を出力するように調整しています。
Amazonのフィッシングメールの例

GPT-4の解析結果
{ "is_phishing": true, "phishing_score": 8, "brand_impersonated": "Amazon.co.jp", "rationales": "1. メールの送信者が「Amazon.co.jp」と偽装され、受信者がフィッシングメールを本物と誤認する可能性があります。しかし、送信者のメールアドレスが「◯◯◯@hotmail.com」であるため、「Amazon.co.jp」からのメールと言えない。 2. メールの件名が「Amazonの異常な注文が保留中」で、利用者がアカウントに問題があると感じさせ、緊急に対応するように誘導しています。これは一般的なフィッシング攻撃の特徴で、利用者の不安や恐怖を煽ってアクションを誘発しようとする手法です。 3. メール本文のリンク先が隠され、「この注文をキャンセルする」の選択肢が提示されています。これは利用者がリンクをクリックしやすくするための一般的なフィッシング手法です。しかも、そのリンク先のURL(https://sjhqjr[.]com)は信頼できるAmazonのURLではない。 4. メールは利用者がアカウントを復元するためにはリンクをクリックしなければならないという旨のメッセージを含んでいます。これは利用者を誤ったアクションに誘導する典型的な社会技術的詐欺の例です。", "brief_reason": "送信者名の偽装、緊急性の提示、リンク先URLの詐欺、並びにアクションを誘導するメッセージの存在から、このメールはフィッシングメールであると判断します。" } |
このフィッシングメールはAmazon.co.jpになりすまし、アカウントに問題があることを警告しています。24時間という時間制限を設定してユーザの危機感を煽り、リンクにアクセスさせようとしています。GPT-4による解析結果を詳しく見ていきましょう。is_phishingがtrueに設定され、phishing_scoreは8(/10)、brand_impersonated(なりすましブランド)はAmazon.co.jpとなり、正しくフィッシング判定できています。rationales(根拠)として、送信者のアドレスが偽装されていること、件名や本文にユーザの不安や恐怖を煽る手法が使用されていることを指摘しています。また、本文中のリンクのURLを分析し、Amazonの正規のURLではないと指摘しています。brief_reasonではこれらの根拠を簡潔にまとめています。解析結果から、LLMはヘッダや本文からフィッシングメールの怪しさを的確に特定し、具体的な根拠をもとに説明できていることが分かります。
Appleのフィッシングメールの例

GPT-4の解析結果
{ "is_phishing": true, "phishing_score": 8, "brand_impersonated": "Apple", "rationales": "このメールは、一見するとAppleからのメールのように見えますが、かなりの確率でフィッシングメールであると言い切れます。具体的な理由は以下の通りです。1) 送信者アドレスがAppleの公式ドメインではなく、'okrx[.]app'となっています。このようにブランド名を偽装することは一般的なフィッシング手法の一つです。2) メールヘッダーのReceivedフィールドから見ると、メールは'aol[.]com'や'mailgun[.]net'などのIPから送信されています。これらはAppleの公式IPではないため、送信源の信頼性に疑問が生じます。3) メールの本文にHTMLリンクが含まれていますが、そのリンク先は表示されているURL('https://appleid.apple[.]com')とは異なり、「https://api.abear[.]vip/play.php」へのリンクとなっています。これはフィッシングサイトへ誘導する典型的な手法です。4) メールでは、Apple IDの情報が更新されたとの通知が行われ、パスワードの変更を促す内容になっています。これは、一般的なフィッシングメールの手口であり、ユーザーに不安を感じさせて、偽のリンクをクリックさせるためのものです。", "brief_reason": "送信者アドレスの偽装、不適切なリンク、ユーザーの不安を煽る内容など、典型的なフィッシング手法が用いられています。" } |
2つ目のフィッシングメールはAppleを装い、不正アクセスの可能性を提示して受信者をフィッシングサイトにアクセスさせようとしています。GPT-4の結果を見てみると、is_phishingがtrue、phising_scoreが8、brand_impersonatedがAppleと正しくフィッシングメールを識別できています。rationalesとして、送信者アドレスがAppleの正規のドメイン名と異なること、経由したメールサーバが不審であること、本文中のリンクに偽装があることを指摘しています。GPT-4はHTMLを正しく認識し、表示されているURLと実際のリンク先のURLが異なることを指摘しています。また、本文の文脈を理解して、ユーザに不安を感じさせパスワード変更を促し、フィッシングサイトにアクセスさせる典型的なフィッシングの手口であると解釈しています。brief_reasonには、これらの根拠を1つ目のフィッシングメールと同じく簡潔にまとめています。
まとめ
大規模言語モデルを用いたフィッシングメール検出システム「ChatSpamDetector」を紹介しました。このシステムは、フィッシングメールを高精度に検出できるだけでなく、ユーザが理解可能な形でメールの怪しさを根拠とともに説明することができます。LLMの解析能力として、フィッシングメールのブランドのなりすましを正しく識別し、ユーザを騙す手口やリンク偽装のようなテクニックを特定できることが分かりました。今後もLLMの高度な言語処理能力を活用した新たなセキュリティシステムの研究開発に取り組んでいきます。
参考文献
[1] Takashi Koide, Naoki Fukushi, Hiroki Nakano, and Daiki Chiba. 2024. ChatSpamDetector: Leveraging Large Language Models for Effective Phishing Email Detection. https://arxiv.org/abs/2402.18093