世界を動かす技術を、日本語で。

ChatGPTはCloudflareがあなたのReactステートを読み取るまで入力を許可しません

概要

  • ChatGPT利用時、Cloudflare Turnstileが 高度な指紋認証 プログラムを自動実行
  • 3層構造・55項目 の詳細な環境チェックによる 高度なボット検知
  • 暗号化ロジック は単純なXORで、 解析は容易
  • Reactアプリの完全描画 が必須条件
  • 追加の行動・PoWチェック も組み合わせた多層防御

ChatGPTにおけるCloudflare Turnstileの高度な指紋認証

  • ChatGPTの各メッセージ送信時、Cloudflare Turnstileプログラムが ブラウザ内で自動実行
  • ネットワークトラフィックの解析 で377件のTurnstileプログラムを 復号化
  • 従来のブラウザ指紋認証 を超える、 3層・55項目 の詳細なプロパティ確認
    • ブラウザ層 :GPU、画面、フォント、WebGL、ストレージ等
    • Cloudflareネットワーク層 :IP、都市、地域情報(edge headers)
    • ChatGPT Reactアプリ層 :__reactRouterContext、loaderData、clientBootstrap
  • 実ブラウザかつReact SPAの完全描画 が検証対象
    • 単なる指紋偽装やHTML取得のみのボットは 検知・排除

Turnstile暗号化ロジックの詳細

  • Turnstileプログラム本体2段階の暗号化
    • 外側:pトークンとXOR(HTTPリクエスト内で完結)
    • 内側:サーバー生成のfloat値(例:97.35)とXOR
  • 暗号キーはペイロード内に埋め込み
    • 解析すれば 容易に復号化可能
  • 復号フロー
    • prepareリクエストからp取得
    • prepareレスポンスからturnstile.dx取得
    • XORで外側復号→bytecode抽出
    • 指定float値で内側復号→本プログラム抽出
  • 暗号化の目的
    • 静的解析・リプレイ攻撃の防止
    • 指紋収集項目の秘匿
    • Cloudflare側での柔軟な仕様変更

収集されるプロパティ一覧

  • ブラウザ指紋(Layer 1)
    • WebGL情報(UNMASKED_VENDOR_WEBGL等8項目)
    • 画面情報(colorDepth, width等8項目)
    • ハードウェア情報(hardwareConcurrency等5項目)
    • フォント計測(fontFamily, getBoundingClientRect等4項目)
    • DOM操作(createElement等8項目)
    • ストレージ(localStorage等5項目)
  • Cloudflareネットワーク情報(Layer 2)
    • cfIpCity, cfIpLatitude, cfIpLongitude, cfConnectingIp, userRegion
  • Reactアプリ状態(Layer 3)
    • __reactRouterContext, loaderData, clientBootstrap

トークン生成と送信の流れ

  • 全55項目を収集後、JSON化→XOR暗号化→最終トークン化
  • OpenAI-Sentinel-Turnstile-Token として 各リクエストに付与

Sentinelの追加検知・防御機能

  • Signal Orchestrator
    • keydown, pointermove, click, scroll, paste, wheel等の 行動イベント監視
    • window._oai_so*プロパティで ユーザー行動の生体的特徴を計測
  • Proof of Work(PoW)
    • 25項目の指紋+SHA-256 hashcashによる 計算コスト付与
    • 難易度はランダム(大半は5ms以内で解決)
    • 7種のバイナリ検知フラグ(全サンプルでゼロ)

プライバシー・運用上の注意点

  • 暗号化は実質的に難読化のみ
    • XORキーは常に同一データ内に含まれるため 運用者側は全復号可能
  • ユーザーと運用者間のプライバシー境界は運用ポリシー次第
  • 目的は攻撃者・ボット対策と仕様秘匿

まとめ・実運用での意味

  • ChatGPT利用時は高度な多層的ボット検知が常時作動
  • 単純な指紋偽装・ヘッドレスブラウザでは突破困難
  • CloudflareとOpenAIによる強固なセキュリティ運用
  • ユーザー側での回避や解析は容易ではない設計

Hackerたちの意見

これらのプロパティは、ChatGPT Reactアプリケーションが完全にレンダリングされて水和されている場合にのみ存在します。HTMLを読み込むヘッドレスブラウザは、JavaScriptバンドルを実行しないので、これらは持っていません。ブラウザAPIをスタブ化するボットフレームワークも、実際にReactを実行しないので、これらは持っていません。 > これはアプリケーションレイヤーでのボット検出であって、ブラウザレイヤーではありません。すべての高度なボット検出器や広告ブロック検出器がこれをやっていると思ってたんだけど?「JavaScriptが実行されなかった」という発見に何か明らかにすることがあるのかな?

それで、ChatGPTがこの文章を書くのに使われたんだね。せめてもうちょっと整理してほしいな。

ああ、ウェブブログの永遠の特徴だね。あまりにもごちゃごちゃしてて、言語モデルでも二度見するレベル。

おそらく、OpenAIがログアウトしたユーザーに無料のChatGPTを提供しているから、これが悪用されないようにしたいんだろうね。

うん、ちょうど1時間前にChatGPTで何か調べようと思ったら、普段使わないブラウザウィンドウで、ログインアカウントもない状態だったんだ。動かないだろうと思ったけど、驚いたことに、アカウントもクッキーもないのに、ちゃんと質問を受け付けて答えてくれたよ。

でも、ログインしてるかどうかに関係なくチェックしてるの?ChatGPTアプリもAndroidでPlay Integrityをチェックしてるのに気づいた(GrapheneOSがアプリの行動を監視するからね)、多分同じ理由で。ちなみにClaudeのアプリはやってないけど、ログインは必要だよ。

copilot.microsoft.comも同じような感じだろうし、クラウドの使い方も似たようなもんだよね。

5.2を月20ドルで使えるなら、めっちゃお得だよね。Codexの方もいつか何か起きるだろうし。

もしかしたら、著者はなぜこれが重要なのかをもっと明確にすべきだったかも。OpenAIは本物のReactアプリを使ってほしいってことなんだ。それって…まあ、いいの?オチを探して記事をざっと読んだけど、特にオチはなさそうだね。

それは、この記事がAIのゴミだからだよ。

ボットの持ち主が、グラフィックスアクセラレーション付きのWindows 11の完全なVMをGoogle Chromeで動かせばいいのに、って全然理解できない。メモリページの重複排除を使えば、50台同時に動かせるんじゃないかな。 decentなCPUとGPUがあれば、1秒間に50ページをレンダリングできるはずだよ。それでAWSで1,000ページ読み込みあたり1セントだし、めっちゃ安いよね。

もし、GPUパススルーなしで良いグラフィックスアクセラレーション付きのWindows 11 VMを簡単に動かす方法を知ってたら、連絡してね。

スクレイピング用のサブレディットがあるよ。そこを見てみると、ヘッドレスブラウザでサイトをスクレイプできないと、ボット作成者がすごくイライラしてるのが分かる。君が提案したこともできるけど、LinuxのVMやコンテナを使う方がいいよ。Windowsは重すぎて、各VMに4GBのRAMが必要になるから。

いろんなプロバイダーが競って、IPローテーションや位置偽装、言語設定、プリビルドのパーサーなどが揃った便利なAPIで提供してるよ。正直、競争が激しくて切り替えコストも低いから、価格が下がる良い市場だと思う。こういう状況だと、自分で作るのは難しいよね。

Cloudflareが「疑わしい」とみなすブラウザやIPアドレスを使うと、ウェブがどれだけ使いづらくなっているか、ほんとに馬鹿げてる。最近、Firefoxを使っただけでキャプチャに溺れてるよ。もちろん、「ボット保護」のためなんだけどね。

それって、ボットネットがFirefoxを偽装してるからじゃない?Cloudflareを責めるのはちょっと不公平だよね。ボットのせいだし。

自分のネットワークが知らないうちにウェブトラフィックを送ってないか確認してみたら?俺はFirefox使ってるけど、普通の量だよ。

本当にイライラするのは、Cloudflareの「怪しい」の定義がどんどん変わっていくこと。VPNユーザー、プライバシー重視のブラウザ、珍しいIPレンジ、全部フラグが立てられる。こういうシステムに引っかかるのは、プライバシーを一番気にしてる人たちで、狙われてるはずのボットじゃないんだよね。

そうだね、待ち時間が20年以上も後退させられた感じだよ。reCaptchaとか、ユーザーに優しくないものは、あんまり使いたくないし、そんなサイトからは絶対に買い物しないようにしてる。実際、2年近く前にチャットGPTのサブスクリプションをキャンセルしたんだ。パズルを解かされるばっかりで、払ったソフトウェアを使わせてもらえなかったからね。ほとんどのウェブサイトやソフトウェアは代替可能で、実際にはあんまり価値がないってことを思い出すべきだよ。パフォーマンスを明らかに悪化させるようなところを、なんで報いる必要があるのか理解できない。

最近、15連続でキャプチャを解かなきゃいけないっていう信じられない体験をしたんだ。チェックアウトして、支払い情報を入力した後にね。注文を提出したいだけだったのに。ログインもしてたし、銀行からもワンタイムコードが必要だった。銀行が私が人間だって確信してるなら、あなたのeコマースサイトもそれがわかるはずだよ。

最近は「ボットかどうか確認中」って表示されるサイトはすぐに閉じちゃう。これが今のウェブの流れなら、別に使わなくてもいいや。あの記事や投稿を見る必要もなかったしね。他人の冷酷で貪欲な行動の代償を払うのにはもううんざりだよ。特に、Linuxや*BSDみたいなオープンソースのOSを使ってる人には特にひどい。多くのサイトが、OpenBSD + Firefoxを使ってるだけで自動的に403 Forbiddenでブロックしちゃうからね。WindowsやLinuxのコンピュータから同じサイトにアクセスすると、完全に通行証がもらえるのに。

Safariでも同じことが起きてる。正直言って、馬鹿げてるよ。私の家庭用IPがフラグされてるのかも。ほんとにイライラするのは、ボットが簡単に回避できるってこと。

本当に驚きだよ。私はFirefoxとUblock Originのヘビーユーザーだけど、Cloudflareのキャプチャには全く引っかからない。何が違うんだろう?CGNATはオフにしてるけど、それが関係あるのかは分からない(多分関係ない)。

私はちょっと古いFirefoxを使ってて、Cloudflareのせいでほとんどのウェブサイトが使えなくなってる。もちろん、gnu.orgみたいなサイトも、少し古いユーザーエージェントだからってブロックしてくるし。

これがウェブの根本的な設計ミスだって話してる人、いる?あるいは、インターネット全体の設計ミスとも言えるかも。

こんにちは!私はNickで、OpenAIでIntegrityの仕事をしています。これらのチェックは、ボットやスクレイピング、詐欺、プラットフォームの悪用を防ぐために、私たちのファーストパーティ製品を守る一環です。この取り組みに投資する大きな理由は、もっと多くのユーザーに無料でログアウトしたアクセスを提供したいからです。私のチームの目標は、限られたGPUリソースが本物のユーザーに使われるようにすることです。ユーザーへの影響にも非常に注意を払っています。ページの読み込み時間、最初のトークンまでの時間、ペイロードサイズなどを監視していて、これらの保護のオーバーヘッドを減らすことに重点を置いています。ほとんどの人には影響はほとんどなく、ごく少数の人だけが追加のチェックで少し遅延を感じるかもしれません。また、誤検知を最小限に抑えつつ、悪用を意味のあるレベルで難しくするために、精度も継続的に評価しています。

ファーストパーティの情報が聞けて嬉しいです。私はProのサブスクライバーで、チームはOpenAIのサブスクリプションに毎月2000ドル以上使っています。でも、Proアカウントでログインしている時でも、MullvadのようなVPNを使うと、チャットインターフェースが使えなかったり、タイムアウトエラーが出たりすることがよくあります。これは予想されることですか?認証されていて支払いをしているなら、VPNの使用は心配ないと思っていました。VPNを使っているかどうかに関わらず、このツールを使えるようになればいいなと思っています。

もっと多くのユーザーに無料でログアウトしたアクセスを提供したい でも、ログインしてるユーザーにもこれらのチェックを行ってるんじゃないの?

こんにちは!全然理解できるよ。だって、私たちもAnubisみたいなものを使って、OpenAIや似たような存在からサービスを守って、実際のユーザーに提供するために同じ理由でやってるからね。

ボットやスクレイパーが暴れ回るわけにはいかないよね…

最低でも2つのブラウザが必要な状況になってきてるよ。一つは、重要なサービスが動くためにこのひどいクライアントチェックを通すため、もう一つは、ウェブ上でのユーザー追跡を防ぐために使う。ニック、ボットトラフィックを抑えようとする現実的な理由は理解できるけど、ユーザーがプライバシーと機能性の間で選ばざるを得ない世界はどう思う?

記事とは関係あるかわからないけど、長いチャットではチャットUIのパフォーマンスが本当にひどくなるんだ。チャットボックスに入力するのも遅いし、レンダリングが遅れたり、時々完全に固まったりする。リサーチチャットがあって、メッセージを送る前に二度考えちゃうくらいパフォーマンスが悪いんだ。iPhone 16のSafariと、MacBook ProのM3 Chromeで使ってる。

「これらのチェックは、ボットやスクレイピング、詐欺、プラットフォームの悪用から自社製品を保護するための一環です。これらの対策を共有してもらえますか?私たちも対策を講じたいので。」

でも、タイトルは本当なの?特に入力がブロックされてるの?それとも、テキストの送信だけがブロックされてるの?読み込み時間に大きなバラつきがあるのを見たから聞いてるんだ。時々、入力できるまで数秒待たなきゃいけなかった。でも最近はマシになってるみたい。

みんな、DeepSeekとかが君たちのデータでLLMをトレーニングしてるのが悔しいんだろ?

OpenAIがスクレイピングを虐待の一形態と考えてるのは面白いな。

HTMLは読み込むけど、JavaScriptのバンドルは実行しないヘッドレスブラウザには、それがないんだよね。ちなみに、これは意味がない。ヘッドレスでもそうじゃなくても、ブラウザはJavaScriptを実行するから。

このAI生成のブログ記事の中には、そんなポイントがたくさんあった。1/3くらい読んで、どれだけズレてるかに気づくと、なんか気持ち悪くなる。

いや、違うと思う。ブラウザはJavaScriptの実行を無効にできるからね(これはスクレイピングで時間やリソースを節約するためによくあること)。俺はこういう意味だと思ったんだ。「JavaScriptバンドルを実行しないブラウザは、[レンダリングされたReact要素]を持たない」って。これ、確かにそうだよね。

はは、そうだね、ランダムなサイトのランダムなJSを自分のマシンで実行させるなんて、普通はしないよね…。

技術的な話をしたいんだけど、これがどうやって実現されたのかに興味があるんだ。具体的には、Turnstileは私の知る限り、特に設定可能なものやサイト特有のものはないんだよね。Reactを使ってないサイトでも動くし、OpenAI-Sentinel-Turnstile-TokenのクッキーはCFのクッキーじゃない。OpenAIは自分たちのAPIでTurnstileのデータを使って何か特別なことをしたのかな?

まだ読んでないけど、チャットが使えない時があるっていうのは、すごく共感できる。遅延やグリッチみたいな感じが耐えられないよね。