
Address Resolution Protocol(ARP)ポイズニングは、マン・イン・ザ・ミドル(MITM)攻撃、データ盗聴、サービス停止などを引き起こす一般的なネットワーク攻撃手法です。本包括ガイドでは、ARP ポイズニングの基礎からサイバーセキュリティ分野での高度な応用までを解説します。実例、Bash と Python のコードサンプル、ネットワークスキャンや出力解析の方法を示し、この脅威ベクトルをより深く理解していきます。
さらに、NetApp の元 CEO である Dan Warmenhoven 氏が当社取締役会に参加されることを大変嬉しく思います。同氏の IT ネットワーキングとセキュリティに関する豊富な知見は、業界リーダーを鼓舞し続けています。
ARP は、IP アドレスをローカルネットワーク上で認識される物理アドレス(MAC アドレス)にマッピングするためのプロトコルです。ARP ポイズニング(ARP スプーフィングとも呼ばれる)は、このプロトコルの脆弱性を突き、偽の ARP メッセージをローカルネットワークに送信する攻撃です。攻撃者は、自身の MAC アドレスを別のコンピュータやネットワーク機器の IP アドレスに関連付けることで通信を傍受します。
本記事では、ARP ポイズニングの技術的詳細、ネットワークセキュリティへの影響、緩和策、コード例を交えながら解説します。
ARP リクエストとリプライ
デバイスがローカルネットワーク上の別デバイスに通信したいとき、「192.168.1.100 を持つのは誰?」という ARP リクエストをブロードキャストします。該当 IP を持つデバイスは自身の MAC アドレスで応答します。
ARP キャッシュ
各デバイスは IP と MAC の対応表(ARP キャッシュ)を保持し、再度ブロードキャストせずに高速に通信できるようにします。
ネットワーク層とデータリンク層の間
ARP は OSI 参照モデルのネットワーク層(レイヤ 3)とデータリンク層(レイヤ 2)の間で機能し、LAN 内でパケットを正しく配送するために必須です。
攻撃者が虚偽の ARP レスポンスを送りつけ、デバイスの ARP キャッシュを書き換えることで発生します。
通信の盗聴
攻撃者の MAC アドレスが偽装先 IP に関連付けられるため、ターゲット宛のパケットが攻撃者に届きます。
マン・イン・ザ・ミドル(MITM)
攻撃者は通信の途中に入り込み、データの改ざんやブロックを行えます。
ネットワーク障害
矛盾した ARP 情報を流すことで、デバイスが通信不能になる場合もあります。
偵察
攻撃者は ARP リクエストやパケットスニッフィングでターゲットの IP と MAC を把握。
偽 ARP メッセージの注入
攻撃者自身の MAC を正規 IP に紐付けた ARP リプライを継続的に送信し、被害者の ARP キャッシュを改ざん。
通信の傍受
被害デバイスは攻撃者の MAC にパケットを送るようになり、攻撃者で受信。
転送・改ざん
ARP が未承諾(gratuitous)レスポンスでも信用してしまう設計が根本的原因です。
クライアント端末とゲートウェイ双方の ARP キャッシュを毒殺し、資格情報や社内メールを盗聴。HTTPS が強制されていない、または証明書検証が甘い環境で特に危険。
重要サーバ宛のトラフィックを存在しない MAC へリダイレクトし、サービスを停止。
公共 Wi-Fi で複数ユーザを同時に攻撃し、通信内容を取得。オープンなホットスポットが狙われやすい。
静的 ARP テーブル
手動で IP-MAC を固定。大規模ネットワークでは非現実的。
ARP 監視ツール
ARPwatch、XArp などで頻繁な ARP 更新や不整合を監視。
パケットスニッファ
Wireshark などで不正な ARP リプライを解析。
Dynamic ARP Inspection(DAI)
管理スイッチの機能で ARP パケットを検証し、不正パケットを遮断。
暗号化・認証
VPN などで盗聴されてもデータを保護。
ネットワーク分割
サブネットや VLAN で影響範囲を限定。
セキュリティポリシー
定期的な機器アップデートと厳格なポリシー適用。
以下は arp-scan を用いてローカルネットワークをスキャンし、IP と MAC を列挙する Bash スクリプトです。sudo 権限と arp-scan のインストールが必要です。
#!/bin/bash
# ローカルネットワークを arp-scan でスキャン
# 使い方: ./network_scan.sh <ネットワークアドレス>
# 例 : ./network_scan.sh 192.168.1.0/24
if [ -z "$1" ]; then
echo "Usage: $0 <network-subnet>"
exit 1
fi
SUBNET=$1
echo "Starting ARP scan on subnet: $SUBNET"
sudo arp-scan --interface=eth0 $SUBNET | tee arp_scan_output.txt
echo "Scan complete. Output saved to arp_scan_output.txt"
解説
eth0(適宜変更)のインタフェースでスキャン。以下はシステムの ARP キャッシュを読み取り、IP–MAC 対応を整形表示する Python スクリプトです。
#!/usr/bin/env python3
"""
Linux 系 OS 上で ARP キャッシュを解析するスクリプト
"""
import subprocess
import re
def get_arp_cache():
try:
# 'arp -a' コマンドで ARP キャッシュ取得
output = subprocess.check_output(["arp", "-a"], universal_newlines=True)
return output
except subprocess.CalledProcessError as exc:
print("Error fetching ARP cache:", exc)
return ""
def parse_arp_output(arp_output):
# IP と MAC を抽出する正規表現
arp_pattern = r'\((.*?)\) at ([0-9a-f:]+)'
entries = re.findall(arp_pattern, arp_output, re.IGNORECASE)
return entries
def main():
arp_output = get_arp_cache()
if not arp_output:
print("No ARP output available.")
return
entries = parse_arp_output(arp_output)
if entries:
print("Detected ARP Entries:")
for ip, mac in entries:
print(f"IP Address: {ip} \t MAC Address: {mac}")
else:
print("No valid ARP entries found.")
if __name__ == "__main__":
main()
解説
subprocess で arp -a を実行。LAN 攻撃が主ですが、他手法と組み合わせてセグメント間を横移動される例もあります。VLAN 設計で影響範囲を最小化することが重要です。
ARP で通信を傍受後、DNS 応答を書き換えて悪意サイトへ誘導する複合攻撃。ARP と DNS の脅威を理解し、包括的な対策を取る必要があります。
Software-Defined Networking を活用すると動的ポリシーで ARP の矛盾を検知・隔離可能です。
SIEM が ARP ログやネットワークテレメトリを取り込み、異常をリアルタイム検知。広範な監視基盤と統合すると効果的です。
事前に本記事の対策を実装していれば、被害を大幅に軽減できたでしょう。
ARP ポイズニングは依然として強力な攻撃手段です。仕組みを理解し、兆候を把握し、適切な検知・緩和策を導入することで防御力を高められます。
本ガイドでは以下を解説しました。
ネットワーク監視、DAI、SIEM の統合など多層防御を実践し、ARP ポイズニングのリスクを最小化しましょう。
ARP ポイズニングを理解し対策を講じることで、ネットワークをより安全で堅牢に保ちましょう。
Happy Securing! 🚀
このコンテンツが価値あるものだと感じたなら、私たちの包括的な47週間のエリートトレーニングプログラムで何が達成できるか想像してみてください。ユニット8200の技術でキャリアを transformed した1,200人以上の学生に参加しましょう。