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

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

わたしが過去にARPスプーフィング攻撃ツールを開発していた経験を活かしてARPスプーフィング攻撃の手法と防御方法について解説します。

カプセル化

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

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

データ送信の流れ

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

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

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

そしてIPネットワークでデータを送信するために更にIPヘッダーでカプセル化します。

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

IPヘッダーには送信元IPアドレスや送信先IPアドレス、送信データのプロトコル情報(TCPやUDP、ICMPなど)が含まれています。

次に送信先の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スプーフィング攻撃のパターン

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

受動的な攻撃

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

能動的な攻撃

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

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

単純に実行するのであれば引数にインタフェース名を指定します。デバッグモードを使用しない限り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スプーフィング攻撃から防御できるか確認する

ARPスプーフィング攻撃ツールはわたしが昔開発したものを利用します。

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

まとめ

ARPスプーフィング攻撃は比較的簡単に実行できるものでありますが、その被害は深刻なものとなります。

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

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

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)