【テクニカル・上級編】【上級者向け】受信メールのヘッダー情報を解析し、なりすましメールを自動でゴミ箱へ移動するセキュリティツール – Outlook VBA解析バイブル

スポンサーリンク

—

鋼の終端防御:Outlook VBAによるヘッダー解析型「なりすましメール」自動隔離システムの構築

今日のサイバーセキュリティにおいて、境界防御(ファイアウォール)の限界はとうの昔に証明されている。真の戦場は常に「エンドポイント」、すなわちユーザーが直接触れるメーラーの中に移行した。

Microsoft 365やExchange Serverが提供するサーバーサイドのフィルタリングは強力だが、バイパス手法は日々進化している。我々エンジニアに求められるのは、標準機能が「すり抜けてしまった」毒を、クライアントサイドの最終防衛線で検知し、無効化するアーキテクチャだ。

本稿では、Outlook VBAの極限性能を引き出し、メールヘッダーに含まれるSPF(Sender Policy Framework)およびDKIM(DomainKeys Identified Mail)の結果を解析、信頼性の低いメールをミリ秒単位でゴミ箱へ隔離するプロトタイプを提示する。

—

1. なぜ `NewMailEx` イベントなのか

多くのVBAエンジニアは `Items.ItemAdd` を使用するが、エンタープライズ環境における大量の同時受信において、そのイベントはしばしば「沈黙」する。信頼性を担保すべきセキュリティツールにおいて、取りこぼしは許されない。

我々が選択すべきは、`Application_NewMailEx` だ。このイベントは、受信したメールのEntryIDをカンマ区切りの文字列で渡す。複数のメールが同時着信しても、スタックされたIDを確実に処理できる唯一のトリガーである。

—

2. PR_TRANSPORT_MESSAGE_HEADERS へのアクセス

Outlookのオブジェクトモデルは、ユーザーインターフェースとしての利便性を優先しており、生のインターネットヘッダーへのアクセスを意図的に隠蔽している。これをこじ開けるには、MAPIプロパティタグ `0x007D001F` を `PropertyAccessor` 経由で取得する必要がある。

‘ プロパティタグの定義
Const PR_TRANSPORT_MESSAGE_HEADERS As String = “http://schemas.microsoft.com/mapi/proptag/0x007D001F”

このヘッダー情報には、上流のメールサーバー(MTA)が検証した `Authentication-Results` が刻まれている。これをパースすることが、本システムの心臓部となる。

—

3. 実装:なりすまし検知エンジン

以下のコードは、単なるサンプルではない。メモリリークを防ぐためのオブジェクト解放、正規表現オブジェクトの再利用効率、およびWindows APIによる低遅延なデバッグ出力を考慮した、実戦配備可能な設計図だ。

クラスモジュール: `clsSecurityAnalyzer`

(正規表現エンジンのカプセル化)

Option Explicit

‘ VBScript Regular Expressions 5.5 への参照設定を推奨
Private regEx As Object

Private Sub Class_Initialize()
Set regEx = CreateObject(“VBScript.RegExp”)
With regEx
.Global = True
.IgnoreCase = True
.MultiLine = True
End With
End Sub

‘ SPF/DKIMのステータスを判定
Public Function IsSpoofed(ByVal headers As String) As Boolean
‘ 判定ロジック: Authentication-Results ヘッダーを解析
‘ spf=fail または dkim=fail を検出する。
‘ 企業ポリシーにより、softfailの扱いを調整すること。

Dim isInvalid As Boolean: isInvalid = False

‘ SPF Fail のチェック
regEx.Pattern = “spf=(fail|none)”
If regEx.Test(headers) Then isInvalid = True

‘ DKIM Fail のチェック
regEx.Pattern = “dkim=(fail|none)”
If regEx.Test(headers) Then isInvalid = True

IsSpoofed = isInvalid
End Function

Private Sub Class_Terminate()
Set regEx = Nothing
End Sub

標準モジュール: `ThisOutlookSession`

(イベントハンドラと統合ロジック)

Option Explicit

‘ Windows API: デバッグ情報の出力用(即時性とパフォーマンスを両立)
Private Declare PtrSafe Sub OutputDebugString Lib “kernel32” Alias “OutputDebugStringA” (ByVal lpOutputString As String)

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
On Error GoTo ErrorHandler

Dim ns As Outlook.NameSpace
Set ns = Application.GetNamespace(“MAPI”)

Dim ids() As String
ids = Split(EntryIDCollection, “,”)

Dim analyzer As New clsSecurityAnalyzer
Dim i As Integer

For i = 0 To UBound(ids)
ProcessMail ns.GetItemFromID(ids(i)), analyzer
Next i

CleanUp:
Set analyzer = Nothing
Set ns = Nothing
Exit Sub

ErrorHandler:
OutputDebugString “SecurityTool Error: ” & Err.Description
Resume CleanUp
End Sub

Private Sub ProcessMail(ByRef item As Object, ByRef analyzer As clsSecurityAnalyzer)
‘ MailItem以外(会議出席依頼など)をスキップ
If Not TypeOf item Is Outlook.MailItem Then Exit Sub

Dim mail As Outlook.MailItem
Set mail = item

Dim headers As String
Const PR_TRANSPORT_MESSAGE_HEADERS As String = “http://schemas.microsoft.com/mapi/proptag/0x007D001F”

‘ ヘッダーの取得
On Error Resume Next
headers = mail.PropertyAccessor.GetProperty(PR_TRANSPORT_MESSAGE_HEADERS)
On Error GoTo 0

If headers = “” Then GoTo ReleaseObj

‘ 解析と隔離実行
If analyzer.IsSpoofed(headers) Then
‘ ゴミ箱フォルダへの移動
‘ ※真の運用では隔離専用フォルダを作成し、そこへMoveすることを推奨
mail.UnRead = False ‘ 既読にする
mail.Move Application.Session.GetDefaultFolder(olFolderDeletedItems)

OutputDebugString “SecurityTool: Threat Isolated – Subject: ” & mail.Subject
End If

ReleaseObj:
Set mail = Nothing
End Sub

—

4. チーフアーキテクトの視点:最適化と保守の勘所

オブジェクトの生存期間管理

VBAにおける最大の敵はメモリリークと、COMオブジェクトのゾンビ化だ。`ProcessMail` 内で `MailItem` を引数として渡す際、`ByRef` で参照を渡しているが、ループ内での明示的な `Set mail = Nothing` は、ガベージコレクションを持たないVBA環境において、Outlookのメモリフットプリントを安定させるための「作法」である。

Windows API `OutputDebugString` の採用理由

`Debug.Print` はVBAエディタが開いている時にしか機能せず、大量のログ出力はIDE自体をフリーズさせる要因となる。`OutputDebugString` を使えば、[DebugView (Sysinternals)](https://learn.microsoft.com/en-us/sysinternals/downloads/debugview) などの外部ツールで、IDEを介さずにリアルタイムでログを監視できる。これは、バックグラウンドで動作し続ける常駐型自動化ツールの保守において不可欠な技術だ。

レガシー環境への配慮

このツールは、最新のMicrosoft 365から、いまだ現役で稼働するオンプレミスのOutlook 2016まで幅広く動作する。しかし、組織によっては「SPFが設定されていない正当な送信元(SaaS等)」が存在する。その場合、`IsSpoofed` 内に特定のドメインをホワイトリストとして除外するロジックを、`Dictionary` オブジェクトを用いて実装するのが次のステップとなるだろう。

—

5. 終わりに

セキュリティは、利便性とトレードオフの関係にある。しかし、VBAという「現場に最も近い武器」を研ぎ澄ますことで、その乖離を埋めることができる。

今回紹介したヘッダー解析は、メールセキュリティの入り口に過ぎない。ここからさらに、本文内のURLを抽出し、ドメインのレピュテーションスコアをAPIで問い合わせるような拡張も可能だ。

「枯れた技術」とされるVBAを、いかにして現代の脅威に対抗する「鋭い刃」に変えるか。その答えは、言語の仕様を深く理解し、システム全体のライフサイクルを俯瞰するあなたの設計思想の中にしかない。

タイトルとURLをコピーしました