ARPスプーフィング攻撃の検知と防御

ARPスプーフィング攻撃は古くから存在しますが、ARPスプーフィング攻撃を想定したり対策している企業ネットワークをぼくは見たことがありません。原因のひとつは、一般的なネットワークエンジニアの多くがARPスプーフィング攻撃を理解していない事でしょう。

まずは、そもそもどうしてARPが必要なのか?そこから確認していきましょう。

スポンサーリンク
スポンサーリンク

MACアドレスとIPアドレスの関係

ネットワークは大きくデータリンク層とネットワーク層に分ける事ができます。データリンク層はイーサネットやATM、シリアルなど物理的な通信を担います。それに対してネットワーク層は経路の制御を行います。

イーサネットで構成されたネットワークを例にすると、LANカードにはMACアドレスが割り当てられていて、このMACアドレスを使ってデータリンク層はノード間の通信を行います。ネットワーク層ではOSが仮想的に持っている識別子(IPアドレス)で経路制御を行います。IPアドレスは経路制御のための識別子に過ぎないので、同一ネットワーク内か?外部ネットワークなのか?という点にしか着目しません。同一ネットワークならば直接宛先ノードと通信しますし、外部ネットワークならば転送先を経路表から選択します。

例えばノードAから同一ネットワーク内のノードBへ通信する場合、ノードAはノードBの識別子であるIPアドレスしか知りませんから、IPアドレスを指定してノードBと通信したくてもノードAは物理的にどこへ送信したら良いのか判りません。ノードBと通信するためにはノードBのMACアドレスを問い合わせる必要があります。そのMACアドレスを問い合わせる手段がARPです。

IPアドレスが単なる識別子で、実際の通信はMACアドレスを使用する、という事が理解できればARPスプーフィングの仕組みも理解できるはずです。

ARPスプーフィング攻撃の仕組み

ARPスプーフィング攻撃は、攻撃対象ノードのARPテーブルを改ざんする事によって成功します。先述した通り、通信はIPアドレスでなくMACアドレスで行われます。仮にノードAがノードBへ正しいIPアドレスを設定して通信したとしても、MACアドレスが攻撃者XのMACアドレスであれば、通信はすべて攻撃者Xのノードへ送信されます。

ところで、実際のARPスプーフィングの動きは2パターンあります。ひとつが「受動的な攻撃」、もうひとつが「能動的な攻撃」です。

受動的な攻撃

攻撃対象のノードがARPリクエストを行った際に偽のARPリプライを送信して攻撃対象のARPテーブルを改ざんします。教科書によく出てくる攻撃パターンです。ただ、正規のARPリプライとタイミングを合わせなくてはならないから面倒なのと、ARPリクエストが飛んでくるまで待たなくてはならないのが難点です。Cisco機器のようにやたらと長いARPキャッシュ時間(デフォルト4時間!)を持つものもあるので、注意が必要です。

能動的な攻撃

攻撃者は攻撃対象へ偽のARPリクエストやARPリプライを送信します。よく勘違いしている人がいるのですが、正規のARPリクエストを待たなくても、いきなり偽のARPリクエストやARPリプライを送信すれば攻撃対象のARPテーブルを改ざんできます。

ただ、偽のARPリクエストを送信すると攻撃対象はその都度ARPリプライを返してくるので、実際の攻撃では偽のARPリプライをユニキャストで送信する方が効率的です。このパターンの良いところは、攻撃者が任意のタイミングで攻撃対象のARPテーブルを改ざんできる点です(ARPキャッシュの時間切れを待たなくて良い)。たとえば1秒ごとに偽のARPリプライを送信しておけば攻撃対象はARPリクエストを送信する機会を失うので、安定してARPテーブルの改ざんを継続する事ができます。

ARPスプーフィング攻撃の流れ

攻撃者XがノードAとノードB間の通信を横取りする事を目的とした場合、次のような流れになります。

  1. ノードAとノードBのIPアドレス、MACアドレスを調べる
  2. ノードAへ送信元MACアドレスとSender MACアドレスが攻撃者Xのもので、Sender IPアドレスがノードBのARPリプライを送信
  3. 同時にノードBへ送信元MACアドレスとSender MACアドレスが攻撃者Xのもので、Sender IPアドレスがノードAのARPリプライを送信

この時点で、ノードA〜ノードB間の通信はすべて攻撃者Xへ向かいます。ただ、このままでは攻撃者Xのノードは自分のMACアドレス向けでない通信をすべて破棄してしまうので、転送するようにカーネルパラメータを変更するか転送プログラムを用いる必要があります。

ARPスプーフィング攻撃による影響

ARPスプーフィング攻撃が成功した場合、すべての通信が攻撃者のノードを経由するため、次のような影響を受けます。

  • 通信の盗聴
  • 通信の改ざん
  • 通信妨害

通信が暗号化されていない場合、盗聴が成功する事は勿論の事、メールやDNS、HTTPなどすべての通信が改ざんされる可能性があります。

ARPスプーフィング攻撃を検出する

ARPテーブルの更新状態を監視する事により、ARPスプーフィングの検出は比較的簡単におこなうことができます。問題点は、ARPスプーフィング攻撃を検出した時点で既に攻撃が成功しているため、ログ監視をして早急に対処しない限り、ネットワークを守る術がない点です。

arpwatch

arpwatchはARPテーブルの上書きを検出することができるシンプルなツールです。公式サイトからダウンロードすることができます。

ソースからインストールする場合は次のようにします。

単純に実行するのであれば、引数にインタフェース名を指定します。デバッグモードを使用しない限り、arpwatchはバックグラウンドで実行されます。

実際にARPスプーフィング攻撃を仕掛けると、/var/log/messagesにMACアドレスが更新された旨が記録されます。

arpwatchはARPテーブルの上書きを検出するのみで、ARPスプーフィング攻撃から防御する事は出来ない点に注意してください。

ARPスプーフィング攻撃から防御する

Ciscoスイッチでの防御

ARPスプーフィング攻撃を検知・防御するセキュリティ製品はいくつかありますが、スイッチで防御すると追加のハードウェアを必要とせずコスト面で有利です。企業ネットワークで多く使われているCisco社のスイッチはARPスプーフィング攻撃から防御する機能を持っています。

Catalyst 3750を例に、ARPスプーフィング攻撃の防御設定をおこない、実際にARPスプーフィング攻撃を仕掛けて防御できることを確認します。

DAI(Dynamic ARP Inspection)

DAIはARPパケットを検査するセキュリティ機能です。DAIを使うと、無効なIPアドレスとMACアドレスで組み合わされたARPパケットを破棄し、有効なARPリクエストおよびARPリプライのみ中継できます。

DHCP Snoopingが有効化されている場合、DHCP Snoopingによって構築されたデータベースに基づいてARPパケットの有効性を判断します。DHCP Snoopingが有効化されていない場合、ARP ACLに基づいてARPパケットの有効性を判断します。

今回の検証環境はDHCPを使用しない環境であるため、ARP ACLを設定します。

次に、ARP InspectionをVLAN 1で有効化します。その際、フィルタリング設定として先ほど作成したACLを指定します。検査対象の設定は、ip arp inspection validateコマンドでおこないます。検査対象はsrc-mac、dst-mac、ipを指定することができます。

src-mac

送信元MACアドレスとARPヘッダーの送信元MACアドレスが一致するか、ARPリクエスト時とARPリプライ時に検査します。

dst-mac

送信先MACアドレスとARPヘッダーのターゲットMACアドレスが一致するか、ARPリプライ時に検査します。

ip

0.0.0.0、255.255.255.255やマルチキャストアドレスなど無効なIPアドレスでないか検査します。Sender IPアドレスはARPリクエスト時とARPリプライ時に検査し、Target IPアドレスはARPリプライ時に検査します。

staticはオプションで、staticを付けるとARP ACLにヒットしないものを明示的に拒否します。staticを付けない場合はDHCPバインディングによって拒否するか決定されます。今回はDHCPバインディングを使用しないため、staticで明示的に拒否させます。

ARP Inspection設定の内容を表示し、設定内容が正しいことを確認します。

ARPスプーフィング攻撃から防御できるか確認する

Fa1/0/1に接続している攻撃者のマシンからARPスプーフィングを実行すると攻撃は失敗し、スイッチのログエントリにARPリクエストがDenyされた旨が記録されます。

まとめ

ARPスプーフィング攻撃の検知と防御を検証するためには、実際にARPスプーフィング攻撃を仕掛けてみるしかありません。検証用のプログラムは本サイトでも公開しています。次の記事を参照してください。

スポンサーリンク
スポンサーリンク