ヘッドレスブラウザの検知:Playwright、Puppeteer、そしてその先へ
当社のBot Detectionエンジンは、シグナルの不整合、欠けているAPI、ボットが偽装できない行動パターンを通じて、15以上の自動化フレームワークを識別します。
ヘッドレスブラウザは、高度なウェブスクレイピング、クレデンシャルスタッフィング、不正の運用にとって好んで使われる武器です。単純なHTTPクライアントとは異なり、ヘッドレスブラウザはJavaScriptを実行し、ページをレンダリングし、現代のウェブAPIをサポートするため、検知がはるかに困難になります。当社のBot Detectionエンジンは、複数の独立した検知手法を用いて、15以上の自動化フレームワークをほぼゼロの誤検知で識別します。
ブラウザ自動化の進化
ブラウザ自動化は、単純なcurlスクリプトから長い道のりを歩んできました。Playwright、Puppeteer、Selenium WebDriverのような現代のツールは、本物のブラウザエンジン(Chromium、Firefox、WebKit)をヘッドレスモードで制御します。ヘッド付きのブラウザとまったく同じように、JavaScriptを実行し、CSSを処理し、canvas要素をレンダリングし、WebGLのクエリを扱います。これにより、単にJavaScript実行能力をチェックする検知手法には見えなくなります。
最新世代のツールはさらに進んでいます。Playwrightのステルスモードは、従来のボット検知が依存するシグナルの多くをパッチします。puppeteer-extra-plugin-stealthは、navigatorのプロパティを改変し、WebGLのベンダー文字列を上書きし、ユーザーインタラクションのイベントを偽装します。これらのアンチディテクションの手段は、ボット運用者と検知システムの間の軍拡競争を生み出してきました。
検知手法1:WebDriverフラグの解析
navigator.webdriverプロパティは、ブラウザが自動化に制御されているときにtrueに設定されます。初期の検知は、このプロパティをチェックするだけの単純なものでした。しかし現代のステルスツールはそれを削除または上書きします。当社の検知はさらに深く踏み込みます。プロパティの値だけでなく、そのプロパティ記述子、プロトタイプチェーンにおける存在、そして再定義しようとする試みがなされたかどうかをチェックします。また、WebDriverの上書きに伴うnavigator.pluginsの長さの異常など、関連するプロパティもチェックします。
検知手法2:Chrome DevTools Protocolのアーティファクト
PlaywrightとPuppeteerは、Chrome DevTools Protocol(CDP)を通じてブラウザを制御します。ステルスモードが有効なときでも、CDPはランタイムにアーティファクトを残します。特定のグローバル変数、改変されたゲッター関数、WindowとNavigatorのオブジェクト上の変更されたプロパティ記述子です。当社は、単純な上書きに耐性のある技法を用いて、これらのアーティファクトを探ります。
検知手法3:ヘッドレスブラウザのフィンガープリンティング
ヘッドレスChromeは、ヘッド付きChromeとは異なる能力の集合を持ちます。特定のブラウザプラグインを欠き、一部のCSSプロパティに対して異なるレンダリング特性を持ち、一部のMediaQueryの結果に対して異なる値を報告します。当社は既知のヘッドレスブラウザの特性のデータベースを維持し、受信するフィンガープリントをそれと照合します。
主要なヘッドレスの指標には次が含まれます。欠けているchrome.runtime(ヘッド付きChromeには存在するがヘッドレスには存在しない)、長さゼロのnavigator.plugins配列、以前のバージョンでヘッドレスモードに関連付けられていた特定のユーザーエージェントのパターン、そしてヘッドレスChromeがiframeのセキュリティコンテキストを扱う方法の差異です。
検知手法4:eval長の解析
JavaScriptエンジンによって組み込み関数の実装が異なり、これらの実装は異なる文字列表現を持ちます。Function.prototype.toString.call(eval)の長さをチェックし、各ブラウザエンジンの既知の値と比較することで、環境の偽装を検知できます。たとえば、FirefoxのふりをしているヘッドレスChromeのインスタンスです。
検知手法5:TLSクロスバリデーション
当社のTLSフィンガープリンティングの記事で論じたとおり、TLS Client Helloメッセージは、接続を行う実際のブラウザまたはHTTPライブラリを明らかにします。PlaywrightのスクリプトがChromeを制御するとき、TLSフィンガープリントはChromeに一致します。これは想定どおりです。しかし、カスタムボットがPythonのrequestsライブラリやGoのnet/httpを使うとき、どんなユーザーエージェント文字列が送られようとも、TLSフィンガープリントが偽りを明らかにします。
検知手法6:タイミングと行動の解析
本物のユーザーは、インタラクションのタイミングに自然なばらつきを示します。マウスを直線ではなく曲線で動かします。クリックする前に間を置きます。可変の速度でスクロールします。自動化ツールは、人間の行動をシミュレートするものでさえ、統計的に区別可能なパターン(一貫しすぎたタイミング、完全に線形なマウスの軌跡、不自然なスクロール速度)を生み出します。
当社は、フィンガープリンティングのプロセスそのものの間に最小限の行動シグナル(APIコールのタイミング、シグナル収集の順序、特定のブラウザAPIの応答性)を収集します。これらのマイクロ行動のシグナルは、上書き可能なプロパティではなく実際の実行環境に依存するため、自動化ツールが偽装するのは困難です。
検知手法7:パーミッションとAPIの不整合
本物のブラウザは、一貫したパーミッションの状態とAPIの可用性を持ちます。通知をサポートすると主張するのにNotificationコンストラクターを持たないブラウザ、あるいは特定の画面解像度を報告するのにwindow.screenとCSSメディアクエリから異なる値を返すブラウザは、改ざんまたはエミュレーションを示す不整合を示しています。
当社は、自動化ツールが一部のシグナルを選択的に上書きしながら、関連するすべてのAPIにわたる一貫性を維持しないときに生じる矛盾を探して、数十のこうしたクロスバリデーションのポイントをチェックします。
検知手法8:VMとエミュレーションの検知
多くのボット運用は仮想マシンやクラウドインスタンスの内部で実行されます。これだけでは自動化の証拠にはなりませんが、他の指標と組み合わさると強力なシグナルになります。当社は、VMに関連するキーワード(「llvmpipe」や「SwiftShader」など)を含むWebGLレンダラー文字列、消費者デバイスと整合しないハードウェア特性(ちょうど2つのCPUコアと2GBメモリ――一般的なVMのデフォルト)、そして既知のクラウドプロバイダーのIPレンジを通じてVMを検知します。
マルチ手法の優位性
各検知手法は個別には限界を持ちます。高度なボット運用者は任意の単一の手法を回避できるかもしれません。しかし、そのすべてにわたってクロスバリデーションの一貫性を維持しながら、すべての手法を同時に回避することは、法外に高価です。すべてのチェックを通過するボットを開発し維持するコストは、大半のボット運用の経済的価値を上回ります。
ほぼゼロの誤検知
当社の検知は、リバースDNSを通じて検証された検索エンジンのボット(Googlebot、Bingbotなど)に対するホワイトリストモデルと、その他のトラフィックに対するマルチシグナルモデルで作動します。トラフィックを自動化されたものと分類する前に、複数の裏付けとなるシグナルを要求します。この保守的なアプローチにより、誤検知率を0.1%未満に保証します。これは数十億の本番イベントにわたって検証されています。