Files
OmniRoute/docs/i18n/th/docs/security/STEALTH_GUIDE.md
Diego Rodrigues de Sa e Souza 8feea123bb feat(docs): mirror every docs/ page in all 65 locales (#14106)
* feat(docs): mirror every docs/ page in all 65 locales

Extends the documentation mirrors from the 22-page core set (#13940) to
every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors
(6,208 new), language bars rewritten for the full locale list, state
adopted so the blocking drift gate now covers all 152 pages.

run-translation.mjs: an oversized block made only of table rows or list
items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is
cut at item boundaries and rejoined without a blank line — the single
16-40 KB request outlived the backend socket for verbose scripts. 48
older mirrors whose tables had lost rows were retranslated with --force.

* docs(i18n): refresh mirrors for the sources the base changed since the branch cut

Section-level retranslation of the 29 docs (and README.md) whose source
or mirrors moved on release/v3.8.51 during the run, then state adoption;
the drift gate is green again on the merged tree.
2026-09-18 13:16:46 -03:00

40 KiB
Raw Blame History

Stealth Guide (ไทย)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


แหล่งข้อมูลหลัก: open-sse/utils/tlsClient.ts, open-sse/services/{tlsClientBase,claudeTlsClient,perplexityTlsClient,grokTlsClient,notionTlsClient,lmarenaTlsClient,claudeCodeCCH,claudeCodeFingerprint,claudeCodeObfuscation,claudeCodeCompatible}.ts, open-sse/config/cliFingerprints.ts, src/mitm/ อัปเดตล่าสุด: 2026-09-02 — v3.8.51 กลุ่มผู้อ่าน: วิศวกรที่ดูแลการผสานรวมแบบซ่อนตัวซึ่งเฉพาะเจาะจงตามผู้ให้บริการ

OmniRoute ผสานรวมกับผู้ให้บริการที่ระบบเอดจ์ตรวจสอบลายนิ้วมือของไคลเอนต์ที่ไม่เป็นทางการอย่างจริงจัง (TLS JA3/JA4, ลำดับส่วนหัว, รูปแบบเนื้อหา JSON, โทเค็นความถูกต้องสมบูรณ์) หน้านี้อธิบายพื้นผิวการซ่อนตัวที่ OmniRoute เปิดให้ใช้งานและตำแหน่งที่นำไปใช้งาน

ประกาศด้านกฎหมายและจริยธรรม

ฟีเจอร์การซ่อนตัวมีไว้เพื่อให้ OmniRoute ทำหน้าที่เป็นเลเยอร์ความเข้ากันได้ระหว่างบัญชีทางการที่ผู้ใช้เป็นเจ้าของ (Claude Code CLI, Codex, Antigravity, Cursor ฯลฯ) กับ API แบบรวมศูนย์ของ OmniRoute ฟีเจอร์เหล่านี้ ไม่ได้ มีไว้เพื่อหลบเลี่ยงการตรวจจับการฉ้อโกง แบ่งปันข้อมูลประจำตัว หรือละเมิดข้อกำหนดในการให้บริการของผู้ให้บริการ ผู้ดูแลคาดหวังให้ผู้ดำเนินการปฏิบัติตาม ToS ของต้นทางที่ตนได้ยอมรับเมื่อตอนสร้างบัญชี


เลเยอร์ลายนิ้วมือ TLS

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

เซสชัน wreq-js แบบคงอยู่จะถูกสร้างแบบหน่วงเวลาตามขอบเขตบัญชีและพร็อกซีที่ได้รับการแก้ไข TlsClient ซึ่งใช้ร่วมกันทั้งโพรเซสจะรวมเซสชันไว้สูงสุด 128 เซสชัน โดยจำลองเป็น Chrome 124 บน macOS สำหรับ ต้นทางที่อยู่เบื้องหลัง Cloudflare TlsClient.fetch() จะหยุดการทำงานอย่างปลอดภัยเมื่อรันไทม์เนทีฟ ไม่พร้อมใช้งาน โดยผู้เรียกอาจเลือกใช้ทางเลือกสำรองภายนอก wrapper นี้อย่างชัดเจน

  • โปรไฟล์เซสชัน: browser: "chrome_124", os: "macos"
  • การกำหนดพร็อกซี (ตามลำดับความสำคัญ): HTTPS_PROXYHTTP_PROXYALL_PROXY (รวมถึงรูปแบบตัวพิมพ์เล็ก)
  • ระยะหมดเวลา: TLS_CLIENT_TIMEOUT_MS (สืบทอดจาก FETCH_TIMEOUT_MS ค่าเริ่มต้น 600000)
  • Response ของ wreq-js เข้ากันได้กับ fetch (headers, text(), json(), clone(), body)
  • ตัวเฝ้าระวังไบต์แรก (open-sse/utils/tlsFirstByteWatchdog.ts, #12656): TlsClient.fetch() จะ resolve ทันทีที่ส่วนหัวจากต้นทางมาถึง ดังนั้น TLS_CLIENT_TIMEOUT_MS เพียงอย่างเดียวจึงไม่สามารถจำกัดเวลา ของ body ที่ไม่ส่งไบต์แรกออกมาได้ guardTlsFirstByte() จะแข่งขันระหว่าง read() ครั้งแรกของ body กับ TLS_FIRST_BYTE_WATCHDOG_MS (ค่าเริ่มต้น 10000, ค่า 0 ใช้ปิดการทำงาน) โดย body ที่ทำงานปกติจะ ไม่ได้รับผลกระทบ ส่วน body ที่ค้างจะยกเลิกตัวอ่านของ wreq และปล่อยให้ตรรกะ TLS-fallback ที่มีอยู่ของ proxyFetch เปลี่ยนไปใช้ตัวจัดส่งแบบเชื่อมต่อโดยตรง/ผ่านพร็อกซี (คำขอที่ไม่ปลอดภัยต่อการส่งซ้ำ เช่น POST ที่มี body จะยังคง throw แทนที่จะถูกลองใหม่โดยไม่มีการแจ้งเตือน)

การส่งข้อมูลของผู้ให้บริการผ่านเว็บคุกกี้ — wreq-js 3.2.0

open-sse/services/tlsClientBase.ts เป็นอะแดปเตอร์ที่ใช้ร่วมกันสำหรับการส่งข้อมูลผ่าน เว็บคุกกี้เฉพาะทางทั้งห้ารายการด้านล่าง wrapper แบบบางของผู้ให้บริการแต่ละรายจะเลือกโปรไฟล์เบราว์เซอร์/ระบบปฏิบัติการ อะแดปเตอร์ ใช้ตัวโหลดรันไทม์ wreq และพูลการส่งข้อมูลเพียงชุดเดียวใน open-sse/utils/tlsClient.ts โดยใช้ โปรไฟล์ + ระบบปฏิบัติการ + พร็อกซีที่ได้รับการแก้ไขเป็นคีย์ ขณะที่ทุกคำขอใช้ cookieMode: "ephemeral" ดังนั้นบัญชีและ คำขอจึงใช้การเชื่อมต่อระดับการส่งข้อมูลร่วมกัน แต่จะไม่ใช้เซสชัน wreq หรือโถคุกกี้ร่วมกัน

ผู้ให้บริการ โปรไฟล์ ระบบปฏิบัติการที่จำลอง นโยบาย 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 ไม่มี sentinel; ปิดเมื่อถึง EOF เนทีฟ
  • การสตรีมจะใช้งาน ReadableStream ของการตอบกลับแบบเนทีฟโดยตรง โดยไม่มีการสร้างไฟล์ชั่วคราวหรือ sidecar
  • ระบบจะตรวจสอบข้อมูลเริ่มต้นสูงสุด 256 ไบต์ก่อนเปิดให้เข้าถึงสตรีม ผู้ให้บริการ SSE จะบัฟเฟอร์ข้อผิดพลาดที่ไม่ใช่ SSE ส่วน Grok/LMArena จะแมปคำท้าทายจาก Cloudflare เป็น 403 และหน้า HTML คั่นกลางเป็น 502
  • ระยะหมดเวลาของคำขอเนทีฟยังคงถูกครอบด้วยกำหนดเวลาสิ้นสุดแบบเด็ดขาดของ JS การค้างจะทำให้ เฉพาะการส่งข้อมูลของโปรไฟล์/ระบบปฏิบัติการ/พร็อกซีที่ได้รับผลกระทบใช้การไม่ได้และถูกปิด ก่อนที่คำขอถัดไปจะสร้างขึ้นใหม่
  • ลำดับความสำคัญในการกำหนดพร็อกซีคือ proxyUrl ต่อการเรียก → บริบทบัญชี/แดชบอร์ดที่จำกัดขอบเขตตามคำขอ → HTTPS_PROXY/HTTP_PROXY/ALL_PROXY (รวมถึงรูปแบบตัวพิมพ์เล็ก) ข้อผิดพลาดในการกำหนดค่าจะ หยุดการทำงานอย่างปลอดภัยแทนที่จะทำให้การเชื่อมต่อโดยตรงรั่วไหล LMArena ตั้งใจกำหนดค่าโดยอิงกับ arena.ai
  • byteResponse ส่งคืน URL แบบ data: ที่ระบุชนิดเนื้อหาโดยไม่มีความเสียหายจาก UTF-8
  • ข้อผิดพลาดได้แก่ TlsClientUnavailableError (แพ็กเกจ/ส่วนเสริมไม่พร้อมใช้งาน), TlsClientHangError (เกินกำหนดเวลา) และ WreqTransportCapacityError (รหัสข้อผิดพลาดด้านความจุเซสชันที่ใช้ร่วมกัน) เมื่อสล็อตโปรไฟล์/ระบบปฏิบัติการ/พร็อกซีแบบจำกัดจำนวนทั้ง 128 สล็อตกำลังใช้งานหรือกำลังปิด

เซสชัน TlsClient แบบทั่วไปข้างต้นยังคงมีไว้เฉพาะสำหรับสถานะคุกกี้แบบคงอยู่ที่ได้รับการสนับสนุนโดยเบราว์เซอร์ ทั้งสองเส้นทางใช้ตัวโหลดโมดูล wreq ที่แคชไว้และฮุกวงจรชีวิตของโพรเซสชุดเดียวกัน แต่พูลของทั้งสองยังคง แยกจากกัน เนื่องจากอายุการใช้งานของคุกกี้ถูกกำหนดให้แตกต่างกันโดยเจตนา

แพ็กเกจที่ตรึงเวอร์ชันไว้รองรับโปรไฟล์เหล่านี้ แต่การยอมรับจาก WAF จริงอาจเปลี่ยนแปลงได้โดยไม่ขึ้นกับ การทดสอบสัญญาภายในระบบ โปรดตรวจสอบการเปลี่ยนแปลงลายนิ้วมือกับบัญชีจริงที่ได้รับอนุญาตอย่างชัดเจน ก่อนอ้างว่ามีความเทียบเท่ากับเบราว์เซอร์ของต้นทาง


ชุดพรางตัว Claude Code

เมื่อเปิดใช้ cliCompatMode OmniRoute จะปรับรูปแบบคำขอ Claude ขาออกให้ไม่สามารถแยกแยะจากทราฟฟิกของ claude-cli ได้ โดยมีโมดูลสามตัวทำงานร่วมกัน:

claudeCodeFingerprint.ts

คำนวณลายนิ้วมือ cc_version ขนาด 3 อักขระที่ฝังอยู่ในส่วนหัวการเรียกเก็บเงิน:

SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]
  • FINGERPRINT_SALT = "59cf53e54c78" (ฮาร์ดโค้ดไว้ และตรงกับไคลเอนต์อย่างเป็นทางการ)
  • อินพุต: อักขระที่ดัชนี 4, 7 และ 20 ของข้อความผู้ใช้แรก + สตริงเวอร์ชัน
  • เอาต์พุต: คำนำหน้าเลขฐานสิบหกขนาด 3 อักขระ

claudeCodeCCH.ts (แฮชเนื้อหาไคลเอนต์)

การตรวจสอบความถูกต้องสมบูรณ์ฝั่งเซิร์ฟเวอร์ซึ่ง Claude Code CLI อย่างเป็นทางการคำนวณผ่าน Bun/Zig โดย OmniRoute นำมาสร้างใหม่ด้วย xxhash-wasm:

  1. แปลงบอดีเป็นข้อมูลอนุกรมโดยใช้ตัวแทน cch=00000;
  2. xxhash64(bytes, seed) & 0xFFFFF
  3. เลขฐานสิบหกตัวพิมพ์เล็กขนาด 5 อักขระ โดยเติมศูนย์ด้านหน้า
  4. แทนที่ cch=00000; ด้วยโทเค็นที่คำนวณได้

ค่าคงที่:

  • ค่าตั้งต้น: 0x6e52736ac806831e
  • รูปแบบ: /\bcch=([0-9a-f]{5});/

claudeCodeObfuscation.ts

แทรก 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-*

สำหรับรีเลย์ Anthropic ของบุคคลที่สามซึ่งยอมรับเฉพาะทราฟฟิก "Claude Code จริง":

  • 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" ระดับการเชื่อมต่อจะเพิ่ม redact-thinking-2026-02-12 เมื่อระบบต้นทางที่เข้ากันได้กับ CC ต้องการสตรีมการคิดที่ผ่านการปกปิดโดยเฉพาะ
  • ตัวเลือก "Enable summarized thinking display" ระดับการเชื่อมต่อจะจัดเก็บ providerSpecificData.requestDefaults.summarizeThinking และเพิ่ม display: "summarized" ลงในคำขอการคิดที่เข้ากันได้กับ CC ซึ่งยังไม่ได้กำหนดโหมดการแสดงผล
  • CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07" (ตระกูล Opus/Sonnet 4.x)
  • พาธเริ่มต้น: /v1/messages?beta=true

โมดูลที่เกี่ยวข้องในชุดเดียวกัน:

  • claudeCodeConstraints.ts — กฎอุณหภูมิ + การควบคุมแคช
  • claudeCodeToolRemapper.ts — การแมปชื่อเครื่องมือใหม่
  • claudeCodeExtraRemap.ts — การปรับเพย์โหลดเพิ่มเติมให้เป็นมาตรฐาน

การพรางตัว Antigravity

คำขอ Antigravity จะเก็บรักษาข้อความของผู้เรียกแบบไบต์ต่อไบต์ OmniRoute จะไม่แทรกอักขระความกว้างเป็นศูนย์ลงในพรอมต์ หรือเปลี่ยนชื่อ/แทรกเครื่องมือเพื่อเลียนแบบไคลเอนต์ IDE

antigravityHeaderScrub.ts

ลบตัวบ่งชี้ 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 (จุดเสี่ยงสูงต่อการถูกแบนบัญชี)

ANTIGRAVITY_CREDITS=always (ใช้งานโดย open-sse/executors/antigravity.ts) จะกำหนดเส้นทางให้คำขอ ทุกคำขอ ผ่าน Antigravity AI Credit Overages (เครดิต Google แบบชำระเงิน) แทนที่จะปล่อยให้โควตาระดับฟรีของ Google เป็นตัวจำกัดการใช้งาน แม้จะมีการระบุไว้ในเอกสารว่าเป็นฟีเจอร์ แต่นี่คือ รายงานการละเมิดข้อกำหนดในการให้บริการที่พบบ่อยที่สุดเพียงกรณีเดียวที่เราได้รับ — บัญชี Google Ultra หลายบัญชีถูกแบนด้วย 403 / "service disabled for ToS violation" / insufficient_quota หลังจากทำงานเพียงไม่กี่ชั่วโมงโดยตั้งค่าเป็น =always

การบังคับใช้งานของระบบต้นทางเกิดขึ้นที่ ฝั่ง Google ไม่ใช่สิ่งที่ OmniRoute สามารถป้องกันได้ ชื่อตัวแปรสภาพแวดล้อมและเอกสารที่มีอยู่ทำให้ดูเหมือนเป็นตัวเลือกที่สามารถเปิดใช้ได้อย่างปลอดภัย แต่ความจริงไม่ใช่เช่นนั้น

เหตุผลที่การตั้งค่านี้กระตุ้นระบบตรวจจับการใช้งานในทางที่ผิดได้รุนแรงกว่าการใช้เฉพาะระดับฟรี:

  • การใช้จ่ายอัตโนมัติอย่างต่อเนื่องบนบัญชี Google บัญชีเดียวจะถูกตรวจจับต่างจากรูปแบบที่ระดับฟรีใช้จนถึงโควตาแล้วหยุด
  • เครดิตส่วนเกินไม่มีเพดานอัตราการใช้งาน ดังนั้นไคลเอนต์ที่กำหนดค่าผิดอาจใช้เงินหลายร้อย USD หมดภายในไม่กี่นาที และมีลักษณะคล้ายการขายคีย์ API ต่อหรือทราฟฟิกจากบอต
  • ผู้ใช้ OmniRoute หลายรายที่ใช้เครดิตส่วนเกินพร้อมกันจาก IP ภายนอกเดียวกันจะยิ่งเพิ่มความรุนแรงของสัญญาณตรวจจับ

แนวทางที่แนะนำ:

  1. คงค่าเริ่มต้น ANTIGRAVITY_CREDITS=off ไว้ เว้นแต่ผู้ดำเนินการจะยอมรับความเสี่ยงด้านเครดิตแบบชำระเงินและการบังคับใช้กับบัญชีอย่างชัดแจ้ง retry จะส่งคำขอปกติก่อน และแทรกเครดิตไม่เกินหนึ่งครั้งหลังได้รับข้อผิดพลาดโควตา 429 ที่เข้าเกณฑ์ ส่วน always จะแทรกเครดิตตั้งแต่คำขอแรก
  2. กระจายโหลดระหว่างผู้ให้บริการผ่าน Auto-Combo (model: "auto" หรือคอมโบ kr/glm/etc) แทนการใช้งานบัญชี Antigravity บัญชีเดียวจนเต็มขีดจำกัด
  3. กำหนดขีดจำกัด RPM ต่อการเชื่อมต่อ ในหน้าแก้ไขของผู้ให้บริการ Antigravity (Dashboard → Providers → Antigravity → การเชื่อมต่อ → ขีดจำกัดอัตรา) 3060 RPM เป็นขีดจำกัดสูงสุดที่สมเหตุสมผลสำหรับการใช้งานต่อเนื่อง
  4. ใช้เครือข่ายต้นทางที่เสถียรและอยู่ภายใต้การควบคุมของผู้ดำเนินการ และหลีกเลี่ยงการใช้บัญชีเดียวร่วมกันระหว่างผู้ใช้หรือเวิร์กโหลดที่ไม่เกี่ยวข้องกัน
  5. หากถูกแบน: ยื่นอุทธรณ์ผ่าน support.google.com → "Restore Workspace/Account access" พร้อมบอดีการตอบกลับ quota_exceeded / service disabled ที่ Google ส่งมาอย่างครบถ้วน การกู้คืนบัญชีไม่มีการรับประกัน

เอกสารอ้างอิงตัวแปรสภาพแวดล้อมอธิบายผลกระทบต่อบัญชีและค่าใช้จ่ายของแต่ละโหมดเครดิตไว้แล้ว

จุดที่เกี่ยวข้อง:

  • open-sse/executors/antigravity.ts — อ่าน process.env.ANTIGRAVITY_CREDITS
  • src/lib/oauth/providers/antigravity.ts — การเชื่อมต่อข้อมูลรับรอง
  • รายงานเหตุการณ์ต้นฉบับ: การสนทนา #1183

รีจิสทรีลายนิ้วมือ CLI — open-sse/config/cliFingerprints.ts

ตารางแยกตามผู้ให้บริการที่กำหนดลำดับส่วนหัวและลำดับฟิลด์ในเนื้อหา JSON แบบ ตรงกันทุกประการ ซึ่งบันทึกจากทราฟฟิก mitmproxy ของ CLI อย่างเป็นทางการ ปัจจุบันลงทะเบียนไว้แล้ว: codex, claude รวมถึงโปรไฟล์ที่สร้างขึ้นขณะรันใน providerHeaderProfiles.ts สำหรับ antigravity และ github

interface CliFingerprint {
  headerOrder: string[]; // คำนึงถึงตัวพิมพ์เล็ก-ใหญ่
  bodyFieldOrder: string[]; // คีย์ JSON ระดับบนสุด
  userAgent?: string | (() => string);
  extraHeaders?: Record<string, string>;
}

เปิดหรือปิดแยกตามผู้ให้บริการผ่าน env (ดูด้านล่าง) เมื่อปิดใช้งาน ส่วนหัว/คีย์ในเนื้อหาจะปรากฏตามลำดับที่ Node/JSON กำหนดมา ซึ่งง่ายต่อการระบุลายนิ้วมือ


พร็อกซี MITM (Antigravity, Linux/macOS/Windows)

สำหรับ CLI ที่ไม่สามารถเปลี่ยนเส้นทางไบนารีผ่าน OPENAI_BASE_URL ได้ OmniRoute จะเรียกใช้พร็อกซีภายในเครื่องที่ยุติการเชื่อมต่อ TLS เอนด์พอยต์อยู่ภายใต้ src/app/api/cli-tools/antigravity-mitm/

เมธอด เอนด์พอยต์ วัตถุประสงค์
GET /api/cli-tools/antigravity-mitm สถานะ — กำลังทำงาน, 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)

  1. สร้างใบรับรองแบบลงนามด้วยตนเองผ่าน selfsigned (RSA-2048, SHA-256, 1 ปี) — cert/generate.ts
  2. ติดตั้งใบรับรองลงในคลังความเชื่อถือของระบบ — cert/install.ts
  3. เพิ่มรายการ hosts 127.0.0.1 daily-cloudcode-pa.googleapis.comdns/dnsConfig.ts
  4. เรียกใช้ src/mitm/server.cjs พร้อม ROUTER_API_KEY + MITM_LOCAL_PORT (ค่าเริ่มต้น 443)
  5. บันทึก PID ลงใน <DATA_DIR>/mitm/.mitm.pid

การตรวจหาคลังความเชื่อถือแบบไดนามิกบน 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() (SHA-1 ของ DER)

นอกจากนี้ updateNssDatabases() จะติดตั้งลงในฐานข้อมูล NSS ของผู้ใช้แต่ละรายเมื่อมี certutil: ~/.pki/nssdb, ~/snap/chromium/.../nssdb และโปรไฟล์ Firefox ทั้งหมด (รวมถึง snap) โดยใช้ชื่อเล่น OmniRoute MITM Root CA

macOS / Windows

  • 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)

ตัวแปร ค่าเริ่มต้น
CLAUDE_USER_AGENT claude-cli/2.1.258 (external, cli)
CODEX_USER_AGENT codex-cli/0.149.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)

ตัวแปร ผลลัพธ์
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 และการทดสอบหน่วยอยู่เสมอ


การอัปเดตลายนิ้วมือเมื่อผู้ให้บริการเปลี่ยนค่า

  1. บันทึกทราฟฟิกจาก CLI อย่างเป็นทางการด้วย mitmproxy (การสกัดกั้น TLS + การดัมป์ข้อมูล)
  2. แยกค่า JA3/JA4 และลำดับส่วนหัวตามตัวอักษรจริง
  3. อัปเดตรายการ CLI_FINGERPRINTS[...] ที่เกี่ยวข้อง
  4. อัปเดตค่าเริ่มต้น *_USER_AGENT ที่ตรงกันใน .env.example
  5. หากแฮนด์เชก TLS เปลี่ยนแปลง ให้อัปเดตตัวห่อหุ้มของผู้ให้บริการที่เกี่ยวข้องหรือตัวเลือก browser: ของ wreq-js
  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 ยังคงมีอยู่

ดูเพิ่มเติม

  • RESILIENCE_GUIDE.md — สิ่งที่จะเกิดขึ้นเมื่อเส้นทางแบบล่องหนได้รับ 403
  • TROUBLESHOOTING.md
  • ENVIRONMENT.md — เอกสารอ้างอิงตัวแปรสภาพแวดล้อมฉบับสมบูรณ์
  • CLI-TOOLS.md — มุมมองของผู้ปฏิบัติงานต่อเวิร์กโฟลว์ MITM