【上級者向け】Outlook VBAでSPF/DKIMを暴く:なりすましメール自動隔離の極意
現場のエンジニア諸君。貴殿らが普段「既読にする」「移動する」といったレベルの単純な自動化で満足しているなら、それは大きな損失だ。
今日は、受信トレイを蹂躙する「なりすましメール」を、Outlookの表面的なプロパティではなく、MIMEヘッダーの深淵から直接摘み取るためのアーキテクチャを伝授する。`PropertyAccessor`を使いこなせなければ、Outlookの真の力は引き出せない。
—
1. なぜ「PropertyAccessor」なのか?
通常の`MailItem`オブジェクトは、便利だが「加工済み」のデータだ。`SenderEmailAddress`などがまさにそれだが、これらは攻撃者に偽装されやすい。
我々が真に信頼すべきは、メールが通過したサーバーの証明であるAuthentication-Resultsや、Received-SPFといった隠れたヘッダー情報だ。これらにアクセスするには、MAPIプロパティを直接操作する`PropertyAccessor`クラスが不可欠である。
避けるべきアンチパターン
- MailItemのプロパティのみでの判定: 送信元を偽装された時点で、フィルタリングルールは突破される。
- イベントの連鎖によるスタック: `Items.ItemAdd`イベント内で、移動処理を無限ループさせる設計は論外だ。
—
2. 堅牢な設計:アーキテクチャの指針
本質的なセキュリティ自動化には、以下の3つの原則が必要だ。
1. 非同期的な疎結合: イベントハンドラ内で重い処理をしてはならない。処理はキューイングするか、極力シンプルに完結させる。
2. スキーマの厳密な指定: `PropertyAccessor`でアクセスする際、ヘッダーのプロパティタグ(`http://schemas.microsoft.com/mapi/proptag/0x007D001E`等)を正しく定義せよ。
3. 例外ハンドリングの徹底: ネットワーク環境やOutlookの同期タイミングにより、プロパティが取得できないケースは必ず発生する。これを握りつぶさず、ログへ逃がす設計がプロの条件だ。
—
3. 【プロダクションコード】ヘッダー解析と自動隔離
このコードは、受信トレイに届いたアイテムを監視し、SPF認証が失敗している(`fail`または`softfail`)と判断した場合に、即座に「隔離フォルダ」へ移動させるものだ。
Option Explicit
‘ 監視対象のフォルダ(受信トレイ)
Private WithEvents InboxItems As Items
Private Sub Application_Startup()
‘ Outlook起動時に受信トレイを監視下に置く
Dim ns As NameSpace
Set ns = Application.GetNamespace(“MAPI”)
Set InboxItems = ns.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub InboxItems_ItemAdd(ByVal Item As Object)
If TypeOf Item Is MailItem Then
Call AnalyzeAndQuarantine(Item)
End If
End Sub
Private Sub AnalyzeAndQuarantine(ByVal mail As MailItem)
Dim pa As PropertyAccessor
Dim header As String
Dim targetFolder As MAPIFolder
‘ PropertyAccessorの初期化
Set pa = mail.PropertyAccessor
‘ PR_TRANSPORT_MESSAGE_HEADERS (0x007D001E) を取得
header = pa.GetProperty(“http://schemas.microsoft.com/mapi/proptag/0x007D001E”)
‘ SPF認証結果を解析 (単純化のためInStrを使用。高度な解析にはRegexを推奨)
‘ “Received-SPF: fail” や “softfail” を含むかチェック
If InStr(1, header, “Received-SPF: fail”, vbTextCompare) > 0 Or _
InStr(1, header, “Received-SPF: softfail”, vbTextCompare) > 0 Then
‘ 隔離用フォルダを取得(事前に作成しておくこと)
On Error Resume Next
Set targetFolder = Session.GetDefaultFolder(olFolderInbox).Folders(“隔離フォルダ”)
On Error GoTo 0
If Not targetFolder Is Nothing Then
mail.Move targetFolder
Debug.Print “脅威検知: ” & mail.Subject & ” を隔離しました。”
End If
End If
End Sub
—
4. 運用・保守におけるクリティカルな注意点
このシステムを実務で運用する際、以下の3点に注意せよ。
- 「隔離フォルダ」の生存確認: コード内でフォルダの存在チェックを怠ると、`Move`メソッドがエラーを吐き、プロセスの実行が止まる。`On Error`によるガードは必須だ。
- パフォーマンスの重み: `ItemAdd`イベントは、メール受信時に毎回走る。ヘッダーの文字列検索は軽量だが、ここに重い外部DB照会などを書けば、OutlookのUIがフリーズする。外部連携が必要な場合は、一度ローカルのテキストログやSQLite等へ書き出し、別のプロセスで集計・解析を行うのが「大人の設計」だ。
- プロパティ取得のタイムアウト: `PropertyAccessor`はキャッシュにアクセスする。同期直後のアイテムに対して呼び出すと、プロパティがまだ読み込まれていない場合がある。その場合は`DoEvents`で待機するか、再試行ロジックを組み込め。
結びに代えて
自動化とは、単なる「作業の省略」ではない。「人間が判断しきれないリスクを、システムの仕組みで無力化すること」だ。
SPF/DKIMの解析をVBAで制御することは、決してスマートな手法とは言えないかもしれない。現代ではクラウド側のゲートウェイで処理すべき領域だからだ。しかし、環境制約によりそれが許されない現場において、このコードは貴殿の組織を守る最後の砦となる。
コードをコピペして満足せず、自身の環境に合わせて「なぜその実装なのか」を自問自答し続けてほしい。それが、世界最高峰の自動化エンジニアへの道だ。
