- ChatGPT’de mesaj gönderilirken Cloudflare Turnstile programı çalıştırılıyor; bu program yalnızca tarayıcı parmak izini değil, React uygulama durumunu da inceliyor
- Şifresi çözülen program 55 özellik topluyor ve tarayıcı, ağ ve uygulama olmak üzere 3 katmanda doğrulama yapıyor
- Yalnızca React render’ının tamamlandığı gerçek bir SPA ortamında geçilebiliyor; bu nedenle headless tarayıcılar veya basit bot istekleri başarısız oluyor
- Toplanan parmak izi şifrelenerek
OpenAI-Sentinel-Turnstile-Token biçimine dönüştürülüyor; buna ek olarak Signal Orchestrator ve Proof of Work modülleri de çalışıyor
- Şifre çözme anahtarını yalnızca Cloudflare sunucuları bildiği için, gizlilik sınırı teknikten çok politika tarafından belirlenen bir yapıya dayanıyor
ChatGPT mesaj gönderiminde Cloudflare Turnstile çalışma yapısının analizi
- ChatGPT’de her mesaj gönderiminde tarayıcı içinde Cloudflare Turnstile programı otomatik olarak çalışıyor
- Ağ trafiğinde 377 Turnstile programının şifresi çözüldüğünde, bunun sıradan tarayıcı parmak izi toplamanın ötesine geçip React uygulama durumunu da denetlediği görülüyor
- Basit tarayıcı parmak izi taklidi yapan botlar doğrulamayı geçemiyor; doğrulamayı geçmek için ChatGPT’nin SPA’sının (tek sayfa uygulaması) tamamen render edilmesi gerekiyor
Şifreleme yapısı ve şifre çözme süreci
- Turnstile bayt kodu, sunucu yanıtındaki
turnstile.dx alanı üzerinden iletiliyor ve her istekte 28.000 karakter uzunluğunda bir base64 dizgesi olarak şifrelenmiş durumda
- Dış şifreleme katmanı
p token’ı ve XOR işlemiyle çözülebiliyor; iki değer de aynı HTTP isteği içinde değiş tokuş ediliyor
- Çözülen sonuç, 89 VM komutundan oluşan JSON biçimli bir bayt kodu
- İçeride 19 KB boyutunda ek bir şifreli blob bulunuyor; bu blob farklı bir XOR anahtarıyla şifrelenmiş
- Anahtar, bayt kodunun içindeki float literal değeri olarak (ör. 97.35) yer alıyor ve sunucu tarafından üretilip tarayıcıya gönderiliyor
- 50 isteğin tamamında aynı yöntemle geçerli JSON çözümü doğrulanmış
- Tüm şifre çözme süreci şu 5 adımdan oluşuyor
- İstekten
p token’ını oku
- Yanıttan
turnstile.dx alanını oku
XOR(base64decode(dx), p) → dış bayt kodunu üret
- 19 KB blob’dan sonraki 5 argümanlı komuttan son argümanı anahtar olarak çıkar
XOR(base64decode(blob), str(key)) → iç programın şifresini çöz (417~580 komut)
Şifresi çözülen programın denetim öğeleri
- İç program, 28 komutlu (opcode) özel bir VM üzerinde çalışıyor ve her istekte kayan nokta register adresleri rastgele değiştiriliyor
- Toplam 55 özellik (property) toplanıyor ve 377 örneğin tamamında aynı öğeler bulunuyor
-
Katman 1: Tarayıcı parmak izi
- WebGL ile ilgili 8 özellik:
UNMASKED_VENDOR_WEBGL, UNMASKED_RENDERER_WEBGL, WEBGL_debug_renderer_info vb.
- Ekran bilgisi 8 öğe:
colorDepth, pixelDepth, width, height, availWidth, availHeight, availLeft, availTop
- Donanım 5 öğe:
hardwareConcurrency, deviceMemory, maxTouchPoints, platform, vendor
- Yazı tipi ölçümü 4 öğe: gizli bir div oluşturulduktan sonra
fontFamily, fontSize, getBoundingClientRect, innerText ile render boyutu ölçülüyor
- DOM gezinimi 8 öğe:
createElement, appendChild, removeChild, style, position, visibility, ariaHidden vb.
- Depolama 5 öğe:
storage, quota, estimate, setItem, usage
- Sonuçlar, sayfa yeniden yüklemeleri arasında kalıcı olması için
localStorage içindeki 6f376b6560133c2c anahtarına kaydediliyor
-
Katman 2: Cloudflare ağı
- Edge header 5 öğe:
cfIpCity, cfIpLatitude, cfIpLongitude, cfConnectingIp, userRegion
- Bu değerler yalnızca Cloudflare ağı üzerinden mevcut; doğrudan origin sunucuya erişen botlarda bu alanlar eksik kalıyor veya uyuşmayan değerler oluşuyor
-
Katman 3: Uygulama durumu
- React iç yapısına ait 3 öğe:
__reactRouterContext, loaderData, clientBootstrap
- Bu öğeler yalnızca ChatGPT’nin React uygulaması tamamen render edildiğinde ve SSR hydration tamamlandığında mevcut oluyor
- Sadece HTML yükleyen ya da JS bundle’ını çalıştırmayan headless tarayıcılar veya React’i gerçekten çalıştırmayan bot framework’leri başarısız oluyor
Token üretim süreci
- 55 özellik toplandıktan sonra program, 116 baytlık şifreli blobun şifresini çözüp 4 son komutu çalıştırıyor
JSON.stringify(fingerprint) → store → XOR(json, key) → RESOLVE
- Ortaya çıkan sonuç
OpenAI-Sentinel-Turnstile-Token header’ına dönüştürülüyor ve tüm sohbet isteklerine ekleniyor
Sentinel’in ek bileşenleri
- Turnstile dışında iki ek doğrulama modülü daha bulunuyor
-
Signal Orchestrator
- 271 komuttan oluşuyor
keydown, pointermove, click, scroll, paste, wheel olay dinleyicileri kuruyor
window.__oai_so_* özelliklerinden 36 tanesini izleyerek tuşlama zamanlaması, fare hızı, kaydırma deseni, boşta kalma süresi, yapıştırma olayları gibi verileri takip ediyor
- Parmak izi toplamaya ek olarak davranış tabanlı biyometrik kimlik doğrulama katmanı görevi görüyor
-
Proof of Work
- 25 alanlı parmak izi + SHA-256 hashcash tabanlı
- Zorluk derecesi 400K~500K aralığında eşit dağılımlı rastgele sayı; çözümlerin %72’si 5 ms’nin altında tamamlanıyor
ai, createPRNG, cache, solana, dump, InstallTrigger, data dahil 7 ikili tespit bayrağı içeriyor (100 örneğin tamamında 0)
- Hesaplama maliyeti ekliyor ancak ana savunma aracı değil
Token’ın şifresini çözebilecek taraflar ve güvenlik anlamı
- İç programın XOR anahtarı sunucu tarafından üretilip bayt koduna gömüldüğü için, anahtarı yalnızca
turnstile.dx üreten sunucu biliyor
- Kullanıcı ile sistem işletmecisi arasındaki gizlilik sınırı, kriptografik kısıtlardan değil politik tercihlerden kaynaklanıyor
- Obfuscation’ın amacı
- Parmak izi toplama öğelerini statik analizden gizlemek
- Site işletmecisinin (OpenAI) ham parmak izi değerlerini doğrudan okuyamamasını sağlamak
- Her token’ı benzersiz kılarak yeniden kullanımını (replay) önlemek
- Cloudflare denetim öğelerini değiştirse bile bunun dışarıdan fark edilmesini zorlaştırmak
- Ancak şifreleme, aynı veri akışı içindeki anahtar ve XOR işlemiyle yapıldığı için, bu yapı yalnızca analizi zorlaştıran bir obfuscation düzeyi sunuyor
Toplama ve analiz istatistikleri
| Öğe |
Değer |
| Şifresi çözülen programlar |
377/377 (100%) |
| Gözlemlenen benzersiz kullanıcı |
32 |
| Program başına özellik sayısı |
55 (tamamı aynı) |
| Komut sayısı |
417–580 (ortalama 480) |
| XOR anahtarı (50 örnek) |
41 |
| Signal Orchestrator özellikleri |
36 |
| Proof of Work alanları |
25 |
| PoW çözüm süresi |
%72’si 5 ms altı |
Analiz metodolojisi
- Yalnızca yasal yollarla toplanmış trafik kullanıldı
- Kişisel kullanıcı verileri yayımlanmadı
- Tüm trafik katılımcıların onayıyla gözlemlendi
- Sentinel SDK (
sdk.js, 1.411 satır) üzerinde manuel deobfuscation ve çevrimdışı şifre çözme yapıldı
- Şifre çözme işlemi Python kullanılarak çevrimdışı ortamda gerçekleştirildi
1 yorum
Hacker News yorumları
Merhaba, ben OpenAI’nin Integrity ekibinde çalışan Nick’im
Bu kontrol; botlar, scraping, dolandırıcılık ve benzeri platform kötüye kullanımlarını önlemeye yönelik koruma önlemlerinin bir parçası
Amaç, ücretsiz ve giriş yapmamış kullanıcılara erişim sunmaya devam edebilmek için GPU kaynaklarını gerçek kullanıcılara öncelikli olarak ayırmak
Sayfa yükleme süresi, ilk token’a kadar geçen süre, payload boyutu gibi metrikleri izliyoruz ve koruma önlemlerinin ek yükünü en aza indirmeye odaklanıyoruz
Kullanıcıların çoğu için etkisi ihmal edilebilir düzeyde; yalnızca çok küçük bir kesim hafif gecikme yaşayabilir
Ayrıca yanlış pozitif oranını düşürürken kötüye kullanımı zorlaştıran hassasiyet iyileştirmelerini de sürekli değerlendiriyoruz
Nick’in açıklamasını anlıyorum ama gizlilik ile işlevsellik arasında seçim yapmak zorunda kaldığımız bir dünyada yaşamaya devam edip etmeyeceğimizi merak ediyorum
yazı yazarken gecikme, render takılması, hatta tamamen donma oluyor
Bunu hem iPhone 16 Safari’de hem de MacBook Pro M3 Chrome’da yaşıyorum
Şaka yollu, Cloudflare’ın gizliliği ihlal eden araçlarını çalıştırıp sonucu paylaşması da önerilmiş
Ben Pro abonesiyim ve ekibim birlikte ayda 2.000 doların üzerinde harcıyor
Ancak VPN (Mullvad) kullanırken, giriş yapmış olsam bile Chat arayüzü sık sık kopuyor ya da zaman aşımına uğruyor
Ücretli kullanıcıların, VPN kullanıp kullanmadıklarına bakılmaksızın hizmeti istikrarlı biçimde kullanabilmesi iyi olurdu
Cloudflare’ın “şüpheli” tarayıcı veya IP gerekçesiyle web’i neredeyse kullanılamaz hâle getirdiğine dair bir şikâyet
Sırf Firefox kullandığı için captcha cehennemine düştüğünü söylüyor
VPN, gizlilik odaklı tarayıcılar, nadir IP blokları gibi unsurlar yüzünden gizliliğe önem veren kullanıcılar daha sık takılıyor
Asıl botlar ise bu filtreleri kolayca aşıyor
Kendisi Firefox kullanıyor ama yalnızca normal düzeyde captcha gördüğünü söylüyor
CGNAT kapalı; acaba farkı yaratan bu mu diye merak ediyor
Banka zaten kimliğini doğrulamışken, sitenin insan olup olmadığını ayırt edememesi ona mantıksız geliyor
OpenAI, giriş yapmamış kullanıcılara ücretsiz ChatGPT sunduğu için, bunun ücretsiz bir API gibi suistimal edilmesini önlemeye çalışıyor gibi görünüyor
Android uygulamasında Play Integrity kontrolü çalışıyor ama Claude uygulaması yalnızca giriş istiyor, böyle bir doğrulama yok
Çerez ya da hesap olmadan soru yazınca yanıt gelmesine şaşırdığını söylüyor
API’ye kıyasla abonelik fiyatı çok daha ucuz olduğu için kötüye kullanımı önlemek gerekiyor
SPA yükleme kontrolü gibi bir şey büyük bir engel değil; bunu fark edenlerin zaten aşacak teknik bilgisi vardır
Başka şirketler de kendi anti-bot sistemlerini kuruyor
ChatGPT’nin React uygulamasının tamamen render edilmesi gerektiği için belirli bir özelliğin ancak o zaman var olması ilginç
Bu, tarayıcı seviyesinde değil uygulama katmanında bot tespiti anlamına geliyor
Gelişmiş tespit sistemlerinin çoğunun zaten böyle çalıştığını sanıyordum; bu keşfin neden özel sayıldığını merak ediyorum
Yazının neden önemli olduğunu yazar daha net anlatmalıydı
Sonuçta OpenAI’nin kullanıcıların resmî React uygulamasını kullanmasını istediği söyleniyor; bunun neden sorun olduğunu pek anlayamıyorum
Teknik açıdan ilginç
Bildiğim kadarıyla Turnstile temelde siteye özel ayarlar gerektirmiyor; OpenAI’nin Turnstile verisini kendi API’siyle nasıl birleştirdiğini merak ediyorum
Bot işletenlerin neden doğrudan Windows 11 VM + Chrome çalıştırmadığını anlamadığını söyleyen bir görüş
Bellek deduplikasyonu kullanılırsa aynı anda 50 VM çalıştırılabilir ve AWS fiyatlarıyla 1000 sayfa yükleme başına yaklaşık 1 sent gibi çok düşük bir maliyet çıkar diyor
IP rotasyonu, konum sahteciliği, dil ayarları, yerleşik parser gibi seçenekler sunuyorlar ve geçiş maliyeti düşük olduğu için bunu kendin kurmanın anlamı az
çünkü basit yöntemlere göre çok daha pahalı
Önerildiği gibi Windows yerine Linux container kullanılırsa çok daha hafif ve verimli olur
ChatGPT’nin yazdığı izlenimi veren özensiz bir yazı olduğu eleştirisi
2023~2024 döneminde KeepChatGPT adlı bir uzantı kullandığını söylüyor
API olmadan da kullanıcıyı taklit ederek çalışabilmesi ilginç gelmiş
Daha sonra Gemini’nin çıkışı ve sık hatalar nedeniyle kullanmayı bırakmış ama yapay zeka panelini sağ tarafa taşıma seçeneğini sevmiş
KeepChatGPT GitHub bağlantısı
Bu yöntem OpenAI’nin anti-bot sistemine hiç takılmıyor
Cloudflare ile uygulama arasındaki entegrasyonun standart Turnstile’ın ötesinde özel bir özellik mi yoksa yalnızca kurumsal sürüme mi ait olduğu soruluyor