4Chan CAPTCHA’sını Çözmek
(nullpt.rs)- Tarayıcı içinde 4Chan CAPTCHA’larını otomatik çözmek için TensorFlow.js modeli geliştiren bir proje; hedeflenen en az %80 ve tercih edilen %90 üzeri doğruluk oranına ulaştı
- CAPTCHA toplama süreci, istek API’sindeki
ttl,cd, Cloudflare Turnstile ve kademeli artan bekleme süreleri nedeniyle basit toplu scraping ile yönetilemeyecek kadar zordu - Ticari insan tabanlı çözüm hizmetleri ve manuel etiketleme hatalara ve throttling’e takıldı; yaklaşık 2.500 gerçek arka plan ve karakter başına 50–150 görüntüyle yaklaşık 50.000 sentetik veri üretilerek eğitim ölçeği sağlandı
- Model CNN+LSTM yapısı ve CTC kodlaması kullandı; Keras/TensorFlow ile eğitimden sonra Python 3.10, Keras 2 ve
.h5formatı üzerinden TensorFlow.js’ye dönüştürüldü - Gerçek tarayıcıda ilk yükleme yaklaşık 1 saniye sürdü, sonraki çalıştırmalar hissedilir biçimde anında işlendi ve yüzlerce gerçek CAPTCHA’da %90’ın üzerinde başarı oranı gösterdi
Hedef ve açık kod
- Amaç, makine öğrenimi ve TensorFlow eğitimini de öğrenerek 4Chan CAPTCHA’sını tarayıcıda güvenilir biçimde çözen bir model oluşturmaktı
- Eşik en az %80 doğruluk, mümkünse %90 üzeriydi ve sonuçta buna ulaşıldı
- İlgili kod GitHub’daki 4chan-captcha-playground deposunda yayımlandı
4Chan CAPTCHA’sının çalışma biçimi
- 4Chan, gönderi veya yanıt yazmadan önce CAPTCHA girişi istiyor
- Normal CAPTCHA, içinde 5–6 alfasayısal karakter bulunan bir görüntüden oluşuyor ve kullanıcının tüm karakterleri doğru girmesi gerekiyor
- Slider CAPTCHA ise rastgele karakter parçaları gibi görünen bir arka plan görüntüsüyle, şeffaf deliği olan bir ön plan görüntüsünü hizalayarak CAPTCHA metnini görünür kılma yöntemiyle çalışıyor
CAPTCHA toplamada karşılaşılan sınırlamalar
- Yeni CAPTCHA istekleri incelendiğinde tarayıcının
https://sys.4chan.org/captcha?framed=1&board={board}adresine istek gönderdiği görülüyor framed=1kaldırıldığında HTML içindekipostMessage()yerine ham JSON döndürülüyor- JSON içinde
challenge,ttl,cd,img,img_width,img_height,bg,bg_widthgibi alanlar bulunuyor ttl, CAPTCHA’nın yaklaşık 2 dakika sonra süresinin dolacağını gösteren süre gibi görünüyorcd, bir sonraki CAPTCHA isteğine kadar beklenmesi gereken cooldown değeri olarak yorumlanıyor
- JSON içinde
- Ardışık istekler gönderildiğinde
cdgiderek büyüyor- İlk birkaç istekte 5 saniyede bir istek yapılabiliyor
- Sonra 8 saniyeye çıkıyor ve devamında yaklaşık iki katına katlanarak artıyor
- Sonunda 280 saniyede üst sınıra ulaşıyor
- 280 saniyelik zamanlayıcıya ulaşıldıktan sonra CAPTCHA daha zor hale geliyor
- Birden çok yatay çizgi ve elips biçimli bozucu unsur eklenmiş görüntüler ortaya çıkıyor
- Veri kalitesi düşüyor ama yine de kullanılabilir durumda kalıyor
- CAPTCHA isteğinden önce Cloudflare Turnstile geçişi gerekiyor
- Çok sayıda proxy ve basit script kullanma yöntemi pratik değildi
- Toplama script’i, tarayıcıdan Cloudflare çerezlerini kopyalayıp kullanıyor; süreleri dolduğunda bunlar elle değiştiriliyordu
- Bu yöntemle yüzlerce CAPTCHA toplandı, ancak bu miktar eğitim için yeterli değildi ve doğru yanıt etiketleri de yoktu
İnsan tabanlı etiketlemenin sınırları
- Slider CAPTCHA hizalama,
trainer/captcha_aligner.pyiçindeki sezgisel script ile %100 başarı oranı gösterdi - CAPTCHA’ları ticari bir CAPTCHA çözüm hizmetine gönderip gerçek insanların yanıt girmesini sağlayan
trainer/labeler.pyyazıldı - İlk gönderilen onlarca CAPTCHA’nın çoğunda en az bir karakter yanlış çözüldü
- Hizmetin “100% Recognition” özelliği kullanılarak, yalnızca birden fazla çalışanın yanıtı eşleştiğinde sonuç alınacak şekilde ayarlandı
- Ayarlar
n = 2,x = 2,y = 3idi - Önce 2 kişiye gönderiliyor; ikisi eşleşmezse, iki kişinin yanıtı eşleşene kadar en fazla 3 kişiye daha gönderiliyordu
- Ayarlar
- Bu ayarla CAPTCHA’ların yaklaşık %80’i çözüldü; bunların yaklaşık %90’ı doğruydu ama yaklaşık %10’unda hata vardı
- Birden fazla çalışanın aynı hatayı yaptığı durumlar vardı
- Kendi başına veya tanıdıkların yardımıyla CAPTCHA çözerek görüntü ve yanıtı kaydeden bir kullanıcı script’i de kullanıldı
- Eğitim setine eklemek için yüzlerce görüntü daha elde edildi
- Tekrarlı istek throttling’i ve CAPTCHA zorluğunun artması nedeniyle bu yaklaşımdan vazgeçildi
Sentetik veri üretimi
- 4Chan ve ilgili CAPTCHA kodu açık kaynak olmadığı için aynı kodu yerelde çalıştırmak mümkün değildi
- Bunun yerine gerçek CAPTCHA yapısına yaklaşan sentetik CAPTCHA’lar üretildi
- CAPTCHA, arka plan ve karakterler olmak üzere iki bölüme ayrılarak ele alındı
- Arka plan, gerçek görüntülerde büyük contour bulunup karakter alanı çıkarılarak elde edildi
- Karakterler çıkarıldıktan sonra geriye yalnızca gürültülü arka plan kaldı
- Tekil karakterler manuel etiketlemeyle elde edildi
- Karakterleri etiketlemek için VoTT kullanıldı
- Basit bir script ile karakterler çıkarıldı ve son işleme tabi tutuldu
- Karakter başına 50–150 izole görüntü elde edildi
- 4Chan CAPTCHA’sında yalnızca
0, 2, 4, A, D, G, H, J, K, M, N, P, R, S, T, W, X, Ybulunuyor- Bunun belirsizliği önlemeye yönelik bir seçim olması muhtemel
- Çıkarılan karakterler ve arka planlar birleştirildi; gözlemlenen karakter yerleşim desenlerine uygun sentetik görüntüler üretildi
- Girdi karakterleri zaten etiketli olduğu için sentetik CAPTCHA’ların doğru yanıtları da otomatik üretilebildi
Model yapısı ve ön işleme
- Eğitim verisi, önceden hizalanmış slider CAPTCHA’ları, normal CAPTCHA’lar ve sentetik CAPTCHA’lar karıştırılarak kullanıldı
- Eğitim script’i tüm görüntüleri 300x80 piksele ayarlıyor ve saf siyah-beyaza dönüştürüyordu
- Model, CAPTCHA çözümüyle ilgili çeşitli yazılardan yararlanılarak oluşturulan bir LSTM CNN yapısıydı
- 3 convolution/max-pooling katmanı kullanıldı
- 2 LSTM katmanı kullanıldı
-
- convolution katmanı da denendi ancak performansı iyileştirmedi
- Çıktı uzunluğu 5 veya 6 karakter olarak değişken olduğu için CTC kodlaması kullanıldı
- Uygulamada Keras ve TensorFlow kullanıldı
tf.image.resize() argüman sırası sorunu
- Bazı eski hizalanmış slider CAPTCHA’ları 300x80 çözünürlüğe veya en-boy oranına uymuyordu
- Eğitim script’inin farklı girdileri işlemesi için
tf.image.resize()kullanıldı - Başta boyut argümanının
(width, height)tuple’ı olduğu varsayıldı, ancak gerçektetf.image.resize()(height, width)sırasını istiyor - Bu hata yüzünden görüntüler 80x300 gibi dikey olarak uzamış, okunamaz bir biçime dönüştü
- 32 epoch’tan fazla eğitimden sonra bile görülen görüntülerde performans neredeyse hiç çıkmadı
- Yeni CAPTCHA’larda rastgeleye yakın tahminler üretti
- İşlenmiş girdi görüntüleri görselleştirilerek sorun doğrulandı ve düzeltmeden sonra eğitim performansı büyük ölçüde iyileşti
Eğitim ölçeği ve sonuçlar
- Nihai veri seti yaklaşık 500 manuel çözülmüş görüntü ve yaklaşık 50.000 sentetik görüntüden oluştu
- Sentetik görüntüler, yaklaşık 2.500 arka plan görüntüsü ve karakter başına 50–150 görüntüden rastgele örnekleme yapılarak üretildi
- Veri seti rastgele karıştırıldıktan sonra 90/10 oranında eğitim ve değerlendirme setlerine ayrıldı
- NVIDIA RTX A4000 Laptop GPU’da epoch başına eğitim süresi yaklaşık 45 saniyeydi
- İlk epoch sonunda loss 19 seviyesindeydi ve tahminler neredeyse hiç doğru değildi
-
- epoch sonunda loss 0,55’e düştü ve 5 rastgele test tahmininin 5’i de doğru çıktı
- 8–16 epoch, süre ile nihai performans arasında iyi bir dengeydi
-
- epoch civarında loss kararlı hale geldi
- 16 epoch’u geçince iyileşme payı belirgin biçimde azaldı
-
- Python’da çıkarımı test etmek için
trainer/infer.pykullanıldı ve görülmemiş görüntülerde de sonuçlar umut vericiydi
TensorFlow.js dönüşümü ve tarayıcıda çalıştırma
- Kullanıcı script’i TensorFlow.js ve TypeScript ile yazıldı
- Python kodundaki CAPTCHA hizalama algoritması ve görüntü ön işleme kodu yeniden uygulandı
- İlgili kod, deponun
user-scripts/dizininde bulunuyor - Python TensorFlow/Keras model formatı, TensorFlow.js’nin beklediği formatla uyumlu değil
- Resmi dönüşüm script’inin kullanılması gerekiyordu, ancak iki sorun vardı
- Resmi TensorFlow-to-TFJS dönüştürücü Python 3.12 üzerinde çalışmadı ve hata mesajı da net değildi
- PyEnv ile Python 3.10 kullanıldığında dönüşüm başarılı oldu
- Dönüşüm script’i Keras 3 modelini TensorFlow.js formatına dönüştürebiliyordu, ancak TensorFlow.js dönüştürülmüş modeli pratikte okuyamadı
- İlgili sorun forum post üzerinden doğrulandı
- Çözüm Keras 2 kullanmaktı
tf_keraslegacy paketi kuruldu- Eğitim için
TF_USE_LEGACY_KERAS=1ortam değişkeni ayarlandı - Legacy
.h5model formatına dışa aktarıldı ve dönüşüm script’ine girdi formatı belirtildi - Kod değişikliği yalnızca tek satırlık basit bir düzeltme gerektirdi
Gerçek 4Chan CAPTCHA performansı
- Model gerçek 4Chan CAPTCHA’larında da iyi çalıştı
- İlk model yüklemesi yaklaşık 1 saniye sürdü
- Sonraki çalıştırmalar hissedilir biçimde anında işlendi
- Tarayıcıda yüzlerce gerçek CAPTCHA çözme deneyimine göre başarı oranı %90’ın üzerindeydi
- Karakterin kendisini yanlış tahmin etme nadirdi; yanlış olduğunda genellikle bir karakteri tamamen atlıyordu
- Gerçek veri eğitimini daha da artırarak veya sentetik veri üreticisinin CAPTCHA yerleşimini ayarlayarak iyileştirme alanı var
- Bu modelin doğruluğu, ticari insan tabanlı CAPTCHA çözüm hizmetinden çok daha yüksekti
4 karakterli CAPTCHA ve kapanış
- Proje tamamlandıktan sonra yazı hazırlanıp düzenlenirken 4Chan zaman zaman 4 karakterli CAPTCHA sunmaya başladı
- Model yalnızca 5 ve 6 karakterli CAPTCHA’larla eğitilmiş olsa da 4 karakterli CAPTCHA’larda da aynı düzeyde performans gösterdi
- Proje sürecinde makine öğrenimi ve bilgisayarlı görü hakkında çok şey öğrenildi ve başlangıç hedefi olan tarayıcı tabanlı CAPTCHA çözme modeli tamamlandı
1 yorum
Hacker News yorumları
Keras ile TensorFlow.js entegrasyonunun dağınık olması tipik TensorFlow gibi
TensorFlow kullandığımda hep bütünleşik ve pürüzsüz bir üründen ziyade, kabaca ilişkili görünen araçların tek bir çatı altında toplanmış hali gibi hissettirdi
Aslında Google'ın açık kaynak kütüphaneleri ya da araçlarının hepsi için böyle denebilir
“2019'da Keras'ı neden TensorFlow'a dahil etmeye karar verdiniz?” sorusunun cevabı şuydu: “Bu benim kararım değildi. 2018'de TF liderlerinin aldığı bir karardı; o sırada ben L5 seviyesinde bireysel katkı sağlayan biriydim, bu ise L8 seviyesinde bir karardı”
Kendi sitemde[0] yorum formu spam'ini engellemek için CAPTCHA gerekiyordu; daha önce gördüğüm eğlenceli bir yöntemi yeniden kullandım
Kesinlikle kusursuz da değil, zor da değil ama yapım sürecini gerçekten sevdim
[0] https://www.hybridlogic.co.uk/contact
https://vivirenremoto.github.io/doomcaptcha/
İnsanların bozulmuş metin tabanlı CAPTCHAlardan uzaklaşmasının bir nedeni var
Artık bilgisayarların insanlardan daha iyi çözdüğü noktaya neredeyse geldik
https://www.usenix.org/system/files/conference/woot14/woot14... bu konuda bir makale ve bence oldukça ilginç
Yine de şaşırtıcı derecede çok sayıda metin tabanlı CAPTCHA, ImageMagick ile gri tonlamaya çevirme, genişletme ve aşındırma işlemleri uygulayıp ardından Tesseract'a veren birkaç satırlık shell script ile çözülebiliyor
Ama https://2captcha.net gibi siteler de var; sonuçta CAPTCHA daha çok asgari düzeyde küçük bir zahmet gerektiren bir mekanizma
Bu yazıdaki çözüm için de ciddi zaman, beceri ve emek harcanmış; ortaya çıkan sonuç da pek genelleştirilebilir değil, farklı türde bir CAPTCHA için baştan yapmak gerekir
Spam gönderenlerin çoğu bunu yeniden üretemez; üretebilenler de muhtemelen yasal yollardan para kazanır ya da daha kârlı hedeflerin peşine düşer
Bu tür CAPTCHA'lar, başarılı spam'in maliyetini beklenen getirinin üzerine çıkarmakta hâlâ iyi iş görüyor
Her üyenin moderatörle 15 dakikalık görüntülü mülakat yapmak zorunda olduğu bir forum kurulabilir mi? “Ölçeklenebilir değil” olduğunu biliyorum ama komik bir şaka düzeneği olarak mümkün görünüyor
Bir çözüm değil; yavaş yavaş eskiyen küçük bir kale gibi
Bağlantıya göre reCAPTCHA v3 10-15 saniye sürüyor ve 1000 CAPTCHA başına 1,3 dolar maliyet çıkarıyor
Büyük bir web sitesini büyük ölçekte kazımak gibi CAPTCHA'yı aşmak isteyeceğiniz birçok işte bu maliyet gerçekten ciddi ve karşılanması zor hale geliyor
mCaptcha.org bunlardan biri, başka uygulamalar da var
Geleneksel CAPTCHA'lar azıcık bile etkili olduğunda erişilebilirlik açısından kâbusa dönüşmeye yatkın
Bu tür konular ilginizi çekiyorsa, 2014'te derlediğim Silk Road CAPTCHA analizi de var: https://github.com/mieko/sr-captcha
4chan'in tepkisi uygun görünüyor
Nasılsa sinir ağlarıyla kolayca çözülebiliyor; bu yüzden insanlara verilen işi basitleştirme yönüne gidiyor
Artık çok zor CAPTCHA tasarlasanız bile makinelerin çözmesini zorlaştırma ihtimali düşük, insanları daha fazla sinirlendirme ihtimali yüksek
https://4chan.org/pass
Zaten CAPTCHA'sız yazmak için bir seçenek olarak sunuluyor
CAPTCHA tamamen etkisizse, CAPTCHA'yı ve ücretsiz yazı yazmayı kaldırıp yazmak isteyen herkesin 4chan Pass alması gerektiği sonucu çıkar
Yakın zamanda 15 dakikalık yazı yazma gecikmesi getirdiler ve gerçekten sinir bozucu
Cookie AutoDelete'te 4chan'i izin verilenler listesine almam gerekti
CAPTCHA varmış gibi yapmaktansa aslında kullanıcının zamanlamasını ve davranışlarını analiz etmek daha iyi olmaz mı diye düşünüyorum
Açıkçası bunun zaten yapılıyor olabileceğini de sanıyorum
Tamamen meta düzeye çıkarsak, karşı taraftaki aktörün insan olup olmadığını değerlendirmesi için yapay zekayı eğitmek de mümkün
Yani ters Turing testi icat etmiş oluyoruz; yapay zeka, normal bir insanın yanıtından ayırt edemiyorsa onu insan kabul eden bir yöntem
Farkı, pazarlama amaçlı insan yanıtlarından ayırt etmekle ilgili olmaması
Sırf bu düşünce bile midemi bulandırdı, gidip uzanmam lazım
CAPTCHA göstermeden önce TLS parmak izi, IP, HTTP/2, istekler, JavaScript ortamı, yazı tipleri ve görsel işleme yeteneği, tarayıcının kendisi gibi şeyleri önce tanımlıyorlar
Bu bilgilerle bir güven puanı hesaplayıp daha en başta CAPTCHA gösterip göstermeyeceklerine karar veriyorlar
Ancak ondan sonra CAPTCHA girişini analiz etmenin anlamı oluyor; ama o noktaya gelindiğinde botların %90’ı zaten yakalanmış oluyor
Bir tarayıcının hiçbir farkındalık olmadan sunucuya bildirebildiği bilgi miktarı akıl almaz düzeyde; bu yüzden her birimizin dijital parmak izinin gerçek parmak izinden bile daha benzersiz olma ihtimali yüksek
4chan CAPTCHA’sını aşmanın öncü örneklerinden birinin hâlâ Yannick Kilcher’ın “Raiders of the Lost Kek” veri kümesiyle GPT-J’ye ince ayar yapması olduğunu düşünüyorum
Videoya çekilmiş büyük dil modeli kullanımlarının en havalı örneklerinden biri olabilir: https://youtu.be/efPrtcLdcdM?si=errY0PrEhnX9ylDw
Kayıtlara geçecek cinsten
“Resmî TensorFlow-to-TFJS model dönüştürücüsü Python 3.12’de çalışmıyor ve doğru düzgün belgelenmemiş”, “TensorFlow.js Keras 3’ü desteklemiyor” gibi şeyler yüzünden birkaç yıl önce hafifçe makine öğrenmesi denemeye çalışırken neredeyse vazgeçmiştim
Güncel eğitimlerin çok sık biçimde daha şimdiden eskimiş olması, rastgele tuzakların çokluğu ve “başlarken” kılavuzlarının insanı şoke edecek ölçüde zaten uzman varsayması can sıkıcıydı
Temelleri eski bir Bayesçi istatistik ders kitabından öğrenip sonra PyTorch gibi ana akım bir framework’e geçmek daha iyi
Başta CNN, RNN, Transformer mimarilerini ve eğitim pipeline’ının tüm parçalarını kendiniz yazmanız iyi olur
Veri yükleyici dahil; CUDA matris kernel’ları hariç tutulabilir
LangChain gibi başkalarının wrapper’ını tekrar saran wrapper’lardan uzak durmak iyi olur
Belgeler sadece eski olmakla kalmıyor, bazen temeller hakkında düpedüz yanlış da olabiliyor
Temelleri biliyorsanız ve standart wrapper bozulduğunda düzeltebiliyorsanız Hugging Face harikadır
Bu, birkaç saat harcayıp foseptik kapağı açmayı öğrenmeye benziyor
CAPTCHA çözme hizmetlerinin bağlantılarını takip ederseniz, bu işi yapan insanların profillerini okuyabilirsiniz
Tehlikeli bir fabrikada çalışmaktan daha etik bir iş gibi tanıtılıyor