コンテンツにスキップ
OmniRoute source

Stealth Guide (日本語)

TLS フィンガープリンティングレイヤー

Section titled “TLS フィンガープリンティングレイヤー”

open-sse/utils/tlsClient.ts — wreq-js(Chrome 124)

Section titled “open-sse/utils/tlsClient.ts — wreq-js(Chrome 124)”

永続的な wreq-js セッションは、アカウントスコープと解決済みプロキシの組み合わせごとに遅延作成されます。プロセス全体で共有される TlsClient は、Cloudflare の背後にあるアップストリーム向けに macOS 上の Chrome 124 を偽装するセッションを最大 128 個プールします。ネイティブランタイムが利用できない場合、TlsClient.fetch() はフェイルクローズします。呼び出し元は、このラッパーの外部でフォールバックを明示的に選択できます。

  • セッションプロファイル: browser: "chrome_124", os: "macos"
  • プロキシ解決(優先順): HTTPS_PROXY → HTTP_PROXY → ALL_PROXY(小文字も対象)
  • タイムアウト: TLS_CLIENT_TIMEOUT_MS(FETCH_TIMEOUT_MS を継承、デフォルトは 600000)
  • wreq-js の Response は fetch と互換性があります(headers、text()、json()、clone()、body)。
  • 最初のバイトのウォッチドッグ(open-sse/utils/tlsFirstByteWatchdog.ts、#12656): TlsClient.fetch() はアップストリームのヘッダーが到着するとすぐに解決されるため、TLS_CLIENT_TIMEOUT_MS だけでは最初のバイトを一切返さないボディを制限できません。guardTlsFirstByte() は、ボディの最初の read() と TLS_FIRST_BYTE_WATCHDOG_MS(デフォルトは 10000、0 で無効)の完了を競合させます。正常なボディには影響しませんが、停止したボディでは wreq リーダーをキャンセルし、proxyFetch の既存の TLS フォールバックロジックによって直接/プロキシディスパッチャーへフォールスルーできるようにします(ボディ付き POST など、再実行が安全ではないリクエストについては、サイレントに再試行せず、引き続き例外をスローします)。
Section titled “Web Cookie プロバイダートランスポート — wreq-js 3.2.0”

open-sse/services/tlsClientBase.ts は、以下に示す 5 つの専用 Web Cookie トランスポートで共有されるアダプターです。各プロバイダーの薄いラッパーが、ブラウザー/OS プロファイルを選択します。このアダプターは、open-sse/utils/tlsClient.ts 内の単一の wreq ランタイムローダーとトランスポートプールを使用し、プロファイル + OS + 解決済みプロキシをキーとします。一方、各リクエストでは cookieMode: "ephemeral" を使用します。そのため、アカウントとリクエストはトランスポートレベルの接続を共有しますが、wreq セッションや Cookie jar を共有することはありません。

プロバイダー プロファイル エミュレートする OS ストリーム EOF ポリシー
Claude chrome_146 Linux [DONE] を含める
Perplexity firefox_148 macOS event: end_of_stream を含める
Grok chrome_146 Linux [DONE] を除外
Notion chrome_146 Windows [DONE] を含める
LMArena chrome_146 Windows センチネルなし。ネイティブ EOF で閉じる
  • ストリーミングでは、ネイティブレスポンスの ReadableStream を直接消費します。一時ファイルやサイドカーは作成されません。
  • ストリームを公開する前に、先頭の最大 256 バイトが検査されます。SSE プロバイダーでは SSE ではないエラーをバッファリングします。Grok/LMArena は、Cloudflare チャレンジを 403 に、HTML 中間ページを 502 にマッピングします。
  • ネイティブリクエストのタイムアウトは、絶対時間に基づく JS のハードデッドラインで引き続きラップされます。ハングが発生すると、影響を受けたプロファイル/OS/プロキシのトランスポートのみが無効化およびクローズされ、次のリクエスト時に再作成されます。
  • プロキシ解決の優先順は、呼び出しごとの proxyUrl → リクエストスコープのアカウント/ダッシュボードコンテキスト → HTTPS_PROXY/HTTP_PROXY/ALL_PROXY(小文字のバリアントを含む)です。解決エラー時には、直接接続が漏れることなくフェイルクローズします。LMArena は意図的に arena.ai を基準として解決します。
  • byteResponse は、UTF-8 破損なしで Content-Type が指定された data: URL を返します。
  • エラーは、TlsClientUnavailableError(パッケージ/アドオンが利用不可)、TlsClientHangError(デッドライン超過)、および 128 個に制限されたプロファイル/OS/プロキシスロットがすべて使用中またはクローズ中の場合の WreqTransportCapacityError(共有セッション容量エラーコード)です。

上記の汎用 TlsClient セッションは、ブラウザーに保持される永続的な Cookie 状態に引き続き特化しています。両方の経路は、キャッシュされた単一の wreq モジュールローダーとプロセスライフサイクルフックを再利用します。ただし、Cookie の有効期間が意図的に異なるため、それぞれのプールは分離されています。

これらのプロファイルは固定されたパッケージでサポートされていますが、実際の WAF による受け入れ可否は、ローカルのコントラクトテストとは無関係に変化する可能性があります。アップストリームブラウザーとの同等性を主張する前に、明示的に使用許可を得た実アカウントに対してフィンガープリントの変更を検証してください。


cliCompatMode が有効な場合、OmniRoute は送信する Claude リクエストを変形し、claude-cli のトラフィックと見分けがつかないようにします。以下の 3 つのモジュールが連携します。

課金ヘッダーに埋め込まれる 3 文字の cc_version フィンガープリントを計算します。

SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]
  • FINGERPRINT_SALT = "59cf53e54c78"(ハードコード済み。公式クライアントと一致)
  • 入力: 最初のユーザーメッセージ本文のインデックス 4、7、20 にある文字 + バージョン文字列
  • 出力: 3 文字の 16 進数プレフィックス

claudeCodeCCH.ts(クライアントコンテンツハッシュ)

Section titled “claudeCodeCCH.ts(クライアントコンテンツハッシュ)”

公式 Claude Code CLI が Bun/Zig を介して計算する、サーバー側の整合性チェックです。OmniRoute はこれを xxhash-wasm で再実装しています。

  1. cch=00000; プレースホルダーを使用して本文をシリアライズ
  2. xxhash64(bytes, seed) & 0xFFFFF
  3. 5 文字になるようゼロ埋めした小文字の 16 進数
  4. cch=00000; を計算済みトークンに置換

定数:

  • シード: 0x6e52736ac806831e
  • パターン: /\bcch=([0-9a-f]{5});/

「機密性の高い」クライアント名の最初の文字の後に Unicode のゼロ幅接合子(U+200D)を挿入し、上流のフィルターが grep できないようにします。デフォルトの単語リスト:

opencode, open-code, cline, roo-cline, roo_cline, cursor, windsurf,
aider, continue.dev, copilot, avante, codecompanion

適用対象: system ブロック、すべての messages[].content、および tools[].description / tools[].function.description。オペレーターは setSensitiveWords() を使用して上書きできます。

claudeCodeCompatible.ts — anthropic-compatible-cc-* プロバイダー

Section titled “claudeCodeCompatible.ts — anthropic-compatible-cc-* プロバイダー”

「本物の Claude Code」トラフィックのみを受け入れるサードパーティー製 Anthropic リレー向け:

  • CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.258 (external, sdk-cli)"
  • CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.112.1"
  • CLAUDE_CODE_COMPATIBLE_STAINLESS_RUNTIME_VERSION = "v26.3.0"
  • デフォルトでは anthropic-beta = "claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24"
  • 接続ごとの「Enable redact-thinking beta」トグルは、CC Compatible の上流が編集済み思考ストリームを明示的に必要とする場合に、redact-thinking-2026-02-12 を追加します
  • 接続ごとの「Enable summarized thinking display」トグルは providerSpecificData.requestDefaults.summarizeThinking を保存し、表示モードがまだ設定されていない CC Compatible の思考リクエストに display: "summarized" を追加します
  • CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07"(Opus/Sonnet 4.x ファミリー)
  • デフォルトパス: /v1/messages?beta=true

同じバンドル内の関連モジュール:

  • claudeCodeConstraints.ts — temperature + cache-control のルール
  • claudeCodeToolRemapper.ts — ツール名の再マッピング
  • claudeCodeExtraRemap.ts — 追加のペイロード正規化

Antigravity リクエストは、呼び出し元のテキストをバイト単位でそのまま保持します。OmniRoute は、IDE クライアントを模倣する目的でプロンプトにゼロ幅文字を挿入したり、ツールの名前変更や注入を行ったりしません。

転送前に Stainless SDK マーカー(x-stainless-lang、x-stainless-package-version、x-stainless-os、x-stainless-arch、x-stainless-runtime、x-stainless-runtime-version、x-stainless-timeout、x-stainless-retry-count、x-stainless-helper-method)を削除します。

⚠️ リスク: ANTIGRAVITY_CREDITS=always(アカウント停止が多発する要注意箇所)

Section titled “⚠️ リスク: ANTIGRAVITY_CREDITS=always(アカウント停止が多発する要注意箇所)”

ANTIGRAVITY_CREDITS=always(open-sse/executors/antigravity.ts が使用)は、Google の無料枠クォータによる制限を受ける代わりに、すべてのリクエストを Antigravity AI Credit Overages(有料の Google クレジット)経由でルーティングします。これは機能として文書化されていますが、私たちが確認している中で最も一般的な ToS 違反報告の原因です。複数の Google Ultra アカウントが =always で数時間実行した後、403 / "service disabled for ToS violation" / insufficient_quota により停止されています。

上流での取り締まりは Google 側で行われるものであり、OmniRoute が防止できるものではありません。環境変数名と既存のドキュメントからは、安全に切り替えられる設定のように見えますが、実際にはそうではありません。

無料枠のみの使用よりも積極的に不正利用検出の対象となる理由:

  • 単一の Google アカウントで自動化された継続的な支出が発生すると、無料枠を使い切って停止する場合とは異なる形でフラグが立ちます。
  • クレジット超過にはレート上限がないため、設定ミスのあるクライアントが数分で数百 USD を消費し、API キーの転売やボットトラフィックのように見える可能性があります。
  • 同じ外部 IP から複数の OmniRoute ユーザーが並行して超過クレジットを使用すると、そのシグナルがさらに強まります。

推奨される運用方針:

  1. オペレーターが有料クレジットとアカウント取り締まりのリスクを明示的に受け入れない限り、デフォルトの ANTIGRAVITY_CREDITS=off を維持してください。retry は最初に通常のリクエストを送信し、対象となるクォータの 429 が返された場合に限り、最大 1 回クレジットを注入します。always は最初のリクエストからクレジットを注入します。
  2. 単一の Antigravity アカウントに負荷を集中させるのではなく、Auto-Combo を介してプロバイダー間に負荷を分散してください(model: "auto" または kr/glm/etc-combo)。
  3. Antigravity プロバイダーの編集ページ(Dashboard → Providers → Antigravity → connection → rate limit)で、接続ごとの RPM 制限を設定してください。継続的な使用では 30~60 RPM が妥当な上限です。
  4. オペレーターが管理する安定した上流ネットワークを使用し、無関係なユーザーやワークロード間で 1 つのアカウントを共有しないでください。
  5. 停止された場合: support.google.com →「Restore Workspace/Account access」から、Google が送信した正確な quota_exceeded / service disabled レスポンス本文を添えて異議申し立てを行ってください。復旧は保証されません。

環境変数リファレンスには、各クレジットモードがアカウントと支出に与える影響が記載されています。

関連箇所:

  • open-sse/executors/antigravity.ts — process.env.ANTIGRAVITY_CREDITS を読み込み
  • src/lib/oauth/providers/antigravity.ts — 認証情報の受け渡し
  • 元のインシデント報告: Discussion #1183

CLI フィンガープリントレジストリ — open-sse/config/cliFingerprints.ts

Section titled “CLI フィンガープリントレジストリ — open-sse/config/cliFingerprints.ts”

公式 CLI の mitmproxy トレースから取得した、厳密なヘッダー順序と JSON ボディフィールド順序を固定するプロバイダー別テーブルです。現在登録済み: codex、claude。さらに、antigravity と github については providerHeaderProfiles.ts にランタイムから導出されるプロファイルがあります。

interface CliFingerprint {
headerOrder: string[]; // 大文字と小文字を区別
bodyFieldOrder: string[]; // トップレベルの JSON キー
userAgent?: string | (() => string);
extraHeaders?: Record<string, string>;
}

環境変数を使用してプロバイダーごとに切り替えます(下記参照)。無効にすると、ヘッダーとボディキーは Node/JSON が生成した順序のままになるため、簡単にフィンガープリントされます。


MITM プロキシ(Antigravity、Linux/macOS/Windows)

Section titled “MITM プロキシ(Antigravity、Linux/macOS/Windows)”

バイナリを OPENAI_BASE_URL でリダイレクトできない CLI のために、OmniRoute はローカルで TLS を終端するプロキシを実行します。エンドポイントは src/app/api/cli-tools/antigravity-mitm/ 配下にあります。

メソッド エンドポイント 用途
GET /api/cli-tools/antigravity-mitm ステータス — running、pid、dnsConfigured、certExists
POST /api/cli-tools/antigravity-mitm MITM を開始(apiKey + sudoPassword が必要)
DELETE /api/cli-tools/antigravity-mitm MITM を停止
GET /api/cli-tools/antigravity-mitm/alias モデルエイリアスを一覧表示
PUT /api/cli-tools/antigravity-mitm/alias ツールのモデルエイリアスを保存

インターセプト対象ホスト: daily-cloudcode-pa.googleapis.com(Antigravity のアップストリーム)。

開始シーケンス(src/mitm/manager.ts::startMitm)

Section titled “開始シーケンス(src/mitm/manager.ts::startMitm)”
  1. selfsigned を使用して自己署名証明書を生成(RSA-2048、SHA-256、1年)— cert/generate.ts
  2. 証明書をシステムの信頼ストアにインストール — cert/install.ts
  3. hosts エントリ 127.0.0.1 daily-cloudcode-pa.googleapis.com を追加 — dns/dnsConfig.ts
  4. ROUTER_API_KEY + MITM_LOCAL_PORT(デフォルトは 443)を指定して src/mitm/server.cjs を起動
  5. PID を <DATA_DIR>/mitm/.mitm.pid に永続化

Linux の動的な信頼ストア検出 — cert/install.ts

Section titled “Linux の動的な信頼ストア検出 — cert/install.ts”

getLinuxCertConfig() は優先順位リストを走査し、最初に存在するディレクトリを選択します。

ディストリビューションファミリー ディレクトリ 更新コマンド
Debian / Ubuntu /usr/local/share/ca-certificates update-ca-certificates
Arch / CachyOS / Manjaro /etc/ca-certificates/trust-source/anchors update-ca-trust
Fedora / RHEL / CentOS /etc/pki/ca-trust/source/anchors update-ca-trust
openSUSE /etc/pki/trust/anchors update-ca-certificates

証明書ファイル名: omniroute-mitm.crt。getCertFingerprint() を使用してフィンガープリントを照合します(DER の SHA-1)。

さらに、certutil が利用可能な場合、updateNssDatabases() はユーザーごとの NSS DB に証明書をインストールします: ~/.pki/nssdb、~/snap/chromium/.../nssdb、すべての Firefox プロファイル(snap を含む)。ニックネームは OmniRoute MITM Root CA です。

  • macOS: security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain
  • Windows: 管理者権限の PowerShell → certutil -addstore Root

すべての MITM エンドポイントには管理認証(requireCliToolsAuth)が必要です。sudo パスワードはモジュールスコープ内にキャッシュされ(globalThis には決して保存されません)、stopMitm() の実行時に消去されます。


User-Agent のオーバーライド — 環境変数(.env.example セクション 12)

Section titled “User-Agent のオーバーライド — 環境変数(.env.example セクション 12)”
変数 デフォルト値
CLAUDE_USER_AGENT claude-cli/2.1.258 (external, cli)
CODEX_USER_AGENT codex-cli/0.155.0 (Windows 10.0.26200; x64)
GITHUB_USER_AGENT GitHubCopilotChat/0.54.0
ANTIGRAVITY_USER_AGENT antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0
KIRO_USER_AGENT AWS-SDK-JS/3.0.0 kiro-ide/1.0.0
QODER_USER_AGENT Qoder-Cli
CURSOR_USER_AGENT Cursor/3.4

open-sse/executors/base.ts::buildHeaders() によって動的ルックアップを介して使用されます。プロバイダーが新しい CLI バージョンをリリースした際は、これらを更新してください — 古い UA 文字列は、旧式のクライアントとして拒否されるようになります。

CLI 互換モードの切り替え(.env.example セクション 13)

Section titled “CLI 互換モードの切り替え(.env.example セクション 13)”
変数 効果
CLI_COMPAT_CODEX=1 Codex フィンガープリント
CLI_COMPAT_CLAUDE=1 claude-cli フィンガープリント
CLI_COMPAT_GITHUB=1 GitHub Copilot Chat フィンガープリント
CLI_COMPAT_ANTIGRAVITY=1 Antigravity フィンガープリント
CLI_COMPAT_KIRO=1 Kiro
CLI_COMPAT_CURSOR=1 Cursor
CLI_COMPAT_KIMI_CODING=1 Kimi Coding
CLI_COMPAT_KILOCODE=1 KiloCode
CLI_COMPAT_CLINE=1 Cline
CLI_COMPAT_ALL=1 上記すべてを有効化

プロバイダー IP は常に維持されます — この切り替えはリクエストのワイヤーイメージを整形するだけであり、送信元 IP を切り替えるものではありません。


OmniRoute は転送前に受信クライアントヘッダーを除去するため、Cursor から到着したリクエストの User-Agent: Cursor/X.Y.Z が Claude のアップストリームに漏れることはありません。拒否リストについては src/shared/constants/upstreamHeaders.ts を参照してください。このリストは Zod スキーマおよびユニットテストと常に同期されています。


プロバイダーの変更時にフィンガープリントを更新する方法

Section titled “プロバイダーの変更時にフィンガープリントを更新する方法”
  1. mitmproxy を使用して公式 CLI のトラフィックをキャプチャする(TLS インターセプト + ダンプ)
  2. JA3/JA4 と実際のヘッダー順序を抽出する
  3. 該当する CLI_FINGERPRINTS[...] エントリを更新する
  4. .env.example 内の対応する *_USER_AGENT のデフォルトを更新する
  5. TLS ハンドシェイク自体が変更された場合は、該当するプロバイダーラッパーまたは wreq-js の browser: オプションを更新する
  6. プロバイダー固有の TLS テストを実行し、稼働中のプロバイダーに対して手動カナリアテストを行う
  7. パッチリリースとして公開し、CHANGELOG.md に記録する

  • open-sse/services/__tests__/claudeTlsClient.test.ts — 共有 TLS ラッパーの動作
  • tests/unit/anthropic-cache-fingerprint.test.ts — フィンガープリントの決定性
  • tests/unit/chatgpt-web-source-retirement.test.ts — 共通の ChatGPT Web ステルスソースが引き続き存在せず、Codex Web は引き続き存在すること


OmniRoute ソースコード (a58000c7685f)

HagiCode

HagiCode は構造化ワークフロー、マルチエージェント実行、Hero Dungeon ビューを備えたエージェント型コーディングワークスペースです。

よりスマートで速く、楽しいエージェント型ワークフローで、使いやすいソフトウェアを形にします。

HagiCode ライトテーマのメイン画面
  • Smart構造化ワークフローは意図をアイデアから変更のリリースまで実行可能な道筋にします。
  • Efficientマルチエージェントのワークフローで調査、実装、レビューを並行して進めます。
  • FunHero Dungeon により長時間のコーディングを視覚的で協力的な体験にします。
HagiCode を見る