最終更新: 2026年9月28日

XLSX vs. XLSM Security: How Spreadsheet Macros Expose Your Network

Excel ファイルのセキュリティ解説:XLSX、XLSM、マクロのリスク

何十年もの間、Microsoft Excel はビジネス業務の汎用エンジンとして位置付けられてきました。企業予算のバランスを取り、複雑なデータセットを可視化し、在庫を追跡し、ほぼすべての業界で分析パイプラインを支えています。

しかし、同じ計算柔軟性がスプレッドシートをサイバー攻撃者にとって根強い標的にしています。攻撃者は 1990 年代後半のマクロウイルスの初期からスプレッドシートを武器化してきました。Microsoft とシステム管理者は、ファイル形式の分離やデフォルトのマクロブロックなど、複数の防御層を導入していますが、ソーシャルエンジニアリングや微妙なアーキテクチャ上のリスクにより、Excel に特化した攻撃は依然として重要です。

レジリエントなセキュリティ体制を構築するには、開発者、管理者、パワーユーザーはワークブックインターフェイスの下層を見なければなりません。基盤となる OpenXML フォーマットの動作や、.xlsx と .xlsm がアーキテクチャレベルでどのように異なるか、マクロ実行のメカニズムがどのように機能するかを理解することは、最新のエンドポイントを防御する上で不可欠です。

1. 現代の Excel ファイルの構造:OpenXML の解体

Microsoft Office 2007 がリリースされる前、Excel は主に独自のバイナリ形式でファイルを保存しており、特に .xls フォーマット(Binary Interchange File Format、通称 BIFF8 に準拠)が代表的でした。.xls ファイルでは、データレコード、書式定義、数式、そして Visual Basic for Applications (VBA) マクロストリームが単一の構造化ストレージコンテナにパッケージ化されていました。このため、プログラムによる検査が困難になり、攻撃者は不透明なバイナリ領域内に悪意のあるペイロードスクリプトを隠すことができました。

Excel 2007 以降、Microsoft は Office Open XML (OOXML) 標準(ECMA-376 および ISO/IEC 29500 として標準化)を導入しました。OOXML の下では、Excel ワークブックはもはや単一のバイナリブロブではなく、XML ドキュメント、リレーションシップテーブル、埋め込みメディア資産の階層構造を含む zip アーカイブとなります。

ZIP コンテナ内

標準的な最新のExcelブックの拡張子を .zip に変更すれば、任意の標準的な解凍ユーティリティでその内容を抽出できます:

my_workbook.xlsx (extracted)
│
├── [Content_Types].xml        <-- Registry of MIME types and structural parts
├── _rels/                     <-- Package-level relationship mappings
│   └── .rels
├── docProps/                  <-- Metadata (author, creation date, revision)
│   ├── app.xml
│   └── core.xml
└── xl/                        <-- Core spreadsheet contents
    ├── workbook.xml           <-- Workbook-level parameters and sheet list
    ├── styles.xml             <-- Cell styles, fonts, and borders
    ├── sharedStrings.xml      <-- Unique string index for performance optimization
    ├── _rels/
    │   └── workbook.xml.rels  <-- Sheet and component dependencies
    └── worksheets/
        ├── sheet1.xml         <-- Raw cell values, formulas, and grid geometry
        └── sheet2.xml

この構造的な変化により、即座にセキュリティ上の利点が得られました:

  1. DPI(ディープパケットインスペクション)&ゲートウェイ可視性: セキュリティ機器、プロキシ、エンドポイントエージェントは、アーカイブをリアルタイムで解凍し、プレーンテキストのXMLツリーを解析して、疑わしい文字列、外部URL、または埋め込みオブジェクトを特定できます。
  2. 決定的なファイル検証: ファイルがOpenXMLドキュメントであると主張しながらスキーマ制約に違反している場合、Excelは開くことを拒否するか、サンドボックス化された回復モードで実行します。
  3. フォーマットの分離: Microsoftは、通常の計算スプレッドシートと、埋め込み手続きスクリプトを実行できるファイルを切り離しました。

2. XLSX vs. XLSM: アーキテクチャの境界

.xlsx と .xlsm の主な違いは、ファイル構造が実行可能なマクロプロジェクトの組み込みを許可しているかどうかにあります。

機能 / 次元.xlsx(Excel OpenXML スプレッドシート).xlsm (Excel マクロ有効スプレッドシート)
MIME コンテンツタイプapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetapplication/vnd.ms-excel.sheet.macroEnabled.12
VBA ストレージ コンテナ厳格に禁止。 vbaProject.bin を保存できません許可。 xl/vbaProject.bin が含まれています
ネイティブ実行リスクマクロ実行への影響は無視でき、数式インジェクション/DDE に限定されます高い; ワークブックの操作時に自動化された VBA コードを実行できます
OpenXML 厳密スキーマ厳密でマクロなしの XML 定義に準拠していますレガシーおよび最新の自動化拡張機能の定義を含みます
ユーザー視覚インジケータ標準の緑色スプレッドシートアイコン感嘆符が付いたスプレッドシートアイコン

実装メカニズム: XLSX がマクロを実行できない理由

ジュニア管理者や開発者の間でよくある質問は次のとおりです: 攻撃者が悪意のある .xlsm ファイルを取得し、実行可能なコードを注入して、ファイル拡張子を .xlsx に変更した場合、何が起こりますか?

簡潔な答えは: ファイルはマクロを実行しません。

Excel は実行ルールを決定する際にファイル拡張子だけに依存していません。.xlsx という名前のファイルを開くときは、

  1. Excel は zip ペイロードを検査し、[Content_Types].xml を参照します。
  2. 正規の .xlsx ファイルでは、定義されたすべてのコンテンツタイプは標準データ要素(worksheet、sharedStrings、styles など)を表します。
  3. 攻撃者が手動でコンパイル済み VBA ストリーム(xl/vbaProject.bin)を .xlsx パッケージに注入し、リレーションシップを更新すると、Excel は明示的なスキーマ矛盾に直面します:
    • それは、マクロ機能を示すコンテンツタイプに結び付けられた .xlsx 拡張子を検出します。
    • Excel は致命的な整合性エラーを投げます: “Excel はファイル形式またはファイル拡張子が無効なため、ファイル ‘filename.xlsx’ を開くことができません。ファイルが破損していないか確認してください…”
  4. 攻撃者が内部タイプをそのまま残し、バイナリを登録しない場合、Excel は vbaProject.bin を zip アーカイブ内の参照されていない孤立した添付ファイルとして扱い、ロードサイクル中に完全に破棄します。

結果として、本物の .xlsx コンテナとして厳密に機能するファイルはネイティブ VBA コードを実行できません。 ただし、これは .xlsx ファイルがすべての攻撃ベクトルから免れていることを意味するわけではなく、本ガイドの後半で詳しく説明します。

3. マクロリスクと攻撃ライフサイクル

マクロは、Visual Basic for Applications (VBA) を使用して、繰り返しの会計、財務モデリング、データ操作タスクを自動化するように設計されました。VBA は職場の自動化向けに構築されているため、コンポーネントオブジェクトモデル (COM)、Windows Script Host (WSH)、および直接的な Win32 API 呼び出しを通じて、基盤となる Windows オペレーティングシステムへの広範なアクセスが提供されました。

信頼できないマクロが実行されると、ログイン中のユーザーと全く同じ特権で実行されます。それは仮想化された JavaScript スタイルのブラウザサンドボックス内に閉じ込められることはありません。

+--------------------------------------------------------------------------------+
|                             ATTACK LIFECYCLE                                   |
+--------------------------------------------------------------------------------+
                                       │
                                       ▼
  [ Delivery & Evasion ]  ──────► Spear-phishing email with .xlsm, .xlam, or .zip.
                                       │
                                       ▼
  [ Social Engineering ]  ──────► Lures victim to bypass Protected View ("Enable Content").
                                       │
                                       ▼
  [ Auto-Execution ]      ──────► Auto_Open() or Workbook_Open() triggers automatically.
                                       │
                                       ▼
  [ System Invocation ]   ──────► VBA creates COM objects (WScript.Shell, WinHttp.WinHttpRequest).
                                       │
                                       ▼
  [ Payload Retrieval ]   ──────► Spawns hidden PowerShell/cURL to fetch staging binary.
                                       │
                                       ▼
  [ Post-Exploitation ]   ──────► In-memory execution, credential theft, lateral movement.

一般的なマクロ侵入手法

  1. 自動実行フック: 攻撃者は Sub Auto_Open() や Private Sub Workbook_Open() などの組み込みイベントハンドラ内にエントリーポイントを配置します。ユーザーが実行権限を付与すると、これらのルーチンはスプレッドシート内でクリックを必要とせずにトリガーされます。

  2. 難読化とスタンピング:

    • 文字列難読化: ペイロードは文字配列、XOR エンコード、Base64 デコード、または環境変数の連結(例: Chr(112) & Chr(111) & Chr(119)...)を使用して URL やシステムコールを隠蔽します。
    • VBA スタンピング: VBA は vbaProject.bin 内に 2 つの形態、解釈されたソースコードとコンパイルされた p-code(コンパイルした特定の Office バージョンを対象とした疑似コード)として存在します。攻撃者は平文のソースコードを完全に削除し、コンパイルされた p-code のみを残すことができます。多くの基本的なアンチウイルス製品や静的解析ツールはソースストリームのみを検査し、p-code は一致する Office バージョンで実行されるまで検出されません。
  3. 自前ツール利用(LotL): 現代の悪意あるマクロは、ディスクに直接 .exe ファイルを落とすことはほとんどありません。これはエンドポイント検知・応答(EDR)エージェントに即座に警告を出すためです。その代わりに、組み込みのシステムツールと連携します:

    • コマンドライン引数を実行するために WScript.Shell をインスタンス化する。
    • 実行ポリシーをバイパスして PowerShell.exe を呼び出す(-ExecutionPolicy Bypass -WindowStyle Hidden)。
    • Declare PtrSafe Function CreateProcess または VirtualAlloc を介してネイティブ Win32 API を呼び出し、シェルコードをシステムメモリに直接注入する。

4. その他のスプレッドシート脅威ベクター(標準 VBA を超えて)

環境を .xlsm ファイルから保護するだけでは戦いの半分に過ぎません。攻撃者は従来の VBA とは独立して動作する仕組みも利用します。

動的データ交換 (DDE) と CSV インジェクション

Excel には Dynamic Data Exchange(DDE)というレガシープロトコルがあり、実行中のアプリケーション間でデータ共有を可能にします(例として、別プログラムからライブ株価ティッカー情報を Excel のセルにストリーミングすることなど)。

  • 数式インジェクションの動作方法: スプレッドシートのセルが =, @, +, - などの文字で始まると、Excel はその内容を数式として解釈します。攻撃者がスプレッドシートにエクスポートされる入力(たとえば、Web アプリケーションの未サニタイズの"Comments"フィールドが CSV や XLSX にエクスポートされる場合)を制御できれば、次のようにインジェクションできます:
    =cmd|'/C powershell.exe -w hidden -enc <base64_payload>'!A0
    
  • 開くと、Excel は数式を評価し、外部アプリケーションの起動に関するプロンプトでユーザーに警告し、承認されればシステムシェルを実行します。

Excel 4.0 (XLM) レガシーマクロ

1993年にVBAが導入される前、ExcelはExcel 4.0 (XLM) マクロとして知られる数式ベースのマクロシステムを使用していました。これらのマクロは、別個のVBAプロジェクトではなく、専用のマクロシート内に存在します。

XLMマクロはセル数式(例:=EXEC("calc.exe"))として記述されているため、多くの標準的なVBA静的検査エンジンを回避します。攻撃者は2010年代後半から2020年代初頭にかけて、Microsoftがモダンなエンタープライズビルドでデフォルトで無効化する前に、自動検出を回避するためにXLMマクロを好んで使用しました。

悪意のある外部接続とOLEオブジェクト

通常の.xlsxブックでも、外部リソースを介してリスクをもたらす可能性があります:

  • 埋め込みOLEパッケージ: 攻撃者は、埋め込みPDFアイコンに偽装した実行可能ファイルをワークシートに直接挿入できます。
  • 外部ブックリンクとウェブクエリ: XLSXは、ファイルを開くと自動的に攻撃者が制御するコマンド&コントロール(C2)サーバーへHTTP GETリクエストを開始する外部参照を含むことができ、主に偵察やnetNTLMハッシュ収集攻撃に使用されます。

5. エンタープライズのハードニングとディフェンス・イン・デプス戦略

Excel由来の脅威に対抗するには、ネットワーク検査、システム構成、アクセス制御、運用プロセスを網羅する階層的なアプローチが必要です。

+─────────────────────────────────────────────────────────+
|                  ENTERPRISE DEFENSE LAYERS               |
+─────────────────────────────────────────────────────────+
|  PERIMETER: Drop inbound .xlsm, .xla, and .xltm at mail |
|  gateway unless cryptographically signed or exempted.   |
+---------------------------------------------------------+
|  IDENTITY & POLICY: Enforce ASR rules and apply         |
|  Mark of the Web (MotW) macro execution blocks.         |
+---------------------------------------------------------+
|  RUNTIME: Hook AMSI into Office to evaluate dynamic     |
|  VBA buffers directly before execution.                 |
+---------------------------------------------------------+
|  STORAGE: Restrict macro execution exclusively to       |
|  managed, centralized Trusted Locations.                |
+─────────────────────────────────────────────────────────+

1. Webマーク(MotW)マクロブロックの適用

2022年、MicrosoftはOfficeアプリケーションのデフォルト動作を更新しました:インターネットから取得されたファイル内のマクロは デフォルトでブロック されます。

ユーザーがブラウザや外部クライアントを介してファイルをダウンロードすると、Windowsはそのファイルに Zone.Identifier という代替データストリーム(ADS)を付加します(ゾーン3はインターネットを示します)。このマークが付いたファイルに対して、Excelはマクロを完全に無効化し、赤いセキュリティバナーを表示します: > "セキュリティリスク: Microsoft は、このファイルのソースが信頼できないため、マクロの実行をブロックしました。"

管理上の対策: この動作がグループポリシーで強制され、エンドユーザーによって上書きできないことを確認してください:

  • GPO パス: User Configuration > Administrative Templates > Microsoft Excel 2016 > Excel Options > Security > Trust Center
  • 設定: "インターネットからの Office ファイルでマクロの実行をブロックする" を有効にします。

2. 攻撃面削減(ASR)ルールの設定

Microsoft Defender for Endpoint を使用している組織は、Office アプリケーション専用に設計されたコアの攻撃対象領域削減(ASR)ルールを有効にすべきです:

  • Block Office applications from creating child processes (GUID: D4F940AB-401B-4EFC-AADC-AD5F3C50688A)
    • Excel が PowerShell、CMD、またはスクリプトエンジンを起動するのを防止します。
  • Office アプリケーションが他のプロセスにコードを注入することをブロックする (GUID: 75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84)
  • Office マクロからの Win32 API 呼び出しをブロックする (GUID: 92E6390C-CF9E-43CE-BD8C-0E6F0FE66680)

3. アンチマルウェアスキャンインターフェース(AMSI)を活用

最新の Microsoft 365 バージョンは VBA の実行を AMSI と直接統合しています。攻撃者が高度な文字列難読化や VBA スタンピングを行った場合でも、VBA ランタイム エンジンは再構築された暗号化されていないコマンドを実行直前の正確なミリ秒でインストール済みのアンチウイルス/EDR エンジンに渡します。エンドポイント保護が AMSI ランタイム イベントを積極的に監視していることを確認してください。

4. 信頼できる場所とデジタル証明書への移行

日常業務で自動化されたスプレッドシートに依存している組織向けに:

  • ユーザーのダウンロードやデスクトップフォルダーにある不要な XLSM ファイルを削除する。
  • 信頼できる場所を使用する: マクロの実行を、IT 管理者が管理する読み取り専用ネットワーク共有にのみ制限します。
  • コード署名: 社内で開発されたすべてのマクロは、企業の公開鍵基盤 (PKI) が発行した証明書で暗号的に署名することを義務付けます。Excel を設定して、デジタル署名されたマクロのみを実行し、署名のないマクロは静かにブロックします。

6. 開発者の視点:安全な自動化の構築

Excel ファイルを解析、生成、または利用するソフトウェア(例: pandas/openpyxl を使用した Python パイプライン、Node.js マイクロサービス、C#/.NET アプリケーション)を構築している場合は、以下の開発上の安全策を適用してください:

  1. アップロード時に予期しないファイル形式を拒否する: アプリケーションが財務レポートを想定している場合、受信ファイルが .xlsx 形式であることを厳密に検証してください。内部のマジックバイト(標準的な zip ヘッダー 50 4B 03 04)を確認し、アーカイブインデックス内に vbaProject.bin エントリが存在しないことを確認してから、クラウドバケットやデータベースに保存します。

  2. 数式インジェクションに対するデータのサニタイズ: ユーザー生成入力を CSV または XLSX ファイルにエクスポートする際、危険な文字(=, +, -, @, \t, \r)で始まるセルの先頭にアポストロフィ (') またはスペースを付加してください:

    def sanitize_for_spreadsheet(value: str) -> str:
        if value and value[0] in ('=', '+', '-', '@', '\t', '\r'):
            return f"'{value}"
        return value
    
  3. VBA から Office Scripts または Web アドインへ移行する: 最新のエンタープライズ自動化のために、レガシー VBA を完全に廃止してください:

    • Office Scripts: TypeScript で記述され、サンドボックス化されたクラウド環境で実行され、Web とデスクトップのエディション間でネイティブ OS のシステムコールを露出せずにクリーンに動作します。
    • Office Web Add-ins: 標準的なHTML、CSS、最新のJavaScriptを使用して構築され、Webアドインは管理されたJavaScript APIを介して通信し、ローカルオペレーティングシステムから分離されています。

7. スプレッドシートセキュリティの要点チェックリスト

  • デフォルトで .xlsx を強制: すべての標準ユーザーワークフローでマクロなしの .xlsx として保存することを要求します。
  • インターネット起源のマクロをブロック: MotW ポリシーの適用が GPO または Intune を通じて組織全体に展開されていることを確認します。
  • ASR ルールを有効化: Office 製品がコマンドインタプリタや子プロセスを生成することを禁止します。
  • Excel 4.0 (XLM) を廃止: すべてのワークステーションでレガシー XLM マクロエンジンが永久に無効化されていることを確認します。
  • アプリケーションのエクスポートをサニタイズ: CSV および Excel 生成ルーチンを CSV/数式インジェクションから保護します。
  • Office Scripts へシフト: レガシー管理マクロを TypeScript 主導の Office Scripts と管理 API に移行します。

スプレッドシートを単なる文書ファイルではなく、実行機能を備えた構造化されたソフトウェアコンテナとして扱うことで、セキュリティチームと開発者はエンタープライズコンピューティングにおける最も古い攻撃ベクトルの一つを効果的に無力化できます。

よくある質問 (FAQ)

Q1: .xlsx で終わるファイルは悪意のあるマクロを実行できますか?

いいえ、OpenXML 標準では .xlsx ファイル内のマクロコードは厳格に禁止されており、Excel は正規の .xlsx コンテナに挿入された VBA プロジェクトを拒否または削除します。

Q2: Excel ファイルが「編集の有効化」または「コンテンツの有効化」を求めてきた場合、どうすればよいですか?

送信者を知っていてファイルを期待している場合にのみ権限を付与してください。このプロンプトは、信頼できないマクロがコードを実行できるようにする主要なチェックポイントです。

Q3: Microsoft Excel はファイルがインターネットから来たかどうかをどのように判断しますか?

Windows はダウンロードしたファイルに隠しの "Mark of the Web" (Zone.Identifier) ストリームを付加し、これにより Excel は既定で保護ビューで開き、マクロをブロックします。

Q4: CSV ファイルは XLSX および XLSM ファイルより安全ですか?

CSV ファイルはネイティブな VBA マクロを含むことはできませんが、開く際に Excel が実行する悪意のあるコマンドが含まれている場合、数式インジェクション攻撃に対して脆弱なままです。

Q5: 現代の Office Scripts は従来の VBA マクロとどのように異なりますか?

Office Scripts はサンドボックス化されたランタイム環境内で TypeScript 上で実行され、ローカルファイルシステムやコマンドライン、OS の API へのアクセスを防止します。

関連項目