【実務・中級編】 ネイティブVLAN二重タギング攻撃(VLAN Hopping)の脅威と対策 – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

こんにちは。ネットワークの深淵を愛するインフラアーキテクトの私です。

これまで数々の現場で、設計書の綺麗ごとでは到底太刀打ちできない、生々しいトラフィックの嵐や巧妙なセキュリティインシデントと対峙してきました。教科書通りの綺麗な構成が、一瞬の気の緩みやプロトコルの「仕様の隙間」によっていかに簡単に崩壊するか、私たちは骨身にしみて知っています。

さて、Web APIの設計やモダンなクラウドインフラの構築に日々奔走しているエンジニアの皆さん、「L2スイッチのセキュリティなんて、Ciscoならデフォルトでよしなにやってくれるんでしょ?」なんて油断していませんか?

今回は、そんなエンジニアの足元をすくう、古くて新しい脅威「ネイティブVLAN二重タギング攻撃(VLAN Hopping)」の深層に迫ります。パケットがスイッチのASIC(Application Specific Integrated Circuit)をどう駆け抜け、なぜセキュリティの壁をいとも簡単にすり抜けてしまうのか。そのメカニズムから現場直結の対策まで、徹底的に紐解いていきましょう。

—

1. VLAN Hoppingの基本概念と「二重タギング」のメカニズム

そもそもVLAN(Virtual LAN)は、物理的なスイッチのポートを仮想的に分割し、レイヤー2のブロードキャストドメインを分離することでセキュリティと効率性を担保する、現代ネットワークの基盤技術です。IEEE 802.1Q規格により、Ethernetフレームに4バイトの「VLANタグ」を挿入することで、どのVLANに属するトラフィックかを識別しています。

通常、異なるVLAN間で通信を行うには、ルーターやL3スイッチといったレイヤー3デバイスを介してルーティングを行う必要があります。「VLAN間ルーティングを通らなければ、異なるVLANのホストとは通信できない」――これはインフラエンジニアにとっての絶対の真理のはずでした。

しかし、この前提を根底から覆すのがVLAN Hoppingです。その手口の一つである「ネイティブVLAN二重タギング攻撃」は、スイッチの設計上の仕様(あるいは設定の不備)の隙を突き、L3デバイスをバイパスして別のVLANへ直接パケットを送り届けてしまいます。

ネイティブVLAN(Native VLAN)の仕様の罠

ここで鍵となるのがネイティブVLANの存在です。トランクポート(複数のVLANパケットを中継するポート)において、トランクを通過する特定のVLAN(通常はVLAN 1)のパケットには、あえて802.1Qタグを「付与せずに」送信するという仕様がトランクプロトコル(IEEE 802.1Q)には存在します。これは、タグを解釈できない古い機器やハブとの下位互換性を保つための苦肉の策でした。

攻撃者は、この「ネイティブVLANのパケットはタグなしで流れる」という仕様をハッキングの踏み台にします。

—

2. 通信フロー(シーケンス)で見る攻撃の全貌

では、攻撃者がどのようにして二重タギングを行い、ターゲットのVLANへ侵入するのか、そのパケットの旅路をシーケンスとして追ってみましょう。

前提条件として、攻撃者はスイッチのアクセスポート(VLAN Xに所属)に接続しており、スイッチ間の接続にはトランクポートが使われており、そのネイティブVLANが攻撃者の属する「VLAN X」に設定されているとします。そして、攻撃者が侵入したい標的のターゲットは「VLAN Y」に存在します。

[攻撃者端末 (VLAN X)]
       │
       │ 1. [外側タグ: VLAN X] + [内側タグ: VLAN Y] を付与した不正フレームを送信
       ▼
[アクセスポート (VLAN X)]
       │
       │ 2. スイッチが外側のタグ(VLAN X)を「これはネイティブVLAN宛てだ」と誤認して剥がす
       ▼
[トランクポート (ネイティブVLAN = VLAN X)]
       │
       │ 3. 内側のタグ(VLAN Y)だけが残った状態で対向スイッチへ転送される!
       ▼
[対向スイッチ / ターゲット側トランク]
       │
       │ 4. 残されたタグ(VLAN Y)を見て、ターゲットのVLAN Yへパケットを配送
       ▼
[VLAN Y の被害ホスト]

パケットの構造変化(カプセル化の魔術)

攻撃者のPCから送り出されたイーサネットフレームの中身を覗いてみると、その巧妙さがよく分かります。

通常、802.1Qタグはイーサネットヘッダーの送信元/宛先MACアドレスの直後に挿入されます(EtherType 0x8100)。攻撃者は、ここに2枚のタグを直列に挟み込みます。

1. 外側のタグ(Outer Tag): 攻撃者が現在所属しているネイティブVLAN(例: VLAN 10)のID
2. 内側のタグ(Inner Tag): 攻撃者が本当にアクセスしたい目的のVLAN(例: VLAN 20)のID

最初のスイッチ(アクセスポート)に入った瞬間、スイッチは「お、このフレームには自ポートと同じVLAN 10のタグがついているな。トランクポートへ送るときはネイティブVLANだから、このタグは剥がして(ストリップして)外に出そう」と判断します。

ここで外側のタグ(VLAN 10)がきれいに剥ぎ取られます。しかし、フレームの奥深くには、攻撃者が仕込んだ内側のタグ(VLAN 20)がそのまま残されているのです。

結果として、トランクリンクを流れるパケットには「VLAN 20」のタグだけが残り、対向のスイッチに到達した際、「お、VLAN 20のパケットだな」と誤認され、ターゲットのVLAN 20へと転送されてしまう――これが二重タギングの悪夢のようなカラクリです。

—

3. 実務で直面するリスクと限界

この攻撃、理論的には非常にエレガントですが、現実のネットワークにおいて無条件に成功するわけではありません。いくつかの厳しい制約(限界)が存在します。

  • 片方向通信の罠:

この攻撃によって送り出されたパケットは、ターゲットのVLANに届き、サーバー等のサービスをヒットさせることができます。しかし、ターゲットからの返信パケット(レスポンス)は、通常のルーティングルールに従うため、攻撃者のVLANへは戻りません。そのため、インタラクティブなセッションを確立する攻撃というよりは、VLAN内のホストに対するDoS攻撃(サービス妨害)や、ログに残らない不正なUDPパケットの送信、あるいはファイアウォールをバイパスした内部スキャンなどに悪用されます。

  • 前提条件の厳しさ:

スイッチ間のリンクがトランクであり、かつネイティブVLANがエンドユーザーの接続するアクセスポートと同じVLANに割り当てられているという、「設計のアンチパターン」が放置されている環境でしか成立しません。逆に言えば、まともにセキュアな設計がされている現場では、この攻撃の成功率は極めて低くなります。

—

4. 堅牢なインフラを構築するための対策と設定例

「設計のアンチパターン」と申し上げましたが、悲しいかな、レガシーなシステムや初期構築時のデフォルト設定をそのまま引き継いだインフラでは、この脆弱性が眠っているケースが後を絶ちません。

ここからは、シニアエンジニアとして後輩に必ず叩き込むべき、具体的な対策とCisco IOSにおける設定例をコードブロック形式で解説します。

対策1: ネイティブVLANをダミーの未使用VLANに変更する

デフォルトのネイティブVLAN(VLAN 1)をそのままにしておくことが最大の罪です。ネイティブVLANには、どのユーザーポートも所属していない、完全に隔離された「ブラックホール用VLAN(例: VLAN 999)」を割り当て、データトラフィックが流れないようにします。

! すべてのトランクポートでネイティブVLANをデフォルト(VLAN 1)から隔離用VLANに変更する
interface GigabitEthernet0/1
 description 接続先: 対向スイッチ間トランクリンク
 switchport trunk encapsulation dot1q
 switchport mode trunk
 switchport trunk native vlan 999

対策2: トランクポートでのネイティブVLANタギングの強制(Cisco限定機能など)

現代のスイッチOSでは、ネイティブVLANであっても明示的にタグを付与して送受信する機能(vlan dot1q tag native)がサポートされています。これを有効化すると、攻撃者が外側のタグを勝手に剥がそうとしても、スイッチ側がタグの欠落を検知してドロップするため、二重タギング攻撃は完全に無力化されます。

! ネイティブVLANのトラフィックにも必ず802.1Qタグを付与することを強制する
spanning-tree vlan 999 priority 4096
vlan dot1q tag native

*※注: このコマンドはトランクの両端(対向機器)で同時に有効化する必要があります。片側だけ有効にすると、タグなしパケットがドロップされてネイティブVLANの通信が完全に断絶するので注意してください。これぞ現場でやりがちな「やらかしポイント」の筆頭です。*

対策3: 不要なトランクポートの排除(DTPの無効化)

スイッチのポートを自動的にトランクにする「DTP(Dynamic Trunking Protocol)」が有効になっていると、攻撃者が細工したDTPパケットを送りつけることで、アクセスポートを強制的にトランクポートに変えてしまう「DTP攻撃(VLAN Hoppingのもう一つの手口)」に繋がります。エンドユーザーが接続するポートでは、DTPを完全に殺し、明示的にアクセスポートとして固定します。

! エンドユーザー接続用ポートの設定例
interface GigabitEthernet0/2
 description 接続先: ユーザー端末
 switchport mode access
 switchport access vlan 10
 no negotiation desirable  ! DTPを無効化し、自動トランク交渉を停止する
 spanning-tree portfast    ! ポートを即座にフォワーディング状態にする
 spanning-tree bpduguard enable ! 不正なスイッチの接続を検知してポートをシャットダウン

—

5. 検証とデバッグの現場Tips

インフラ構築やセキュリティ診断の現場で、「本当にこの対策が効いているか?」を検証したくなるのがエンジニアの性です。

実機やテスト環境で挙動を確認する際は、以下のコマンドを駆使してスイッチの内部状態を監視します。

! トランクポートの状態と、現在のネイティブVLANが正しく隔離されているか確認
Switch# show interfaces trunk

Port        Mode         Encapsulation  Status        Vlans allowed on trunk
Gi0/1       on           802.1q         trunking      1-4094

Port        Vlans allowed and active in management domain
Gi0/1       10,20,999

Port        Vlans in spanning tree forwarding state and not pruned
Gi0/1       10,20,999

! ネイティブVLANの確認
Switch# show interfaces GigabitEthernet0/1 switchport
Name: Gi0/1
Switching: Enabled
Switching Mode: Trunking
Draft Encapsulationing Trunking: 802.1q
Negotiation of Trunking: Off
Access Mode VLAN: 1 (default)
Trunking Native Mode VLAN: 999 (Enabled)  <-- ここがデフォルトの1ではなく、隔離VLANになっていることを確認

もしパケットキャプチャツール(Wireshark等)を使って検証を行う場合は、トランクポートでミラーリング(SPAN/RSPAN)を設定し、二重タギングされたフレーム(EtherType 0x8100が連続する構造)が実際にどのようにドロップされているかをFCSエラーやドロップカウンターと照らし合わせながら確認してください。

—

まとめ

ネイティブVLAN二重タギング攻撃は、プロトコルの「仕様の隙間」と「不適切な初期設定」が組み合わさったときに牙をむく、L2レイヤーの古典的かつ凶悪な脅威です。

モダンなクラウドサービスやWeb APIの裏側を支えているのは、結局のところ、こうした泥臭いレイヤー2/レイヤー3の堅実なスイッチング設計に他なりません。アプリケーション層のセキュリティにどれだけコストをかけても、足元のインフラ(ネイティブVLANやポートモード)がガバガバであれば、一網打尽にされてしまいます。

ぜひ皆さんの現場のコンフィグも、今一度見直してみてください。「VLAN 1のまま放置されているトランク」がないか、今日の退勤前に確認することをお勧めします。それでは、また次回の深淵でお会いしましょう。

コメント

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