なぜPhishGuardを作ったのか
自分でフィッシングサイトを見分けるのは、かなり難しいです。URLの構成や長さ、含まれている文字など、さまざまな要素がサイトの怪しさに影響します。
そこで、開発者が自分のアプリやプログラムに組み込んで利用できる、URLがフィッシングサイトである可能性を分析するAPI「PhishGuard」を開発しました。
PhishGuardとは?
PhishGuardは、開発者がアプリやプログラムに組み込めるAPIです。送られたURLをさまざまなパラメータに基づいて分析し、そのURLがフィッシングURLかどうかを累積スコアと解説で出力します。
一般的なURLチェッカーは「このサイトは怪しい」とだけ表示します。しかし、PhishGuardはそのスコアがどのような理由で付けられたのかも説明します。
システム全体の構成
PhishGuardは5つの層を通過します。最初にAPIキーによる認証が行われます。そして、リクエストのレート制限を確認します。この後、URLの構成分析とタイポスクワッティングの確認があります。そして、Google Safe BrowsingやURLhausのような、ネット上のフィッシングやマルウェアURLのデータベースを使って、入力されたURLがすでに確認されているかをチェックします。
そして、累積スコアを計算し、ユーザーの検索履歴に保存して、スコアと解説を出力します。
URLはどのように分析するか
PhishGuardは、URLの長さ、さまざまな文字の頻度、エントロピー(Entropy)、エンコードされた文字、隠れているPunycodeやIDNコード、IPアドレスの有無、hostnameやpathnameに怪しいキーワードが含まれているかどうかなどの要素を分析します(これ以外にもいろいろあります)。
そして、hostnameが一般的に使われているサイトの名前と似ているかどうかも確認します(これはタイポスクワッティングの確認です)。
さらに、Google Safe BrowsingとURLhausのデータベースを使って、入力されたURLがすでに確認されているかどうかをチェックします。
各パラメータには、怪しさの強さに応じたスコアがあります。最終的なスコアは、各パラメータのスコアを組み合わせて計算されます。
複数の判定材料を組み合わせる理由
各パラメータのスコアは平等ではありません。URLにあるパラメータの中には、他のパラメータよりも怪しい可能性を大きく上げるものがあります。
フィッシングURLには、一般的に複数の判定材料があります。この理由から、複数の判定材料を組み合わせることで、URL全体の怪しさを判断できます。
開発中に直面した問題と設計上の判断
大きな問題は二つありました。一つ目は、各URLパラメータの重要性と、それに応じたスコアの割り当てです。例えば、タイポスクワッティングは、ただの長いURLより怪しい可能性があります。パラメータの重要性に応じたスコアを決めることは難しかったです。
二つ目の問題は、あるサイトの他のページが攻撃者によって侵害された場合、そのサイト全体を怪しいと判断してよいのか、ということです。
そこで、Google Safe BrowsingとURLhausを使って、サイトのどの部分が危険と確認されているかを調べるようにしました。サイトの安全な部分を入力した場合でも、そのサイトに危険なページがあることを情報として表示します。
重要なのは、その場合にはスコアが与えられないということです。つまり、開発者のための情報として表示します。サイトの一部が危険だからといって、サイト全体が危険とは限りません。
APIの使い方
最初はGET /get-keyで人間確認を行い、APIキーを取得します。それを使ってPOST /api/analyze/にURLを入力すると、結果がターミナルに表示されます。検索履歴を見たい場合は、GET /api/history/を使います。
実際に動いているAPIは、以下から確認できます。
使用した技術
Backendでは、Node.js、TypeScript、Expressを使いました。外部APIとして、Google Safe Browsing APIとURLhaus APIを使いました。人間であることの確認とAPIキーの取得には、Cloudflare Turnstileを使いました。そして、検索履歴のデータベースにはPostgreSQLを使っています。SupabaseとRenderを使って、このAPIをデプロイしました。
実際の分析例
例えば、以下の2つのURLを入力します。
{
"urls": [
"https://www.google.com",
"https://paypa1-login.xyz/verify/account"
]
}
google.comの分析結果は、スコアが0で、危険度はLowとなりました。怪しい要素も検出されていません。
{
"url": "https://www.google.com",
"score": 0,
"level": "Low",
"signals": []
}
一方、paypa1-login.xyzの分析結果では、スコアが22で、危険度はHighとなりました。
{
"url": "https://paypa1-login.xyz/verify/account",
"score": 22,
"level": "High",
"signals": [
{
"feature": "typosquatting",
"message": "Domain is similar to paypal.com (substitution, digit substitution)",
"points": 15
},
{
"feature": "suspiciousTld",
"message": "URL contains suspicious TLD",
"points": 3
},
{
"feature": "hostnameSuspiciousKeywords",
"message": "Hostname contains suspicious keywords",
"points": 3
},
{
"feature": "pathnameSuspiciousKeywords",
"message": "Pathname contains suspicious keywords",
"points": 1
}
]
}
このURLでは、paypal.comに似せたタイポスクワッティングが検出され、15ポイントが加算されています。また、怪しいTLD、hostnameやpathnameに含まれる怪しいキーワードも検出されています。
このように、PhishGuardは最終的なスコアだけではなく、どのような要素によってそのスコアになったのかも表示します。
次の記事では
次の記事では、PhishGuardがURLをどのように分析しているかを詳しく説明します。
具体的には、URLの各パラメータの分析、タイポスクワッティングやPunycode・IDNの確認、Google Safe BrowsingやURLhausを使ったレピュテーション確認について説明します。
そして、各判定材料にどのようにスコアを割り当て、最終的なスコアをどのように計算しているかについても説明します。
プロジェクト
PhishGuardのソースコードは、以下から確認できます。