2020年1月31日ARPスプーフィング攻撃は古くから存在しますが、ARPスプーフィング攻撃を想定したり対策している企業ネットワークをわたしは見たことがありません。原因のひとつは、インフラエンジニアの大多数がARPスプーフィング攻撃を理解していない事でしょう。Inspection)src-macdst-macipARPスプーフィング攻撃から防御できるか確認するカプセル化ネットワークの低レベル通信を理解するためにはカプセル化について知っておく必要がありますので、相手がデータを受け取るまでの流れをざっくりと解説します。送信データをIPヘッダーでカプセル化します(送信データはTCPやUDP、ICMPなど上位層で既にカプセル化されているものとします)。IPヘッダーには送信元IPアドレスや送信先IPアドレス、送信データのプロトコル(TCPやUDPなど)が含まれます。IPヘッダーでカプセル化したら、送信先のIPアドレスが同一ネットワークなのか否か調べます。同一ネットワークならば送信先IPアドレスに対応したMACアドレスを調べ、そうでなければ経路情報から転送先のIPアドレスを選択して、その転送先のIPアドレスに対応したMACアドレスを調べます。イーサネットヘッダーでカプセル化して送信します。データ受信データを受信する側はイーサネットヘッダーでカプセル化されたフレームから送信先MACアドレスを調べて自分宛か確認します。デバイスがプロミスキャスモードに設定されていなければ自分宛でないフレームを破棄します。送信先MACアドレスが自分のものであれば、イーサネットヘッダーを取り除いて次のレイヤー(ネットワーク層)に処理を委ねます。ネットワーク層はIPヘッダーの送信先IPアドレスが自分のものであるか確認します。自分のものであればIPヘッダーを取り除きます。※ルーティングが有効であれば経路情報から転送先を検索・転送処理をおこないますIPヘッダーにはカプセル化したプロトコル情報が含まれていますので、データをTCPやUDPなど適切なプロトコル処理に委ねます。すべての処理の概要をまとめると次のようになります。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スプーフィングの仕組みも理解できるはずです。カプセル化の章の図を改めて見てみます。受信する側はIPアドレスをどのタイミングで確認しているでしょう。イーサネットヘッダーのカプセル化を解除した後ですね。この通り、送信先IPアドレスが何であれ実際の通信はMACアドレスで行われます。IPアドレスはIPネットワークで送信先へ転送するための識別子にすぎません。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間の通信を横取りする事を目的とした場合、次のような流れになります。IPアドレスがノードAのARPリプライを送信この時点で、ノードA〜ノードB間の通信はすべて攻撃者Xへ向かいます。このままでは攻撃者Xのノードは自分のMACアドレス向けでない通信をすべて破棄してしまうので、転送するようにカーネルパラメータを変更するか転送プログラムを用いる必要があります。ARPスプーフィング攻撃による影響ARPスプーフィング攻撃が成功した場合、すべての通信が攻撃者のノードを経由するため、次のような影響を受けます。通信が暗号化されていない場合、盗聴が成功する事は勿論の事、メールやDNS、HTTPなどすべての通信が改ざんされる可能性があります。ARPスプーフィング攻撃を検出するARPテーブルの更新状態を監視する事により、ARPスプーフィングの検出は比較的簡単におこなうことができます。問題点は、ARPスプーフィング攻撃を検出した時点で既に攻撃が成功しているため、ログ監視をして早急に対処しない限り、ネットワークを守る術がない点です。arpwatcharpwatchはARPテーブルの上書きを検出することができるシンプルなツールです。公式サイトからダウンロードすることができます。ソースからインストールする場合は次のようにします。make単純に実行するのであれば、引数にインタフェース名を指定します。デバッグモードを使用しない限り、arpwatchはバックグラウンドで実行されます。em0実際にARPスプーフィング攻撃を仕掛けると、/var/log/messagesにMACアドレスが更新された旨が記録されます。em0arpwatchはARPテーブルの上書きを検出するのみで、ARPスプーフィング攻撃から防御する事は出来ない点に注意してください。ARPスプーフィング攻撃から防御するCiscoスイッチでの防御ARPスプーフィング攻撃を検知・防御するセキュリティ製品はいくつかありますが、スイッチで防御すると追加のハードウェアを必要とせずコスト面で有利です。企業ネットワークで多く使われているCisco社のスイッチはARPスプーフィング攻撃から防御する機能を持っています。3750を例に、ARPスプーフィング攻撃の防御設定をおこない、実際にARPスプーフィング攻撃を仕掛けて防御できることを確認します。Inspection)DAIはARPパケットを検査するセキュリティ機能です。DAIを使うと、無効なIPアドレスとMACアドレスで組み合わされたARPパケットを破棄し、有効なARPリクエストおよびARPリプライのみ中継できます。Snoopingによって構築されたデータベースに基づいてARPパケットの有効性を判断します。ACLに基づいてARPパケットの有効性を判断します。