【テクニカル・上級編】 MACアドレスフラッディング攻撃とスイッチの挙動 – ネットワーク基礎とWebセキュリティ実践ガイド

レイヤー2の暗黒面:MACアドレスフラッディングと「ハブ化」がもたらすパケットの悲劇

ネットワークエンジニアとして数々の現場を渡り歩いてきた私だが、今でも背筋が凍る瞬間がある。それは、どれほど堅牢なアプリケーション層のファイアウォールを築き上げようとも、レイヤー2(データリンク層)の足元をすくわれた瞬間、すべてが砂上の楼閣と化す現実を知っているからだ。

現代のエンタープライズネットワークにおいて、スイッチは単なる「ポートを束ねる箱」ではない。それは各ポートに接続されたNICのMACアドレスを学習し、ASIC(Application-Specific Integrated Circuit)の超高速処理によって宛先ポートへピンポイントでフレームを転送する、洗練されたフォワーディングの要である。

しかし、この「学習と転送」というモダンな仕組みの根底には、設計思想の古き良き性善説が横たわっている。今回は、その脆弱性の核心である MACアドレスフラッディング攻撃 と、それが引き起こす「ハブ化(フェイルオープン)」のメカニズムを、パケットレベルの挙動からLinuxカーネルの挙動、そして実践的な防御策に至るまで徹底的に解剖しよう。

—

1. スイッチの脳髄:CAMテーブルとパケットフォワーディングの裏側

まずは、L2スイッチが内部でどのように世界を認識しているかをおさらいしておこう。スイッチの心臓部には、CAM(Content-Addressable Memory)テーブル、あるいは単にMACアドレステーブルと呼ばれる超高速なハードウェアキャッシュが存在する。

通常、ホストAからホストBへイーサネットフレームが送信されると、スイッチは以下のステップを踏む。

1. 学習(Learning): 受信ポートに紐づく送信元MACアドレス(SA)をCAMテーブルに登録する。
2. ルックアップ(Lookup): フレームの宛先MACアドレス(DA)がCAMテーブルに存在するか検索する。
3. フォワーディング(Forwarding / Filtering):

  • 存在すれば、該当するポートにのみフレームを転送する(ユニキャスト)。
  • 存在しなければ、受信ポート以外のすべてのポートへフレームをばら撒く(フラッディング / Unknown Unicast Flooding)。

この仕組みがあるおかげで、スイッチドネットワークはコリジョンドメインを分割し、無駄なトラフィックの氾濫を防ぎながら、全二重による高速な通信を実現している。しかし、この「未知の宛先は全ポートにばら撒く」というフォールバック仕様こそが、攻撃者にとって格好のターゲットとなるのだ。

—

2. MACアドレスフラッディングのパケットレベル挙動と「ハブ化」の悪夢

MACアドレスフラッディング攻撃の本質は極めてシンプルだ。「スイッチのCAMテーブルを偽装MACアドレスの洪水で満杯にし、正常なエントリを追い出すこと」に尽きる。

攻撃者は、例えばPythonのScapyライブラリや専用ツール(macofなど)を用いて、1秒間に数万というランダムなソースMACアドレスを持つイーサネットフレームをスイッチへ送りつける。

# 概念実証:Scapyを用いたMACアドレスフラッディングのシミュレーション
from scapy.all import *
import random

def flooding_attack():
    target_interface = "eth0"
    print("[*] MACアドレスフラッディング攻撃を開始します...")
    
    while True:
        # ランダムなソースMACアドレスを生成
        fake_mac = "02:%02x:%02x:%02x:%02x:%02x" % (
            random.randint(0, 255),
            random.randint(0, 255),
            random.randint(0, 255),
            random.randint(0, 255),
            random.randint(0, 255)
        )
        
        # ブロードキャストまたはランダムな宛先を持つイーサネットフレームを構築
        pkt = Ether(src=fake_mac, dst="ff:ff:ff:ff:ff:ff") / IP(dst="192.168.1.255") / ICMP()
        
        # ワイヤ上にフレームを射出
        sendp(pkt, iface=target_interface, verbose=False)

if __name__ == "__main__":
    flooding_attack()

キャパシティの限界と「フェイルオープン」

スイッチのCAMテーブルのエントリ数には物理的なハードウェア制限がある(安価なL2スイッチであれば数千件、企業向けでも数万〜数十万件)。攻撃によってこの容量が限界を迎えると、スイッチのASICは新しいMACアドレスを学習できなくなる。

ここで発生するのが、インフラの世界で「ハブ化」と呼ばれる現象だ。
CAMテーブルに空きがない状態(テーブルオーバーフロー)に陥ったスイッチは、新しく到着した正当なユニキャストフレームの宛先MACアドレスをテーブル内で見つけることができない。

セキュリティや可用性を維持するためのフェイルセーフ設計として、スイッチはこれらのフレームをドロップするのではなく、受信ポートを除くすべてのポートへブロードキャスト(フラッディング)してしまう。つまり、インテリジェントなスイッチが、ただの「バカな物理ハブ」に成り下がる瞬間である。

—

3. パッシブ盗聴からアクティブ攻撃への昇華

ハブ化したネットワーク上で何が起こるか。想像に難くないだろう。
かつてはスイッチのポートという境界によって守られていた(ように見えていた)ユニキャストパケットが、同じVLAN(あるいは同一ブロードキャストドメイン)に接続されたすべての端末のNICに到達するようになる。

ここで攻撃者がプロミスキャスモード(混信モード)を有効にしたインターフェースでパケットをキャプチャしていれば、以下のような機密データが丸見えになる。

  • レガシーなプロトコル(Telnet、HTTP、FTPなど)の平文クレデンシャル
  • 暗号化されていないセッションCookie
  • 内部ネットワークを流れるデータベースのクエリやAPIリクエスト

さらに恐ろしいのは、これがパッシブ(受動的)な盗聴にとどまらず、あらゆる中間者攻撃(MitM)の踏み台になる点だ。ARPスプーフィングを併用せずとも、トラフィックが全ポートに流れるため、DNSスプーフィングやセッションハイジャックの成功率が跳ね上がる。

—

4. トランスポート層・アプリケーション層への波及とセキュリティのジレンマ

「現代のWebトラフィックのほとんどはTLSで暗号化されているから、L2で盗聴されても中身は見えない」――そう高を括っているテックリードやインフラエンジニアがいたら、今すぐその認識を改めたほうがいい。

確かにTLS 1.3が主流となった現在、パケットキャプチャによってアプリケーション層のペイロード(HTTPボディなど)を直接解読することは困難を極める。しかし、MACアドレスフラッディングとハブ化がもたらす脅威は、暗号化の壁を別の角度から迂回する。

1. トラフィック分析(Traffic Analysis)とメタデータの漏洩:
TLSはペイロードを暗号化するが、IPヘッダーやTCPヘッダー、そしてSNI(Server Name Indication)は初期のハンドシェイクにおいて平文で流れる(Encrypted Client Hello / ECHの普及途上である現在、SNIは依然として多くの環境で丸見えだ)。どの社内端末がどの外部SaaSや機密サーバーと通信しているかというメタデータが完全に露出する。
2. 暗号化プロトコルに対するダウングレード攻撃やセッション乗取り:
ネットワークがハブ化している環境では、攻撃者は悪意あるルーターやプロキシとして振る舞いやすくなる。ARP/DNSの偽装と組み合わせることで、強固なTLS通信の確立そのものを妨害し、平文通信へのフォールバックを強要する余地(SSL strippingなど)を生む。

—

5. 鉄壁の防御策:モダンネットワークにおけるL2セキュリティの実装

この古典的かつ破壊的な攻撃に対して、現代のネットワークOSやスイッチは強力な対抗手段を用意している。単に「物理的なアクセスを厳重にする」という物理セキュリティの域を超え、スイッチのASICレベルで不正を検知・排除する設定が不可欠だ。

1. ポートセキュリティ(Port Security)の徹底

最も基本かつ強力な防御策は、各アクセスポートに学習できるMACアドレスの最大数を制限することである。これにより、単一のポートから何千もの偽装MACアドレスが流し込まれるのを物理的(論理的)に阻止できる。

Cisco Catalyst / IOS環境における基本的なコンフィギュレーション例を見てみよう。

# 対象のアクセスポートインターフェースコンフィギュレーション
interface GigabitEthernet0/1
 description ユーザー端末接続用ポート
 switchport mode access
 switchport port-security
 
 # 学習するMACアドレスの最大数を「2」に制限(IP電話とPCの接続を想定)
 switchport port-security maximum 2
 
 # MACアドレスの学習方式をスタティック(自動スティッキー)に設定
 switchport port-security mac-address sticky
 
 # 違反検知時のアクションを「シャットダウン(ポートをエラー無効化)」に設定
 switchport port-security violation shutdown

logging synchronous

この設定を行っておくことで、もし攻撃者がフラッディングを試みようと単一ポートから大量の異なるMACアドレスを送り込んだ瞬間、スイッチは即座にそのポートを err-disabled 状態にし、ネットワーク全体の崩壊を未然に防ぐ。

2. ダイナミックARPインスペクション(DAI)とIPソースガードの併用

MACアドレスフラッディングそのものを防ぐポートセキュリティに加え、ハブ化や偽装に便乗したARPスプーフィングを防ぐためには、DHCPスヌーピング(DHCP Snooping)とダイナミックARPインスペクション(DAI)の連携が必須となる。

# DHCPスヌーピングの有効化(信頼済みポートの定義)
ip dhcp snooping
ip dhcp snooping vlan 10
!
interface GigabitEthernet0/24
 description アップリンク(信頼済みDHCPサーバー接続)
 ip dhcp snooping trust
!
# ダイナミックARPインスペクションの有効化
ip arp inspection vlan 10

これらの機能を組み合わせることで、CAMテーブルが万が一圧迫されたとしても、不正なIP-MACバインドを持つパケットや、正当性の裏付けがないフレームをレイヤー2の段階で容赦なくドロップさせることができる。

—

6. おわりに:ゼロトラストの起点としてのレイヤー2

「境界防御は死んだ」と言われて久しい。ゼロトラストアーキテクチャの文脈では、社内ネットワークであっても信頼せず、すべての通信を検証することが鉄則とされている。

しかし、そのゼロトラストの基盤を支える「足元」であるレイヤー2が脆弱であれば、どれほど強固なIDaaSやマイクロセグメンテーションを導入しても、物理的あるいはローカルな侵入者によってネットワークの根幹(可用性や完全性)を揺るがされかねない。

MACアドレスフラッディングとハブ化という、一見すると枯れた技術的課題は、今なおネットワークの信頼性を脅かす隠れた牙である。パケットがスイッチのASICを通過するコンマ数秒の挙動を理解し、適切なL2セキュリティのガードレールを設けること――それこそが、真にレジリエントなインフラストラクチャを構築するための第一歩なのだ。

コメント

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