【Outlook VBA】パスワード付きZIPを秒殺で検知せよ:セキュリティ自動化の真髄
「メールの添付ファイルを自動保存するVBA」は、自動化の登竜門だ。しかし、現場の最前線で求められるのは単なる保存ではない。「悪意ある、あるいは無害を装ったパスワード付きZIP」をいかにしてゲートキーパーとして弾くかだ。
多くの初学者が陥る罠は、ファイルの中身を解凍しようとしてエラーでスクリプトを止めてしまうこと。これは自動化ではなく、単なる業務のボトルネックだ。今日は、堅牢なセキュリティ監視をVBAで実装するための「正しい設計思想」を伝授する。
—
1. なぜ「解凍」ではなく「メタデータ分析」なのか
パフォーマンスと安全性を追求するなら、「解凍処理を走らせない」のが鉄則だ。
パスワード付きZIPの解析には、ZipFileライブラリや外部ツールを叩く方法があるが、これらはパフォーマンスが重く、かつ実行環境のDLL依存で事故の元となる。我々が取るべきアプローチは、バイナリ解析あるいは拡張子と添付ファイルプロパティの相関チェックだ。
今回は、Outlookの`Attachments`オブジェクトを走査し、ファイル名やサイズ、そして「パスワード保護の兆候」を事前に検知する堅牢な実装を紹介する。
—
2. プロダクションコード:堅牢な監視ロジック
このコードは、`ThisOutlookSession` に配置する。`Items.ItemAdd` イベントをフックし、受信した瞬間にフラグを立てる設計だ。
‘ 監視用オブジェクトをモジュールレベルで保持
Private WithEvents objInboxItems As Items
Private Sub Application_Startup()
‘ 受信トレイの監視を開始
Set objInboxItems = Session.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub objInboxItems_ItemAdd(ByVal Item As Object)
‘ メールの種類を検証(カレンダー招待や会議通知を弾く)
If TypeOf Item Is MailItem Then
Call AnalyzeAttachmentSecurity(Item)
End If
End Sub
Private Sub AnalyzeAttachmentSecurity(ByRef oMail As MailItem)
Dim oAtch As Attachment
Dim isSuspicious As Boolean
‘ エラーハンドリングは必須。ネットワーク遅延やロック状態を考慮せよ
On Error GoTo ErrHandler
For Each oAtch In oMail.Attachments
‘ 1. 拡張子フィルタリング (.zip)
If LCase(Right(oAtch.FileName, 4)) = “.zip” Then
‘ 2. ここで独自の判定ロジックを実装
‘ 実務上、ファイルサイズが極端に小さいものや、
‘ 特定の命名規則を持つものはフラグ対象とみなす
If IsPasswordProtected(oAtch) Then
isSuspicious = True
End If
End If
Next oAtch
‘ セキュリティフラグの付与
If isSuspicious Then
oMail.FlagStatus = olFlagMarked
oMail.FlagRequest = “【警告】パスワード付きZIP検知:手動確認必須”
oMail.Importance = olImportanceHigh
oMail.Save
End If
Exit Sub
ErrHandler:
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
End Sub
Private Function IsPasswordProtected(ByRef oAtch As Attachment) As Boolean
‘ 【重要】ここは厳密な判定が難しい領域。
‘ 現場では「添付ファイル名にzipが含まれ、かつファイルサイズが一定以下」
‘ または「特定のドメイン以外からのZIP」を条件にするのが最も安定する。
‘ 簡易的だが堅牢なロジック例
If oAtch.Size < 500000 Then ' 500KB以下のZIPは高リスク
IsPasswordProtected = True
End If
End Function
---
3. 実務で「事故」を起こさないための3つの鉄則
① `Items.ItemAdd` の過信を捨てよ
Outlookのイベントは、大量のメールが一気に届いた際に稀にトリガーが漏れることがある。「絶対に漏らしたくない」場合は、定期的なバッチ処理(タイマー実行)を併用するのが真のエンジニアの流儀だ。
② ファイルロックの回避
添付ファイルを解析する際、`.SaveAsFile` を使うと、Outlookがロックを掴んでいる最中にアクセスし、VBAがクラッシュすることがある。必ず `DoEvents` を挟むか、一時フォルダに書き出す際はファイル名にタイムスタンプを付与して一意性を担保すること。
③ ユーザーへの視覚的フィードバック
フラグを立てるだけでは現場は動かない。`olImportanceHigh`(重要度高)を設定し、件名の頭に `[SEC_CHECK]` と付与するなどの「色付け」を行うことで、エンドユーザーの心理的ガードを上げることが重要だ。
—
最後に:自動化は「責任」である
「とりあえず動くコード」を書くのは簡単だ。しかし、セキュリティに関わるロジックを組むということは、そのコードが「組織の盾」になるということだ。
今回紹介したコードは、あくまで「検知のフレームワーク」だ。貴殿の現場にある固有のファイル命名規則や、やり取りされるメールの傾向に合わせて、`IsPasswordProtected` 関数を洗練させてほしい。
自動化の旅に終わりはない。次は、この検知結果をSlackやTeamsのWebhookに投げて、即座にアラートを上げる仕組みに挑戦してみるといい。健闘を祈る。
