Technical Brief

ボット検知ロジック仕様書

AdFraud Shield の検知エンジンの完全仕様。現在稼働している 7 シグナルを、5 層構造・プロトコルレベルから行動分析まで構造的に開示します。(設計上さらに 3 つのネットワークエッジ由来シグナルをエンジンに実装していますが、現在の構成では有効化していません。下記で開示。)

最終更新: 2026-Q2

1. 設計思想

従来のボット対策ツールの多くは User-Agent と IP ブラックリストに依存しています。これらは攻撃者にとって偽装が容易で、住宅プロキシ + 改造 UA を使えば素通りされます。

AdFraud Shield は「偽装が技術的に困難」なシグナルを優先します。例えばランダム化された Canvas/WebGL レンダラは headless Chrome を露呈させます。(エンジンは TLS JA4 や TCP TTL などエッジ由来シグナルも実装していますが、これらはネットワークエッジ層を必要とし、現在の構成では有効化していません。)

本仕様書は、各シグナルが「なぜ偽装困難か」を技術的に説明します。検知の重み (weight) と閾値は競合対策のため非開示としますが、シグナル構造とロジックの「思想」は完全公開します。

2. 5 層・稼働 7 シグナル

受信したクリックは 5 層のフィルターを通過します。各層内のシグナルは独立に評価され、リスクスコアリング段階で重み付き合算されます。

完全な透明性のために開示します。これらのシグナルのうち 7 つが現在の構成で稼働しています。「エッジ依存」と記した 3 つ(TTL / TLS JA4 / HTTP/2)は、ネットワークエッジ層から得るデータを必要とし、現在の構成では有効化していません。隠さず、ありのまま開示します。

Layer 1: ネットワーク (Network)

TCP/IP パケットが偽装する難度は最も高い層。OS カーネルの実装挙動から偽装を見抜きます。

UA/OS 矛盾検出

User-Agent の主張 OS と TCP TTL から推定する OS を照合。Windows UA + TTL=64 (Linux 系) は強い不一致シグナル。

TTL ホップ解析

エッジ依存

TCP TTL の初期値 (Windows=128, Unix 系=64, Cisco=255) からホップ数を推定。ホップ数 19 以上はプロキシ経由の可能性が高い。

Layer 2: プロトコル (Protocol)

TLS と HTTP/2 のハンドシェイクは実装ごとに固定順序を持つため、強力な指紋になります。

TLS JA4 フィンガープリント

エッジ依存

ClientHello の 暗号スイート・拡張・楕円曲線順序から JA4 ハッシュを生成。Puppeteer / Selenium / curl / Go / Node.js などの既知パターンと比較。

HTTP/2 SETTINGS フレーム

エッジ依存

HTTP/2 の SETTINGS パラメータ順序や WINDOW_UPDATE のタイミングは実装ごとに異なります。Go net/http や Python httpx は Chrome と異なる順序を送るため即時識別可能です。

Layer 3: ブラウザ (Browser)

JavaScript 経由で取得するクライアント環境のフィンガープリント。

Client Fingerprint 解析

navigator.webdriver === true は確定 bot シグナル。Canvas / WebGL レンダラー文字列が SwiftShader・Mesa OffScreen・llvmpipe (ヘッドレス GPU 実装) に一致すれば bot 確定。User-Agent と navigator.platform の OS 矛盾もチェック。

Layer 4: アイデンティティ (Identity)

IP の素性 (素人がデータセンターから出てくることはない) と地理的整合性。

データセンター IP 判定

AWS/GCP/Azure/DigitalOcean/Linode/Vultr/OVH/Hetzner 等の既知クラウド CIDR レンジ (約 140 ブロック) との照合。バイナリサーチで O(log n) 判定、外部 API 依存なし。

ジオマスキング検出

ブラウザの Intl.DateTimeFormat タイムゾーンと IP の国コードを比較。データセンター IP が「東京」を主張する瞬間に矛盾を検出。言語互換性チェックで旅行者・VPN 業務利用の偽陽性を軽減。

Layer 5: 行動・インタラクション (Behavior)

ページ滞在中の振る舞い。bot は人間的に振る舞う努力をしないことが多い。

重複クリック検知 (頻度)

IP + フィンガープリント複合キーで 5 分間アクセス数を Redis でカウント。CGNAT / 企業 NAT の偽陽性を避けるため IP 単体ではなく IP+FP で判定。

行動ハニーポット

DOM に不可視のリンク・フォーム要素を埋め込み、これに触れたセッションを誤検知ゼロで bot 確定。スクレイパーは構造から拾われます。

ユーザー行動分析

滞在時間・スクロール量・タッチ/マウス操作を visibilitychange イベントで送信。即離脱 (< 1 秒) や瞬間フルスクロール (< 2 秒で 100%) を検知。

3. 動的スコアリングとクロスレイヤー多重検証 (Convergence)

各シグナルは 0-100 のスコアを返し、リスクスコアリングモジュールが重み付きで合算します。重み (weight) と各シグナルの詳細スコア表は競合対策のため非開示としますが、判定の流れは以下の通りです。

総合スコアによる判定:

  • 0-30: human (除外しない)
  • 31-70: suspicious (除外候補)
  • 71-100: bot (Google Ads 除外リストへ自動追加)

Cross-Layer Convergence

単一のシグナルが高得点でも即座に bot 確定とはしません。複数の層 (例: ネットワーク層 + プロトコル層) で独立に矛盾が検出された場合に「Convergence」として確度を上げる仕組みを採用。これにより「単一シグナルだけ偽装してすり抜け」を阻止します。

4. Human-First Safeguards (誤検知ガード)

ボット検知の宿命として、誤検知 (False Positive) をゼロにすることは不可能です。AdFraud Shield は「誤って除外された IP」を能動的に検出・是正するシステムを内蔵しています。

24 時間 cooldown

一度 Google Ads 除外リストへ追加された IP は 24 時間後に自動再評価。動的 IP の再割り当て (キャリア NAT 等) を考慮した設計です。

7 日 human/bot 比率ガード

過去 7 日間で human 判定が bot 判定を上回る IP は、たとえ瞬間的に bot スコアを記録しても除外候補から自動排除。サンプル数 5 件以上で発動。

計測方法論 (Methodology)

FP rate は「除外された IP のうち、後続 7 日で human 判定が bot 判定を上回ったもの」を分子とし、除外総数を分母として算出します。

直近 30 日 (2026-Q2) の本番運用データ: 除外 IP 総数約 1,000 件、上記 FP 定義に該当するものは 1 件未満、率にして 0.1% 未満。本数値は四半期ごとに更新します。

事例: パイロット顧客での FP guard 自動是正 (2026-04-28)

某大型 EC ブランド (パイロット顧客) で、運用初期に Google Ads 除外リスト top 500 件中 11% (55 件) の汚染 (人間優位 IP) が発生しました。導入された 7 日 human/bot 比率ガードが 24 時間以内に汚染 IP を全件特定、自動是正により 0% へ復旧。手動運用では発見困難だったケースを、システム側の能動的検出で防いだ事例です。

5. コンプライアンスとパフォーマンス

個人情報保護法 (APPI) 準拠

エンドユーザーの直接的な識別子(氏名・メールアドレス・電話番号)は収集しません。IP・User-Agent・デバイスフィンガープリント等の技術的識別子は、サイト運営者(管理者)に代わって取得し、7 日間で自動削除します。不正(bot)と判定された広告クリックの証拠記録(クリックID・匿名化済みネットワーク情報等。完全なIPアドレスは含みません)のみ、媒体への不正報告目的で最大180日保持します。

サードパーティCookie不使用

ボット検知は Cookie を一切セットせず、依存もしません。任意のコンバージョン計測を有効にした場合のみ、ファーストパーティ Cookie を1つ付与します(サードパーティ Cookie は使いません)。Apple ITP や Google プライバシーサンドボックスの影響を受けません。

パフォーマンス

JS タグは minified 約 12.5 KiB(gzip 圧縮後 約 5 KB)、async 読み込みで LCP / FCP / TTI への影響は計測誤差レベル。Lighthouse スコアの差分ほぼゼロ。

データ保持期間

raw データ (visits / verdicts) は 7 日。集計データ (daily_site_stats / daily_signal_stats) は永続。除外 IP リストは最終検出から 30 日で TTL 失効。