JPCERT/CCが公開したフィッシングURLに対するDNSフィルタリング比較

マルウェアやフィッシングサイトをブロックする機能を持った公開DNSサーバは1.1.1.1 for FamiliesやQuad9などいくつか提供されている。

Nexxwaveが各DNSフィルタリングサービスのブロック率を経年的に比較している(Public DNS malware filters to be tested in 2025)が、 調査対象ドメインがCERT PolandとURLhausから入手したものであり、欧州のものが多く日本で不正使用されたドメインが調査対象に少ない点が日本で使用する際に問題である。

そこで、JPCERT/CCが収集したフィッシングサイトのURL(Phishing URL dataset from JPCERT/CC)を対象に調査を行った。

データの収集

JPCERT/CCが収集したフィッシングサイトURLのうち、2025年1月から2026年1月までの13ヶ月分について、URLのドメイン部分を抜き出した後、2026年3月10日時点1.1.1.1で応答があるものを対象とした。

結果として11130件のドメインが調査対象となった。

#!/bin/bash

# JPCERT/CCのフィッシングURLのCSVを結合
URLS="phishurls.txt"
: > ${URLS}
while read i; do
  curl "$i" >> ${URLS}
done <<-EOS
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202501.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202502.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202503.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202504.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202505.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202506.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202507.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202508.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202509.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202510.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202511.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2025/202512.csv
https://raw.githubusercontent.com/JPCERTCC/phishurl-list/refs/heads/main/2026/202601.csv
EOS

# ドメイン部分を抜き出して重複削除
DOMAINS1="domains_1.txt"
cat ${URLS} | cut -d',' -f2 | grep 'https://' | sed -E 's|^"?https?://([^/]+).*$|\1|g' | sort -u > ${DOMAINS1}

# 現時点で応答があるものを抜き出す
function address_resolvable() {
  DOMAIN="${1}"
  DNS_SERVER="${2:-1.1.1.1}"
  local results=$(dig @${DNS_SERVER} ${DOMAIN} A +short +time=2 +tries=1 | grep -v '^$')

  if [ -z "$results" ]; then
    return 1
  else
    return 0
  fi
}

DOMAINS2="domains_2.txt"
: > ${DOMAINS2}
cat ${DOMAINS1} | while read i; do
  echo $i
  address_resolvable $i && echo $i >> ${DOMAINS2}
done

各DNSサーバに対して評価

今回調査対象としたDNSサーバにはNexxwaveにあるもの(1.1.1.1 for Families, Quad9, ControlD Malware, UltraDNS Threat Protection, CleanBrowsing Security Filter, DNS4EU Protective resolution)に加え、 OpenDNS Family Shieldと、もしかしたら広告ブロック機能を持つサービスもそれなりにブロックしてくれるのではないかと考えAdGuard DNSを加えた。

Gemini君に以下のシェルスクリプトを作ってもらい、./check_dns_server.sh domains_2.txt 1.1.1.2などとして調査した。

#!/bin/bash
LIST="$1"
DNS="${2:-1.1.1.1}"

function check_blocked() {
	DOMAIN="${1}"
	DNS_SERVER="${2}"
	local results=$(dig @${DNS_SERVER} ${DOMAIN} A +short +time=2 +tries=1 | grep -v '^$')

	local is_blocked=true
	local found_any_ip=false

	if [ -z "$results" ]; then
		# そもそもレコードが存在しない、あるいはNXDOMAINの場合
		is_blocked=true
	else
		# 返ってきた各行(IPまたはCNAME)をチェック
		while read -r line; do
			# IPアドレスの形式(数字とドット)かチェック
			if [[ $line =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
				found_any_ip=true
				# 0.0.0.0 または 127.0.0.1 でなければ「ブロックされていない」と判断
				if [[ "$line" != "0.0.0.0" && "$line" != "127.0.0.1" && "$line" != "156.154.112.16" && "$line" != "51.15.69.11" && "$line" != "146.112.61.108" && "$line" != "94.140.14.33" ]]; then
					is_blocked=false
					break
				fi
			fi
		done <<< "$results"
	fi

	# 最終判定の出力
	if [ "$found_any_ip" = true ] && [ "$is_blocked" = false ]; then
		#echo "[PASS] $DOMAIN はブロックされていません。 (Result: $(echo $results | tr '\n' ' '))"
		return 0
	else
		#echo "[BLOCK] $DOMAIN はブロックされています。"
		return 1
	fi
}

if [ -z "$LIST" ]; then
    echo "Usage: $0 <domain list> <dns server>"
    exit 1
fi

TOTAL=$(wc -l < $LIST)
BLOCKED_COUNT=0

while read -r domain; do
    check_blocked "$domain" "$DNS"
    if [ $? -eq 1 ]; then
        ((BLOCKED_COUNT++))
    fi
done < "$LIST"

echo "--- 調査結果 ${DNS} ---"
echo "総ドメイン数: $TOTAL"
echo "ブロック数: $BLOCKED_COUNT"
echo "ブロック率: $(echo "scale=2; $BLOCKED_COUNT * 100 / $TOTAL" | bc)%"

結果

サービス名 DNS Server ブロック数 ブロック率
1.1.1.1 for Families 1.1.1.2 2910 26.1%
Quad9 9.9.9.9 897 8.1%
ControlD Malware 76.76.2.1 4291 38.6%
UltraDNS Threat Protection 156.154.70.2 513 4.6%
CleanBrowsing Security Filter 185.228.168.9 1868 16.8%
DNS4EU Protective resolution 86.54.11.1 8820 79.2%
Open DNS Family Shield 208.67.222.123 3355 30.1%
AdGuard DNS 94.140.14.14 10699 96.1%

このJPCERT/CCのドメインのブロック率を、Nexxwaveの調査結果(2025年6月)と比較したグラフが下図。

結論

意外なことに、AdGuardが最もブロック率が高い結果(96.1%)となり、ついでDNS4EU(79.2%)、ControlD(38.6%)という順序となった。

欧州中心のデータ(Nexxwaveの調査結果)と比較すると、やはりどのサービスもブロック率が低下する傾向にあり、DNS4EUはJPCERT/CCのデータに対しても8割近いブロック率を示したものの、 3割程度の中位グループ(1.1.1.1 for Families、ControlD、OpenDNS)、1割程度の下位グループ(Quad9、UltraDNS、CleanBrowsing)に分かれる結果となった。

ただし、今回検証に使用したJPCERT/CCのデータはフィッシングに使われたURLであって、その他マルウェア配布に使われたドメインなどは含まれていない点には注意。