- Saat mengirim pesan di ChatGPT, program Cloudflare Turnstile dijalankan dan memeriksa bukan hanya sidik jari browser tetapi juga state aplikasi React
- Program yang telah didekripsi mengumpulkan 55 properti dan menjalankan prosedur verifikasi dalam 3 lapisan: browser, jaringan, dan aplikasi
- Hanya bisa lolos dalam lingkungan SPA nyata saat render React telah selesai, sehingga browser headless atau permintaan bot sederhana akan gagal
- Sidik jari yang dikumpulkan dienkripsi lalu diubah menjadi
OpenAI-Sentinel-Turnstile-Token, dan di atasnya modul Signal Orchestrator serta Proof of Work juga ikut berjalan
- Hanya server Cloudflare yang mengetahui kunci dekripsi, sehingga batas privasi ditentukan oleh kebijakan, bukan oleh teknologi
Analisis struktur kerja Cloudflare Turnstile saat mengirim pesan di ChatGPT
- Setiap kali ChatGPT mengirim pesan, program Cloudflare Turnstile otomatis dijalankan di dalam browser
- Dari hasil mendekripsi 377 program Turnstile dari lalu lintas jaringan, terlihat bahwa mekanisme ini tidak hanya mengumpulkan sidik jari browser biasa tetapi juga memeriksa state aplikasi React
- Bot yang hanya memalsukan sidik jari browser tidak dapat lolos; verifikasi hanya bisa lolos jika SPA (single-page application) ChatGPT dirender sepenuhnya
Struktur enkripsi dan proses dekripsi
- Bytecode Turnstile dikirim melalui field
turnstile.dx dalam respons server, dan dienkripsi sebagai string base64 sepanjang 28.000 karakter pada setiap permintaan
- Lapisan enkripsi luar dapat didekripsi dengan token
p dan operasi XOR, dan kedua nilai itu dipertukarkan dalam permintaan HTTP yang sama
- Hasil dekripsinya berupa bytecode JSON yang terdiri dari 89 instruksi VM
- Di dalamnya ada blob terenkripsi tambahan berukuran 19KB, dan blob ini dienkripsi dengan kunci XOR lain
- Kuncinya disisipkan sebagai nilai literal float dalam bytecode (misalnya 97.35), dibuat oleh server lalu dikirim ke browser
- Pada seluruh 50 permintaan, dekripsi JSON yang valid terkonfirmasi dengan cara yang sama
- Seluruh prosedur dekripsi terdiri dari 5 tahap berikut
- Membaca token
p dari permintaan
- Membaca
turnstile.dx dari respons
XOR(base64decode(dx), p) → menghasilkan bytecode luar
- Mengekstrak argumen terakhir sebagai kunci dari instruksi 5-argumen setelah blob 19KB
XOR(base64decode(blob), str(key)) → mendekripsi program internal (417~580 instruksi)
Item pemeriksaan dalam program yang didekripsi
- Program internal berjalan di atas VM kustom dengan 28 instruksi (opcode), dan alamat register floating-point diacak pada setiap permintaan
- Total mengumpulkan 55 properti, dan semua 377 sampel berisi item yang sama
-
Layer 1: Sidik jari browser
- 8 properti terkait WebGL:
UNMASKED_VENDOR_WEBGL, UNMASKED_RENDERER_WEBGL, WEBGL_debug_renderer_info, dll.
- 8 informasi layar:
colorDepth, pixelDepth, width, height, availWidth, availHeight, availLeft, availTop
- 5 item perangkat keras:
hardwareConcurrency, deviceMemory, maxTouchPoints, platform, vendor
- 4 pengukuran font: membuat div tersembunyi lalu mengukur ukuran render dengan
fontFamily, fontSize, getBoundingClientRect, innerText
- 8 penelusuran DOM:
createElement, appendChild, removeChild, style, position, visibility, ariaHidden, dll.
- 5 item penyimpanan:
storage, quota, estimate, setItem, usage
- Hasilnya disimpan di
localStorage dengan key 6f376b6560133c2c agar tetap bertahan antar reload halaman
-
Layer 2: Jaringan Cloudflare
- 5 header edge:
cfIpCity, cfIpLatitude, cfIpLongitude, cfConnectingIp, userRegion
- Nilai-nilai ini hanya ada melalui jaringan Cloudflare, sehingga bot yang mengakses origin server secara langsung akan menghasilkan nilai yang hilang atau tidak cocok
-
Layer 3: State aplikasi
- 3 struktur internal React:
__reactRouterContext, loaderData, clientBootstrap
- Item-item ini hanya ada ketika aplikasi React ChatGPT telah dirender sepenuhnya dan hidrasi SSR telah selesai
- Browser headless yang hanya memuat HTML atau tidak menjalankan bundle JS, atau framework bot yang tidak benar-benar menjalankan React, akan gagal
Proses pembuatan token
- Setelah mengumpulkan 55 properti, program mendekripsi blob terenkripsi 116 byte lalu menjalankan 4 instruksi final
JSON.stringify(fingerprint) → store → XOR(json, key) → RESOLVE
- Hasilnya diubah menjadi header
OpenAI-Sentinel-Turnstile-Token dan disertakan dalam semua permintaan percakapan
Komponen tambahan Sentinel
- Selain Turnstile, ada dua modul verifikasi tambahan
-
Signal Orchestrator
- Terdiri dari 271 instruksi
- Memasang event listener untuk
keydown, pointermove, click, scroll, paste, wheel
- Melacak 36 properti
window.__oai_so_* untuk memantau timing penekanan tombol, kecepatan mouse, pola scroll, waktu idle, dan event paste
- Di luar pengumpulan sidik jari, modul ini berperan sebagai lapisan autentikasi biometrik berbasis perilaku
-
Proof of Work
- Berbasis sidik jari 25 field + SHA-256 hashcash
- Tingkat kesulitan adalah bilangan acak seragam di kisaran 400K~500K, dan 72% selesai dalam 5ms atau kurang
- Memuat 7 flag deteksi biner seperti
ai, createPRNG, cache, solana, dump, InstallTrigger, data (semuanya 0 pada 100 sampel)
- Menambah biaya komputasi, tetapi bukan mekanisme pertahanan utama
Pihak yang dapat mendekripsi token dan makna keamanannya
- Karena kunci XOR program internal dibuat oleh server dan disisipkan ke dalam bytecode, maka hanya server yang menghasilkan
turnstile.dx yang mengetahui kuncinya
- Batas privasi antara pengguna dan operator sistem ditentukan oleh keputusan kebijakan, bukan batasan kriptografis
- Tujuan obfuscation adalah
- Menyembunyikan item pengumpulan sidik jari dari analisis statis
- Mencegah operator situs (OpenAI) membaca langsung nilai sidik jari mentah
- Membuat setiap token unik untuk mencegah replay
- Menyulitkan pihak luar mengetahui perubahan item pemeriksaan saat Cloudflare mengubahnya
- Namun, enkripsinya dilakukan dengan kunci dan operasi XOR dalam aliran data yang sama, sehingga hanya merupakan obfuscation tingkat pencegahan analisis
Statistik pengumpulan dan analisis
| Item |
Nilai |
| Program yang didekripsi |
377/377 (100%) |
| Pengguna unik yang diamati |
32 |
| Jumlah properti per program |
55 (semuanya sama) |
| Jumlah instruksi |
417–580 (rata-rata 480) |
| Kunci XOR (50 sampel) |
41 |
| Properti Signal Orchestrator |
36 |
| Field Proof of Work |
25 |
| Waktu penyelesaian PoW |
72% dalam 5ms atau kurang |
Metodologi analisis
- Hanya menggunakan lalu lintas yang dikumpulkan melalui prosedur yang sah
- Data pengguna pribadi tidak dipublikasikan
- Semua lalu lintas diamati dengan persetujuan peserta
- SDK Sentinel (
sdk.js, 1.411 baris) menjalani deobfuscation manual dan dekripsi offline
- Dekripsi dilakukan di lingkungan offline menggunakan Python
1 komentar
Komentar Hacker News
Halo, saya Nick dari tim Integrity OpenAI
Pemeriksaan ini adalah bagian dari langkah perlindungan untuk mencegah penyalahgunaan platform seperti bot, scraping, dan penipuan
Tujuannya adalah memprioritaskan alokasi sumber daya GPU untuk pengguna nyata agar akses tetap tersedia bagi pengguna gratis dan yang tidak login
Kami memantau waktu muat halaman, waktu hingga token pertama, ukuran payload, dan sebagainya, serta berfokus meminimalkan overhead dari langkah perlindungan ini
Dampaknya kecil bagi sebagian besar pengguna, dan hanya sebagian yang sangat kecil yang mungkin mengalami sedikit penundaan
Kami juga terus mengevaluasi peningkatan presisi agar penyalahgunaan lebih sulit dilakukan sambil menurunkan false positive rate
Saya paham penjelasan Nick, tetapi saya bertanya-tanya apakah kita akan terus hidup di dunia yang memaksa memilih antara privasi dan fungsionalitas
Ada input lag, render tersendat, bahkan macet total
Saya mengalami hal yang sama di iPhone 16 Safari dan MacBook Pro M3 Chrome
Ada juga usulan bercanda agar ia menjalankan alat pelanggar privasi milik Cloudflare dan membagikan hasilnya
Saya pelanggan Pro, dan seluruh tim saya menghabiskan lebih dari 2.000 dolar per bulan
Tetapi saat memakai VPN (Mullvad), antarmuka Chat sering terputus atau timeout meski saya sedang login
Akan bagus jika pengguna berbayar bisa memakai layanan dengan stabil terlepas dari penggunaan VPN
Keluhan bahwa Cloudflare membuat web hampir tak bisa dipakai dengan alasan browser atau IP yang ‘mencurigakan’
Ia menggambarkannya sebagai neraka captcha hanya karena menggunakan Firefox
VPN, browser yang berfokus pada privasi, rentang IP langka, dan pengguna yang peduli privasi justru paling sering terkena
Sementara bot sebenarnya bisa melewati filter seperti ini dengan mudah
Orang itu sendiri memakai Firefox tetapi hanya melihat captcha pada tingkat yang normal
Saya mematikan CGNAT, jadi penasaran apakah itu yang membuat perbedaan
Bank sudah memverifikasi identitasnya, jadi sulit dipahami mengapa situs masih tidak bisa membedakan manusia dari bukan
Karena OpenAI menyediakan ChatGPT gratis untuk pengguna yang tidak login, tampaknya mereka ingin melindunginya agar tidak disalahgunakan seperti API gratis
Di aplikasi Android, pemeriksaan Play Integrity berjalan, sedangkan aplikasi Claude hanya meminta login tanpa verifikasi seperti itu
Ia terkejut karena bisa memasukkan pertanyaan dan mendapat jawaban tanpa cookie atau akun
Harga langganan jauh lebih murah dibanding API, jadi pencegahan penyalahgunaan memang diperlukan
Pemeriksaan pemuatan SPA bukan hambatan besar, dan orang yang sadar akan hal itu kemungkinan sudah punya teknik untuk melewatinya
Perusahaan lain juga masing-masing membangun sistem anti-bot sendiri
Menarik bahwa properti tertentu di aplikasi React ChatGPT baru ada setelah aplikasi dirender sepenuhnya
Ini berarti deteksi bot dilakukan di lapisan aplikasi, bukan di level browser
Saya kira sebagian besar sistem deteksi canggih bekerja seperti ini, jadi saya penasaran apakah temuan kali ini punya makna khusus
Akan lebih baik jika penulis menjelaskan dengan lebih jelas mengapa masalah ini penting
Pada akhirnya, OpenAI hanya ingin pengguna memakai aplikasi React resmi, dan saya kurang paham mengapa itu dianggap masalah
Menarik dari sudut pandang teknis
Setahu saya, Turnstile pada dasarnya tidak memiliki konfigurasi per situs, jadi saya penasaran bagaimana OpenAI menggabungkan data Turnstile dengan API mereka sendiri
Ada pendapat bahwa sulit memahami mengapa operator bot tidak langsung menjalankan Windows 11 VM + Chrome
Dengan deduplikasi memori, 50 VM bisa dijalankan sekaligus, dan di AWS biayanya sangat murah, sekitar 1 sen per 1000 page load
Opsi seperti rotasi IP, spoofing lokasi, pengaturan bahasa, parser bawaan, dan lainnya sangat beragam, dan biaya pindahnya juga rendah sehingga tidak banyak alasan untuk membangun sendiri
Karena jauh lebih mahal daripada metode yang sederhana
Seperti usulan tadi, memakai container Linux alih-alih Windows jauh lebih ringan dan efisien
Kritik bahwa ini adalah artikel kasar yang terasa seperti ditulis oleh ChatGPT
Pada 2023~2024, ada yang pernah memakai ekstensi KeepChatGPT
Menarik karena ia bekerja dengan menyamar sebagai pengguna tanpa API
Setelah itu penggunaan dihentikan karena kemunculan Gemini dan error yang sering terjadi, tetapi opsi memindahkan panel AI ke sisi kanan tetap disukai
Tautan GitHub KeepChatGPT
Metode ini sama sekali tidak terkena sistem anti-bot OpenAI
Ada pertanyaan apakah integrasi antara Cloudflare dan aplikasi ini merupakan fitur kustom yang melampaui Turnstile standar, atau hanya tersedia untuk pelanggan enterprise