CAMテーブルの底なし沼:MACアドレステーブルオーバーフロー攻撃と、現代L2スイッチが備えるべき「防壁」の実装
こんにちは。ネットワークの配線図とパケットキャプチャの波形を愛してやまない、シニアインフラアーキテクトの私です。
Web APIの設計やモダンなクラウドインフラの構築において、私たちはついついアプリケーション層(HTTP、JSON、gRPC)や、L7/L4のロードバランシングといった「上流」のアーキテクチャに目を奪われがちです。しかし、どれほど洗練されたAPIを設計しようとも、その基盤であるL2(データリンク層)の足元がすくわれれば、システム全体が一瞬で沈黙します。
今回は、スイッチングハブの心臓部であるCAM(Content-Addressable Memory:コンテンツ・アドレス可能メモリ)の限界を突き、L2スイッチを意図的に「ただのバカハブ」へと退化させる古典的かつ凶悪な脅威、MACアドレスフラッディング攻撃(CAMオーバーフロー攻撃)を取り上げます。
実務の現場でインフラを預かるエンジニアが、この脅威に対してどのような設定と思想をもって対峙すべきか、パケットの挙動からコンフィグレーションの実例まで徹底的に掘り下げていきましょう。
—
1. 根本原理:なぜスイッチは「バカハブ」になってしまうのか
まずは、L2スイッチが普段どのように動作しているか、その基本を思い出してください。スイッチは、各ポートに接続された端末のMACアドレスを学習し、それを高速なハードウェアメモリであるCAMテーブル(MACアドレステーブル)に記録します。
宛先MACアドレスを知っているフレームが来れば、スイッチはそのポートだけにピンポイントで転送(ユニキャスト)します。これがスイッチのスイッチたる所以であり、コリジョンドメインを分割して効率的な通信を担保する仕組みです。
MACアドレスフラッディング攻撃のメカニズム
しかし、このCAMテーブルの容量には物理的な限界があります。Catalystなどの一般的なエンタープライズ向けスイッチであっても、エントリ数には数千から数万件という上限が存在します。
攻撃者は、このハードウェアの制約を逆手に取ります。スクリプト等を用いて、数秒間に何万もの「存在しないランダムなソースMACアドレス」を持ったイーサネットフレームをスイッチのポートに向けて送りつけるのです。
[攻撃者端末]
│ (架空のMACアドレス A, B, C, D... を毎秒数万発送信)
▼
[L2 スイッチ] ─── CAMテーブルが満杯に!
│
├─ 正常なサーバーA (通信がブロードキャスト化され、盗聴可能に)
└─ 正常なクライアントB
スイッチは、受信したすべてのフレームのソースMACアドレスを「善意で」CAMテーブルに登録しようとします。結果として何が起きるでしょうか。
1. CAMテーブルの枯渇: メモリが溢れ、新しい正当なMACアドレスを学習できなくなります。
2. フェイルオープン(未知のユニキャストフラッディング): スイッチは、テーブルに存在しない宛先を持つフレームが来ると、宛先を特定できないため、受信ポート以外のすべてのポートへフラッディング(全ポート転送)せざるを得なくなります。
3. ハブ化と情報漏洩: スイッチが「レガシーなリピータハブ」と同じ動作に落ちぶれます。セグメント内を流れるすべてのトラフィック(暗号化されていない社内通信やAPIトークンなど)が、攻撃者の接続ポートに丸見え(スニッフィング)になります。
—
2. 実務で使える防壁:ポートセキュリティによる物理層の要塞化
この脅威に対する最も確実かつ標準的な対策が、Cisco IOSなどで実装されているポートセキュリティ(Port Security)機能です。
ポートセキュリティの本質は、「どのポートに、どんなMACアドレスが、いくつ繋がってよいか」を厳密にホワイトリスト化、または動的学習数にリミットをかけることです。
実務におけるCiscoスイッチの設定例
以下に、不正なMACアドレスの乱射によるCAMオーバーフローを完全に無効化するための標準的なコンフィグレーションを示します。アクセスポート(エンド端末収容ポート)におけるベストプラクティスです。
! 対象のインターフェースを指定(例:ユーザー端末が接続されるFastEthernet 0/1)
interface FastEthernet0/1
! 1. ポートのレイヤー2アクセスモードを明示的に固定
switchport mode access
! 2. ポートセキュリティを有効化
switchport port-security
! 3. 学習できる最大MACアドレス数を「1」に制限(IP電話機配下にPCがある場合は「2」等に調整)
switchport port-security maximum 1
! 4. MACアドレスの学習方式を「粘着学習(Sticky)」に設定
! 最初に通信した端末のMACアドレスを自動的にコンフィグに書き込む
switchport port-security mac-address sticky
! 5. 違反検知時のアクションを「shutdown(ポート遮断)」に設定
! 制限を超えたMACアドレスからフレームが来たら、即座にポートをErr-disabledにする
switchport port-security violation shutdown
! (おまけ)Err-disabledになったポートを一定時間後に自動復旧させたい場合(例: 300秒後)
errdisable recovery cause psecure-violation
errdisable recovery interval 300
パラメーターの深掘り:なぜ violation shutdown なのか?
ポートセキュリティの違反モードには、主に3つの選択肢があります。
protect: 制限を超えた未知のMACアドレスからのトラフィックを単に破棄(ドロップ)し、ログは出さない。restrict: トラフィックを破棄しつつ、Syslogメッセージを出力し、違反カウンターをインクリメントする。shutdown: ポートを完全にシャットダウン(Err-disabled状態)にする。
セキュリティインフラの現場において、私たちは基本的に shutdown を推奨します。protect や restrict は攻撃者の存在に気づきにくいだけでなく、スイッチのCPUに無駄なパケット処理負荷を与え続ける原因になります。物理ポートを問答無用で死なせる shutdown こが、攻撃に対する最も強烈なメッセージとなります。
—
3. 運用・監視の現場から:異常検知とトラブルシューティング
コンフィグを入れて終わり、ではありません。インフラエンジニアたるもの、現場で何が起きているかをメトリクスとログで常時観測できなければ失格です。
トラブルシューティングCLIコマンド
もし「ネットワークが突然遅くなった」「特定の端末から通信できなくなった」というアラートを受け取ったら、以下のコマンドでCAMテーブルとポートの状態を即座に確認します。
1. CAMテーブルの使用率とエントリ確認
# 現在スイッチが学習しているMACアドレスの総数と制限値を確認する
Router# show mac-address-table summary
Total MAC Addresses for this Criteria: 1245
Maximum MAC Addresses Allowed: 8192
もし Total が Maximum に張り付いている場合、まさにフラッディング攻撃を受けているか、あるいは異常な数の仮想マシンやコンテナが同一セグメントで暴走しています。
2. ポートセキュリティの違反状況の確認
# どのポートでセキュリティ違反が起きているかを詳細にチェック
Router# show port-security interface FastEthernet0/1
(出力例)
Port Security : Enabled
Port Status : Secure-shutdown <-- 違反によりシャットダウンしている状態
Violation Mode : Shutdown
Maximum MAC Addresses : 1
Total MAC Addresses : 1
Configured MAC Address : 0011.2233.4455
Last Source Address:Vlan: 9999.8888.7777:1
Security Violation Count : 1 <-- 攻撃を検知してブロックした回数
3. Err-disabledからの復旧手順
もし誤検知や正当な端末の入れ替えによってポートがシャットダウンしてしまった場合は、原因を取り除いた上で、手動でインターフェースを再起動します。
Router# configure terminal
Router(config)# interface FastEthernet0/1
Router(config-if)# shutdown
Router(config-if)# no shutdown
—
4. まとめ:強靭なL2基盤の構築に向けて
MACアドレステーブルオーバーフロー攻撃は、L2スイッチのアーキテクチャの根本的な仕様(フレーム学習の必要性)を突いた極めて古典的な攻撃です。しかし、現代のモダンなエンタープライズネットワークにおいて、このリスクを放置することは、APIのセキュリティホールを放置するのと同義の重大なインシデントリスクになります。
- すべてのアクセスポートに
switchport port-securityを適用する。 - 学習数を厳密に絞り込み、違反時は
shutdownで容赦なく切り捨てる。 - 定期的に
show port-securityやSyslogを監視し、異常兆候をキャッチする体制を作る。
この泥臭くも確実なレイヤー2のハードニング(堅牢化)こそが、その上に構築されるWebアプリケーションやAPIの安定稼働を支える、見えない最大の防壁となるのです。さあ、今すぐあなたの管理するスイッチのコンフィグを見直してみませんか?
コメント