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

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

カプセル化

ARPスプーフィングを理解するためにはネットワークを流れるデータがどのようにしてカプセル化されるのか知っておく必要があります。

しばらく退屈な解説が続きますが、大事な前提知識なので辛抱してください。

データ送信の流れ

例としてHTTPリクエストがクライアントからサーバーへ届くまでの過程を追ってみます。

WEBブラウザがWEBサーバーへリクエストを送信する際、まずはHTTPリクエスト(GET / HTTP/1.1のような文字列)をTCPヘッダーでカプセル化します。

データをTCPヘッダーでカプセル化する

次にIPヘッダーでカプセル化します。このようにHTTPリクエストとTCPヘッダーがIPヘッダーで包まれます。

IPヘッダーでカプセル化する

カプセル化が済んだら送信元のIPアドレスと送信先のIPアドレスが同一ネットワークなのか調べます。

送信先IPアドレスが同一ネットワークであれば送信先IPアドレスに対応したMACアドレスを調べます。外部ネットワークであれば経路情報から転送先のIPアドレスを選択して、その転送先のIPアドレスに対応したMACアドレスを調べます。

宛先IPアドレスが192.168.2.123だった場合、IPアドレスとMACアドレスの組み合わせは次のようになります。

宛先送信先IPアドレス送信先MACアドレス
同一ネットワークの場合192.168.2.123192.168.2.123のMAC
外部ネットワークの場合192.168.2.123転送先ノードのMAC

送信先IPアドレスが外部ネットワークの場合は送信先MACアドレスがネクストホップのMACアドレスとなる点に注意してください(重要)。送信先のMACアドレスが決まったら最後にイーサネットヘッダーでカプセル化します。これでカプセル化は完了です。

イーサネットヘッダーでカプセル化する

送信するためのカプセル化が完了したのでデータを送信します。

データ受信の流れ

データを受信する側は送信先MACアドレスが自分のMACアドレスであるか確認します。次の場合を除いて送信先MACアドレスが自分のMACアドレスでなければフレームを破棄します。

  • デバイスがプロミスキャスモードに設定されている

プロミスキャスモードとは、日本語では「無差別モード」とも呼ばれます。パケットキャプチャする際、デバイスをプロミスキャスモードに設定して自分宛でないパケットを解析する場合などに使われます。フレームを破棄しない場合はイーサネットヘッダーを取り除いて次のレイヤー(ネットワーク層)に処理を委ねます。

このようにイーサネットヘッダーを取り除きます。

イーサネットヘッダーを取り除きIPレイヤーに処理を委ねる

ネットワーク層はIPヘッダーの送信先IPアドレスが自分のものであるか確認し自分宛てでなければ破棄します。ただし、自分宛てでなくてもルーティングが有効である場合は経路情報から転送先を検索し適切な宛先に転送します。

自分宛ての通信であれば次のようにIPヘッダーを取り除いて次のレイヤー(TCPやUDP、ICMPなど)に処理を委ねます。

IPヘッダーを取り除きTCPに処理を委ねる

そして最後にTCPヘッダーを取り除いてプリケーション(httpd)へデータを渡します。

TCPヘッダーを取り除きアプリケーションにデータを渡す

おさらい

データ送受信の流れをカプセル化に視点をおいて説明しました。

ここで重要なのは「どの時点で送信先IPアドレスが自分宛であるか確認しているのか」という点です。それは「イーサネットヘッダーを取り除いた後」です。つまりイーサネットヘッダーでカプセル化されている時点ではそのフレームがIP通信レベルで自分宛なのか判断できないということです。

ARPスプーフィングはこの仕様を逆手にとって第三者宛の通信を自分自身に向けます。詳細はここから先で解説します。

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

ARPスプーフィング攻撃は攻撃対象ノードのARPテーブルを改ざんすることによって成功します。

仮にノードAがノードBへ正しいIPアドレスを設定して通信したとしても送信先MACアドレスに攻撃者Xのアドレスを設定すれば通信はすべて攻撃者Xのノードへ送信されます。

ARPスプーフィング攻撃の本質はこの1点なので、ここが理解できればほぼAPRスプーフィング攻撃を理解できています。

それでは更に理解を深めてARPスプーフィング攻撃を完璧に理解しましょう。

ARPスプーフィング攻撃のパターン

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

受動的な攻撃

受動的な攻撃は、攻撃対象のノードがARPリクエストを行った際に偽のARPリプライを送信して攻撃対象のARPテーブルを改ざんします。この攻撃方法は正規のARPリプライとタイミングを合わせなくてはならないから面倒なのと、ARPリクエストが飛んでくるまで待たなくてはならないのが難点です。

能動的な攻撃

能動的な攻撃では、攻撃者は攻撃対象へ偽のARPリクエストや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テーブルの上書きを検出することができるシンプルなツールです。公式サイトからダウンロードすることができます。

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

# tar zxf arpwatch.tar.gz
# cd arpwatch-2.1a15/
# ./configure
# make

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

# ./arpwatch -i em0

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

Jun 21 22:00:29 openbsd57 /bsd: arp info overwritten for 192.168.2.1 by de:ad:be:ef:de:03 on em0
Jun 21 22:00:30 openbsd57 /bsd: arp info overwritten for 192.168.2.1 by de:ad:be:ef:de:02 on em0
Jun 21 22:00:31 openbsd57 /bsd: arp info overwritten for 192.168.2.1 by de:ad:be:ef:de:01 on em0

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 access-list unti-arpspoof
permit ip host 192.168.2.9 mac host 001b.d387.9686
permit ip host 192.168.2.8 mac host 7884.3c00.3e19
permit ip host 192.168.2.4 mac host ac87.a303.d543

次に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で明示的に拒否させます。

ip arp inspection vlan 1
ip arp inspection validate src-mac dst-mac ip
ip arp inspection filter unti-arpspoof vlan 1 static

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

Switch#show ip arp inspection vlan 1

Source Mac Validation : Enabled
Destination Mac Validation : Enabled
IP Address Validation : Enabled

Vlan Configuration Operation ACL Match Static ACL
---- ------------- --------- --------- ----------
1 Enabled Active unti-arpspoof Yes

Vlan ACL Logging DHCP Logging
---- ----------- ------------

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

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

02:12:07: %SW_DAI-4-ACL_DENY: 1 Invalid ARPs (Req) on Fa1/0/1, vlan 1.([dead.beef.de01/192.168.2.8/001b.d387.9686/192.168.2.9/02:12:06 UTC Mon Mar 1 2004])

まとめ

内部ネットワークのセキュリティはおろそかになりがちです。FWで守られているから安心だと気を抜かず最低限の防御として通信の暗号化をしておくと良いでしょう。

その上でARPスプーフィング攻撃から防御する必要がある場合は対策のひとつとしてDAI(Dynamic ARP Inspection)のようなセキュリティ機能を考慮すると良いかと思います。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。