Trends

ボットの進化 2026年版:AIエージェントとヘッドレスブラウザの全貌

· 3 min read

Impervaの2025年Bad Botレポートによれば、インターネットトラフィック全体の51%が自動化されたものであり、そのうち悪意あるボットが37%を占めています。この割合は年々上昇し続けています。しかし、ほとんどのサイト管理者が見落としているポイントがあります。今日コンタクトフォームに到達しているボットは、5年前のボットとはまったく異なるものです。本物のブラウザを実行し、マウスを動かし、中にはユーザーよりも正確にCAPTCHAを読み取るものさえあります。

画像パズル型CAPTCHAや基本的なハニーポットフィールドに頼ってWordPressフォームを保護しているなら、それは過去の脅威に対する防御です。この記事では、3世代にわたるスパムボットの種類を分類し、ヘッドレスChrome検知が実際にどう機能するか(そしてなぜ失敗し続けるのか)を解説し、現実的な防御フレームワークを提示します。


問題の本質:防御策は別の敵に対して設計されたもの

ほとんどのスパム対策技術は2005年から2015年の間に開発されました。隠しフォームフィールド、「ロボットではありません」チェックボックス、スライダーを動かすパズル。これらのツールは1つの前提に基づいていました。ボットはブラウザを操作できない、という前提です。

その前提は崩壊しました。

現代のボットはHTMLをパースするだけではありません。レンダリングするのです。JavaScriptを実行し、CSSを読み込み、DOMイベントを発火させ、投げかけられるあらゆる素朴な「ブラウザかどうか」チェックをパスします。その一方で、これらのボットの運用コストはほぼゼロにまで下がりました。1人の攻撃者が月額5ドルのVPSで数千のヘッドレスChromeインスタンスを立ち上げられます。

結果はどうなるでしょうか。無防備なContact Form 7をインストールした一般的なWordPressサイトは、1日あたり50〜500件のスパム送信を受けます。アクセスの多いサイトでは数千件に上ります。


スパムボットの種類:進化の歴史

現在の防御策がなぜ機能しないのかを理解するには、実際に何と戦っているのかを知る必要があります。スパムボットは3つの明確な世代を経ており、各世代は前の世代よりも検知が困難です。

第1世代:HTTPリクエストボット(2000年代)

最初のスパムボットは単純なスクリプトでした。Perl、Python、あるいは生のシェルコマンドで書かれ、POSTリクエストを直接フォームのエンドポイントに送信しました。ブラウザは一切関与しません。

# 第1世代ボットの全体像
curl -X POST https://example.com/wp-json/contact-form-7/v1/contact-forms/123/feedback 
  -d "your-name=BuyViagra&your-email=spam@example.com&your-message=Visit+our+site"

動作の仕組み:
– HTMLからフォームのaction URLをスクレイピング
– フォームデータを含む生のHTTP POSTリクエストを送信
– JavaScriptの実行なし、CSSのレンダリングなし、Cookieの処理なし

対策方法:
– 隠しハニーポットフィールド(ボットはすべてのフィールドに入力するが、人間には隠しフィールドが見えない)
– CSRFトークン / WordPressのnonce
– 基本的なJavaScriptチャレンジ(「送信前にJSでこの隠しフィールドの値を設定する」)

これらのボットは粗雑でしたが、大規模に展開すると効果的でした。1つのスクリプトで1時間に数万のサイトに送信可能でした。幸いなことに、フィンガープリントの取得とブロックは容易でした。

第2世代:ヘッドレスブラウザボット(2017年〜現在)

そして、Puppeteerが登場しました。

Googleは2017年、Chromeをプログラム的に制御するためのNode.jsライブラリとしてPuppeteerを公開しました。自動テスト、スクリーンショットの生成、PDFのレンダリングなど、正当な目的のために開発されたものです。攻撃者は即座にこれを採用しました。

ヘッドレスブラウザボットはcurlスクリプトとは根本的に異なります。実際のChromiumインスタンスを実行します。ページを読み込み、JavaScriptを実行し、CSSをレンダリングし、人間の訪問者とまったく同じようにDOMと対話します。

// Puppeteerを使った第2世代ボット
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: 'new' });
  const page = await browser.newPage();
  await page.goto('https://example.com/contact');

  // 人間のようにキーストローク間に遅延を入れて入力
  await page.type('#your-name', 'John Smith', { delay: 80 });
  await page.type('#your-email', 'john@example.com', { delay: 90 });
  await page.type('#your-message', 'I would like to discuss...', { delay: 70 });

  await page.click('input[type="submit"]');
  await browser.close();
})();

何が変わったのか:
– ボットがJavaScriptを実行するため、JSベースのチャレンジは無意味に
– ボットがCSSをレンダリングするため、display:noneのハニーポットは検知されスキップされる
– ボットはCookie、セッション、リダイレクトをネイティブに処理
– User-Agent文字列は本物のChromeと区別不能

ヘッドレスChrome検知はWebセキュリティの一分野として成立しました。防御側は以下のような特徴的なシグナルを探しました。

シグナル 防御側の確認項目 ボットの回避方法
navigator.webdriver 自動化されたChromeではtrueに設定 --disable-blink-features=AutomationControlledでパッチ
プラグインの欠如 ヘッドレスChromeにはpluginsの配列がない page.evaluateOnNewDocument()で偽のプラグインリストを注入
Chrome DevTools Protocol window.chrome.runtimeで検出可能 プリロードスクリプトで偽装
Canvasフィンガープリント ヘッドレスではレンダリング結果が異なる puppeteer-extra-plugin-stealthなどのライブラリで出力を正規化
WebGLレンダラー ヘッドレスでは”SwiftShader”と報告 Object.defineProperty()でオーバーライド

多くの検知シグナルがパッチされました。puppeteer-extra-plugin-stealthというライブラリが、回避プロセス全体をnpm install1つで自動化しました。ヘッドレスChrome検知とステルスプラグインのいたちごっこは何年も続いており、多くの検知手法が回避されてきました。

第3世代:AIエージェントボット(2025年〜現在)

ここからが厄介な領域です。

最新世代のボットはスクリプトに従いません。推論します。ツール使用機能を持つ大規模言語モデル上に構築されたAIエージェントボットは、以下のことが可能です。

  • コンタクトフォームを読み取り、その目的を理解する
  • 文脈に合ったメッセージを生成する(「バイアグラを買おう」ではなく「ポートフォリオを拝見しました。プロジェクトについてご相談したいのですが」のような内容)
  • CAPTCHAの画像をビジョンモデルに送信して解読する
  • 送信が失敗した場合に行動を適応させる
  • 複数ステップのフォーム、ドロップダウン、条件分岐フィールドを操作する

これらは理論上の話にとどまりません。コンタクトフォームを自動的に記入する「AIを活用したアウトリーチ」を販売するサービスは、すでに商用サービスとして提供例が見られます。成功した送信ごとに課金し、CAPTCHAバイパスを機能として宣伝しています。

第3世代ボットが危険な理由:
– メッセージは人間が書いたように見える。なぜなら、LLMが実際に書いているから
– ビジョンモデルを使用して画像CAPTCHAを高い精度で解読するケースがある
– コードを更新せずにフォームの変更に適応
– AIが人間のパターンを模倣するため、従来の行動分析(マウスの動き、タイピング速度)だけでは検知が困難になりつつある


ボットの進化:概要図

graph TD
    A["Gen 1: HTTP Request Bots<br/>(curl, wget, Python scripts)<br/>2000s"] -->|"Defeated by JS challenges<br/>& honeypots"| B["Gen 2: Headless Browser Bots<br/>(Puppeteer, Playwright, Selenium)<br/>2017+"]
    B -->|"Defeated by behavioral<br/>analysis & fingerprinting"| C["Gen 3: AI Agent Bots<br/>(LLM + Browser Automation)<br/>2025+"]

    A --- D["Traits: No JS, no CSS,<br/>raw HTTP POST"]
    B --- E["Traits: Full browser engine,<br/>JS execution, stealth plugins"]
    C --- F["Traits: Contextual reasoning,<br/>CAPTCHA solving, adaptive behavior"]

    style A fill:#4a90a4,stroke:#333,color:#fff
    style B fill:#c47a2e,stroke:#333,color:#fff
    style C fill:#a94442,stroke:#333,color:#fff
    style D fill:#e8f4f8,stroke:#4a90a4
    style E fill:#fdf2e9,stroke:#c47a2e
    style F fill:#f2dede,stroke:#a94442

各世代が前の世代を置き換えたわけではありません。3つすべてが共存しています。 あなたのサイトはおそらく、すべての世代から同時に攻撃を受けています。第1世代ボットは安価で使い捨てのため依然として大量に使われていますが、第2世代と第3世代のボットが最も大きな被害をもたらします。防御をすり抜けるからです。


技術的深掘り:各防御レイヤーが失敗する理由

防御が失敗する理由を理解するには、各ボット世代が悪用する具体的なメカニズムを検証する必要があります。

CAPTCHA:大規模に解読される

画像CAPTCHA(信号機をすべて選択する、歪んだテキストを入力するなど)は、OCR技術が未発達だった時代には効果的でした。現在の状況は以下の通りです。

  • 2CaptchaやAntiCaptchaなどのCAPTCHA解読サービスは、人間のワーカーを使って1,000件あたり1〜3ドル程度でチャレンジを解読。所要時間は5〜15秒。
  • ビジョンLLMは一部の画像CAPTCHAに対して高い成功率が報告されており、条件によっては短時間での突破も確認されています。限界コストはほぼゼロに近づいています。
  • reCAPTCHA v3(不可視のスコアベースシステム)は、リアルなブラウジングセッションを維持するステルスプラグインを搭載したヘッドレスブラウザによってバイパスされる。攻撃者はフォームにアクセスする前に複数のページを閲覧してブラウザプロファイルを「ウォームアップ」する。

根本的な問題は、CAPTCHAが「これは人間か?」という問いに答えようとしていることです。視覚パズルでは、もはやその問いに答えることはできません。

ハニーポット:現代のボットには見える

古典的なハニーポット技術は、人間には見えない隠しフォームフィールドを追加するものです。送信時にそのフィールドにデータが含まれていれば、それはボットからのリクエストです。

基本的なハニーポットが第2世代以降のボットに効かない理由:

  1. CSSの解析。 ヘッドレスブラウザはCSSをレンダリングします。display:nonevisibility:hiddenのフィールドは容易に検出されます。ボットはフィールドに入力する前に、計算されたスタイルをチェックするだけです。
  2. DOMの検査。 ボットはaria-hiddentabindex="-1"、画面外のポジショニング(left: -9999px)、ゼロサイズの要素を読み取れます。これらはすべて文書化されたハニーポットパターンです。
  3. フィールド名のヒューリスティクス。 隠しフィールドの名前がhoneypothp_fieldwebsite_url(典型的なトラップ)であれば、パターンマッチングで即座に検知されます。
// 第2世代ボットがハニーポットをスキップする方法
const fields = await page.$$('input, textarea');
for (const field of fields) {
  const isVisible = await field.evaluate(el => {
    const style = window.getComputedStyle(el);
    return style.display !== 'none'
      && style.visibility !== 'hidden'
      && style.opacity !== '0'
      && el.offsetWidth > 0
      && el.offsetHeight > 0;
  });
  if (isVisible) {
    await field.type('spam content');
  }
}

10行のJavaScriptで突破できるハニーポットは、ハニーポットではありません。偽りの安心感です。

JavaScriptチャレンジ:ネイティブに実行される

「フォームの送信にJavaScriptを必須にする」という防御は、第1世代ボットに対しては合理的でした。ヘッドレスブラウザはデフォルトでJavaScriptを実行します。この防御は今やゼロ件の攻撃もブロックしない一方で、JavaScriptが無効化されている環境や低速な接続のユーザーの体験を損なうだけです。

レート制限:分散してバイパスされる

IPベースのレート制限は、単一のマシンがフォームを大量送信するのを阻止します。しかし、10,000のレジデンシャルIPアドレスを持つボットネットは阻止しません。IPv6では、単一の割り当てで2^64個の一意のアドレスが利用可能です。

レート制限は必要ですが、それだけでは不十分です。精密な脅威に対する粗い対処にすぎません。


実際に効果のある防御モデル

すべての個別技術が失敗するなら、防御は不可能なのでしょうか。いいえ。単一レイヤーの防御が不可能だということです。

2026年における効果的なボット対策には、多層・多シグナルの検証、つまり単一のチェックが決定的ではないが、組み合わせが決定的となる多層防御アプローチが必要です。

レイヤー1:計算の証明

サーバーが送信を受け付ける前に、クライアントに実際の計算作業を要求します。Proof-of-Workチャレンジ(例えば、SHA-256の部分的なハッシュ衝突を計算する)は、クライアント側で数百ミリ秒のコストがかかるだけですが、大量送信を高コストにします。10,000件のフォームを送信するボットには、10,000倍のCPU時間が必要になります。

レイヤー2:行動エントロピー

ユーザーインタラクションのランダム性とタイミングを測定します。「マウスが動いたか」だけではなく(それは容易に偽装できる)、インタラクションイベントの統計的分布を見ます。キーストロークのタイミングの分散、スクロールの加速パターン、フィールドのフォーカスイベント間の遅延。正当な人間の行動には測定可能なエントロピーがあります。スクリプト化された行動は、たとえ洗練されたものであっても、規則性に偏る傾向があります。

レイヤー3:ポリモーフィックなフォーム構造

ページの読み込みごとにフォームの内部構造を変更します。フィールド名をローテーションし、隠し要素の順序を変え、DOMツリーを変更します。昨日あなたのフォーム構造で訓練されたボットは、今日失敗するはずです。これにより、自動攻撃を経済的に成立させている「一度調べれば永久に悪用できる」モデルが崩壊します。

レイヤー4:サーバーサイドの署名検証

クライアントを信頼してはいけません。すべての送信は、サーバーサイドで生成され、フォームに埋め込まれ、送信時に検証される暗号署名を伴うべきです。ステートレスなHMACトークンは(WordPressのnonceではなく)、ページキャッシュやCDNレイヤーでも正常に機能しつつ、偽造不可能です。

レイヤー5:サイレントフェイル

ボットが検知された場合、それを通知してはいけません。偽の成功レスポンスを返します。エラーメッセージを受け取ったボットは適応します。成功したと信じたボットは次のターゲットに移ります。これは小さなディテールですが、反復攻撃に対して非常に大きな効果があります。


実践への適用

この種の多層防御をゼロから構築するのは、本格的なエンジニアリングプロジェクトです。Proof-of-Workと行動データ収集のためのクライアントサイドJavaScript、署名検証とエントロピー分析のためのサーバーサイドPHP、動的フォーム生成、サイレントフェイルの処理が必要です。これらすべてをCookieなし(GDPRコンプライアンスのため)で、目に見えるUI要素なし(ユーザー体験のため)で動作させる必要があります。

これがまさにSamurai Honeypot for Formsが解決するために作られた問題です。上述の多層防御モデル(ポリモーフィックハニーポット、クライアントサイドProof-of-Work、行動エントロピースコアリング、ステートレストークン検証、サイレントキル)を、Contact Form 7用の単一WordPressプラグインとして実装しています。設定不要。CAPTCHAなし。ユーザーへの負担なし。

各世代のボットが前世代の防御策を時代遅れにするのを見続けてきたからこそ、このプラグインが設計されました。第1世代ボットしかブロックできないプラグインは、セキュリティツールではありません。形だけの対策です。


まとめ

  1. 敵を知ること。 「スパムボット」という用語は、5行のcurlスクリプトから自律型AIエージェントまですべてを含みます。防御はスパムボットの種類の全範囲に対応する必要があります。
  2. CAPTCHAの価値は低下している。 ビジョンモデルと解読サービスにより、画像パズルの信頼性は低下しています。reCAPTCHA v3のスコアもブラウザプロファイルのウォームアップで操作されるケースがあります。
  3. ヘッドレスChrome検知は負け戦の軍拡競争。 puppeteer-extra-plugin-stealthライブラリは既知の多くの検知シグナルに対応しています。新しいシグナルも比較的短期間でパッチされる傾向があります。
  4. AIエージェントボットが新たな基本脅威。 人間品質のコンテンツを生成し、視覚的チャレンジを解読し、フォームの変更に適応します。それを前提に計画してください。
  5. 多層防御が唯一の有効な戦略。 単一の技術では効果がありません。Proof-of-Work、行動分析、ポリモーフィックなフォーム構造、暗号検証、サイレントフェイルを組み合わせてください。

ボットは進化し続けます。防御はそれ以上の速度で進化する必要があります。

すべてのコラム