4 poin oleh GN⁺ 23 hari lalu | 1 komentar | Bagikan ke WhatsApp
  • 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
    1. Membaca token p dari permintaan
    2. Membaca turnstile.dx dari respons
    3. XOR(base64decode(dx), p) → menghasilkan bytecode luar
    4. Mengekstrak argumen terakhir sebagai kunci dari instruksi 5-argumen setelah blob 19KB
    5. 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)storeXOR(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

 
GN⁺ 23 hari lalu
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

    • Menarik bahwa OpenAI menganggap scraping sebagai penyalahgunaan
    • Belakangan ini rasanya perlu satu browser yang mengizinkan semua verifikasi klien untuk memakai layanan penting, dan browser lain untuk mencegah pelacakan
      Saya paham penjelasan Nick, tetapi saya bertanya-tanya apakah kita akan terus hidup di dunia yang memaksa memilih antara privasi dan fungsionalitas
    • Saya tidak tahu apakah ini terkait, tetapi pada percakapan panjang performa UI Chat sangat buruk
      Ada input lag, render tersendat, bahkan macet total
      Saya mengalami hal yang sama di iPhone 16 Safari dan MacBook Pro M3 Chrome
    • Akun baru ini baru meninggalkan dua komentar, jadi wajar kalau orang bertanya apakah ini benar manusia atau bot yang membela OpenAI
      Ada juga usulan bercanda agar ia menjalankan alat pelanggar privasi milik Cloudflare dan membagikan hasilnya
    • Senang mendengar jawaban langsung dari orang OpenAI
      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

    • Definisi ‘mencurigakan’ versi Cloudflare terus meluas
      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
    • Ada saran untuk memeriksa apakah ada traffic web yang tidak dikenal keluar dari jaringan
      Orang itu sendiri memakai Firefox tetapi hanya melihat captcha pada tingkat yang normal
    • Saya memakai Firefox + Ublock Origin dan hampir tidak pernah melihat captcha
      Saya mematikan CGNAT, jadi penasaran apakah itu yang membuat perbedaan
    • Ada yang membagikan pengalaman absurd setelah pembayaran, harus menyelesaikan 15 captcha berturut-turut
      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

    • Ada yang bertanya apakah verifikasi semacam ini dilakukan terlepas dari status login
      Di aplikasi Android, pemeriksaan Play Integrity berjalan, sedangkan aplikasi Claude hanya meminta login tanpa verifikasi seperti itu
    • Ada yang membagikan pengalaman bahwa ChatGPT tetap bekerja tanpa login
      Ia terkejut karena bisa memasukkan pertanyaan dan mendapat jawaban tanpa cookie atau akun
    • Perlindungan seperti ini juga bertujuan melindungi pola penggunaan pelanggan Pro
      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
    • Memakai GPT‑5.2 seharga 20 dolar per bulan itu sangat bernilai, jadi sepertinya penyesuaian harga akan datang suatu saat nanti
    • copilot.microsoft.com tampaknya juga memakai perlindungan berbasis Cloudflare yang serupa
  • 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

    • Karena itu tulisannya terasa seperti artikel berkualitas rendah yang tampak ditulis AI
  • 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

    • Sudah ada banyak layanan yang menyediakan fungsi seperti ini dalam bentuk paket layanan
      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
    • Dalam praktiknya, pendekatan berbasis VM seperti ini cukup mahal sehingga punya efek penangkal dengan mengurangi jumlah bot
      Karena jauh lebih mahal daripada metode yang sederhana
    • Kalau melihat komunitas Reddit soal scraping, ketika akses dengan browser headless diblokir, para pengembang bot tampak sangat frustrasi
      Seperti usulan tadi, memakai container Linux alih-alih Windows jauh lebih ringan dan efisien
    • Ada yang meminta saran jika ada cara mudah menjalankan Windows 11 VM dengan akselerasi grafis yang baik tanpa GPU passthrough
  • Kritik bahwa ini adalah artikel kasar yang terasa seperti ditulis oleh ChatGPT

    • Ia bercanda, “ciri tradisional blog web adalah drafnya begitu berantakan sampai model bahasa pun perlu revisi kedua
  • 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

    • Ia sendiri memakai aplikasi helper kecil yang menggunakan WinForms WebView untuk mengirim kueri ke ChatGPT dan menerima respons JSON
      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