- Herkese açık web sitelerine aşırı istek göndererek DDoS gibi davranan scraper botlar sorununu ele alıyor ve bunu tersine çevirip onların zamanını boşa harcayan deneysel bir yaklaşım sunuyor
- Markov zinciri tabanlı bir metin üretici oluşturarak
.php dosyası gibi görünen sahte veriler üretiyor ve kötü niyetli botların bunları indirmesini sağlıyor
- Ardından statik içerik sunucusu kurup Frankenstein romanından paragrafları rastgele sunuyor; bağlantı yapısıyla crawler'ların patlayıcı biçimde yayılacağı şekilde tasarlıyor
- Tüm sayfalara
noindex, nofollow öznitelikleri ve istek sayacı ekleyerek normal arama motorlarını dışarıda bırakıyor, yalnızca kuralları çiğneyen botları yakalıyor
- Deney sonuçları ilgi çekici olsa da Googlebot'u yanlışlıkla yakalama riski nedeniyle bunu gerçek hizmette kullanmıyor; projeyi öğrenme ve deney amaçlı sürdürüyor
Scraper bot sorunu ve karşılık verme fikri
- Scraper'lar istemeden de olsa küçük ölçekli web sitelerinde DDoS düzeyinde yük oluşturabiliyor
- Bazı işletmeciler korunma yöntemleri sormuş olsa da bu yazı “savunma değil karşı saldırı” fikrine odaklanıyor
- Başka bir geliştiricinin Markov zinciriyle sonsuz sahte veri üretip botları kandırdığı örneği görülünce yazar kendi deneyine başlıyor
Markov zinciri tabanlı sahte PHP üreticisi
- Rust ile Markov zinciri eğiticisi geliştirerek rastgele metin verisine dayalı, gerçekçi görünen içerik üretiyor
.env, .aws, .php gibi zafiyet yollarını hedefleyen kötü niyetli botlara, gerçekmiş gibi görünen ama anlamsız PHP kodu sunuyor
- Dosya boyutunu 2KB'den 10MB'ye çıkararak botların kaynak tüketmesini hedefliyor
- Örnek çıktı, WordPress fonksiyon adları ve yorumların karıştığı inandırıcı sahte PHP kodu biçiminde
- Amaç; botların zamanını ve kaynaklarını boşa harcamak, saldırganların da gerçek zafiyet ararken vakit kaybetmesini sağlamak
Verimlilik ve statik veri sunma deneyi
- VPS üzerinde 1MB'den büyük dosyalar sunulunca yanıt gecikmesi ve sunucu yükü artışı yaşanıyor
- Bunu çözmek için statik site biçiminde bir “garbage server” kuruluyor
- Frankenstein romanının tamamı belleğe yükleniyor ve her istekte rastgele 4 paragraf döndürülüyor
- Her sayfanın altına 5 bağlantı eklenerek patlayıcı tarama yayılımı (5 kat artış) teşvik ediliyor
- Ortaya çıkan sonuç https://herm.app/babbler/ adresinde görülebilir
Tasarım ayrıntıları ve işletim biçimi
- Seçilen roman public domain ve Cadılar Bayramı döneminde çalışılmış olmasıyla birlikte yapay zeka ile Frankenstein arasındaki benzerlik nedeniyle kullanılıyor
- Tüm sayfalara
noindex,nofollow eklenerek yalnızca kuralları ihlal eden botlar yakalanıyor
- Her sayfanın altında istek sayısı sayacı gösteriliyor; bellek tabanlı olduğu için dağıtımdan sonra sıfırlanıyor
.php istekleri için ayrı bir sunucu da kuruluyor; gerçek PHP dosyaları bellekte rastgele sunuluyor
- Proje, “Garbage for the garbage king!” sözüyle özetleniyor
Riskler ve sınırlamalar
- Bu sistem gerçek hizmette uygulanırsa arama motorlarını yanlışlıkla yakalama riski taşıyor
- Googlebot yanlış endpoint'leri tararsa site spam site olarak sınıflandırılabilir
- Bu da arama görünürlüğünün düşmesine veya Chrome uyarıları gösterilmesine yol açabilir
- Bu nedenle aramaya bağımlı siteler için önerilmiyor; yalnızca deneysel proje olarak işletiliyor
.php için olan babbler HTML olmadığı için Googlebot üzerinde etkisi yok; yalnızca kötü niyetli botları hedefliyor
Kapanış ve kişisel sonuç
- Kötü niyetli scraper'ları çekmek için bloga gizli bağlantılar (
rel="nofollow") ekleniyor
- VPS'nin trafik kotası aşılırsa Cloudflare cache kullanımı değerlendiriliyor
- Proje sayesinde Markov zincirleri ve botların çalışma mantığı öğrenilirken, eğlenceyle öfkenin karıştığı bir deney yürütülüyor
- Sonuç olarak her denemenin pratik olması gerekmediği, bazen yalnızca eğlencenin de yeterli olduğu vurgulanıyor
1 yorum
Hacker News görüşleri
Dünya değişse de sonunda benzer sorunlarla karşılaşıyoruz
10~15 yıl önce sosyal medya izleme servisleri ile uğraşıyordum. Büyük markalar, forumlardaki duygu durumunu izlesinler diye onlara para ödüyordu; onlar da benim işlettiğim ücretsiz topluluğu izinsiz kazıyıp sunucuda yük oluşturuyordu
Onların botlarını engellesem de IP ve UA değiştirip geri geliyorlardı; ben de gönderilere rastgele marka adları ekleyen bir filtre yapıp veri kalitelerini bozdum. Bu önlemi açtıktan iki gün sonra scraping tamamen durdu
Bu botlar PHP dosyalarını gerçekten parse etmiyor; onların varlığı üzerinden zafiyet tespiti için parmak izi (fingerprinting) çıkarıyorlar. Yalnızca yanıt koduna bakıp hemen geçiyorlar
Yakın zamanda AI ve scraper'lar için tarpit fikrini duydum. Bağlantıyı kapatmadan çok yavaş şekilde sonsuz veri akıtıyorsunuz. Nepenthes adlı araç ilginç geldi, denemek istiyorum
Eskiden HN'de scraper engellemek eleştirilirdi. Mantık, “ben nasıl erişirsem erişeyim fark etmez” şeklindeydi
Apache sunucusunu doğrudan yönetiyorsanız, RewriteEngine ile PHP isteklerini hemen engelleyebilirsiniz
Sunucumda PHP yok, dolayısıyla bu tür isteklerin hepsi kötü niyetli
Saldırgan scraper'ların çoğu WordPress zafiyetlerini hedefliyor. PHP dosyasının kendisinden çok onun çıktısını istiyorlar. Bu tarz ayarlar bir tür honeypot gibi ama bot scriptte beklediğini bulamazsa çekip gidiyor
Bir zamanlar zipbomb stratejisini HN'de paylaşmıştım ve trafik günde 100 bin isteğe fırlamıştı. 6 dolarlık bir VPS bunun altından kalkamadı. Şimdi yalnızca en saldırgan botlara zipbomb veriyorum, geri kalanına 403 dönüyorum. Yeni strateji iyi çalışıyor ama bunu tekrar açık edip etmemek konusunda kararsızım. Referans: önceki yazı
Eskiden sadece fail2ban kullanıyordum ama biraz daha eğlenceli bir savunma yöntemi yapmak istedim
.htaccessiçinde şüpheli yolları (/.git,/wp-login)decoy.php'ye yönlendirip 10GB'lık decoy.zip dosyasını zorla indirtiyorum.decoy.php, istenen hassas dosya gibi görünüyor ama aslında sahte loglar ve SQL verisini sonsuza kadar stream ederek botu meşgul tutuyorBu botlar PHP dosyalarını kazımıyor, framework zafiyetleri arıyor. Beklenmedik bir yanıt verirseniz hemen vazgeçip başka hedefe geçiyorlar
Bazen şunu düşünüyorum — botların boşa harcadığı kaynaklarla kripto para madenciliği yaptırmak mümkün olmaz mı?