Konuyu Okuyanlar: 1 Ziyaretçi

ReDoS Nedir? Evil Regex, Backtracking ve GitLab Regex Açıkları Bağlamı

ReDoS Nedir? Evil Regex, Backtracking ve GitLab Regex Açıkları Bağlamı
[Resim: attachment.php?aid=359]

Selamlar,

GitLab'ın bu ay üst üste iki CVSS 10 regex derleyici açığı yayınlaması (CVE-2026-97229 ve CVE-2026-110264) birçok ekibi aynı soruya getirdi: düzenli ifadeler neden bu kadar tehlikeli olabiliyor? GitLab açıkları bellek taşması sınıfındaydı; ama aynı ailede daha yaygın görülen bir kardeş var: ReDoS (Regular Expression Denial of Service). Bu yazıda OWASP'ın ReDoS sayfasına dayanarak evil regex kavramını ve kendi kodunuzda nasıl tarayacağınızı anlatıyorum.

Konuda anlatılacaklar
  1. Naif regex motoru ve backtracking
  2. Evil regex nedir?
  3. Saldırı senaryoları
  4. Lab ve savunma

Naif algoritma
OWASP'a göre birçok regex motoru NFA (Nondeterministic Finite Automaton) kurar ve eşleşme bulunana kadar olası yolları tek tek dener. Girdi eşleşmezse motor önceki konumlara dönüp (backtracking) başka yolları dener. Kötü yazılmış bir desende yol sayısı girdi uzunluğuyla üstel büyür; örneğin ^(a+)+$ deseni için aaaaX 16 yol, on altı a içeren girdi 65536 yol üretebilir.

Evil regex
OWASP, şu özelliklere sahip desenleri "evil" sayar:
  • Tekrar içeren gruplama
  • Tekrarlanan grubun içinde: tekrar veya örtüşen alternasyon
Örnekler: (a+)+$ , ([a-zA-Z]+)*$ , (a|aa)+$ , (a|a?)+$
Bu desenler aaaaaaaaaaaaaaaaaaaaaaaa! gibi bir girdide motoru uzun süre meşgul edebilir.

Saldırı senaryoları
  • Web uygulamasında kullanıcı girdisinin evil bir regex ile doğrulanması (e-posta, sınıf adı vb.)
  • Regex'in kendisinin kullanıcı girdisinden etkilenmesi (regex injection) - OWASP örneğinde kullanıcı adı regex olarak derleniyor
  • WAF / tarayıcı / veritabanı katmanındaki regex'lerin hedef alınması
GitLab açıkları ReDoS değil, derleyici tamsayı taşması yoluyla RCE idi; ama ortak ders aynı: kullanıcı kontrolündeki veya karmaşık regex'leri güven sınırı olarak görmeyin.

Lab
Kod:
# Python - kendi labiniz (kisa timeout ile) import re, time pat = re.compile(r"(a+)+$") s = "a" * 28 + "!" t0 = time.time() try: pat.search(s) finally: print("sure_s:", round(time.time() - t0, 3))
Girdi uzunluğunu artırdıkça sürenin hızla büyüdüğünü görürsünüz. Üretimde böyle bir deseni kullanıcı girdisine uygulamayın.

Savunma
  • Kullanıcı girdisini regex'e gömmeyin; sabit bir desen kullanın.
  • Mümkünse doğrulamayı regex yerine parser / allow-list ile yapın.
  • Backtracking'siz motorlar veya atomic grouping / possessive quantifier kullanın (dile göre).
  • Regex çalıştırırken zaman ve bellek limiti koyun.
  • Bağımlılıklarınızda ve WAF kurallarınızda evil regex tarayıcıları (ör. rxxr2, regexploit) çalıştırın.

Kod tabanınızda kullanıcı girdisinden derlenen regex var mı? Son denetimde ne buldunuz?

Yasal uyarı
Bu yazı bilgilendirme ve savunma amaçlıdır. Anlatılan kontrolleri yalnızca kendi sistemlerinizde veya yazılı izinle yapın. İzinsiz erişim, tarama ve sömürü girişimleri TCK 243-245 kapsamında suçtur. TurkTeam white-hat bir topluluktur; çalıntı veri, hesap, combo/log paylaşımı ve hack hizmeti talepleri forum kurallarına aykırıdır.

Kaynaklar


Ek DosyalarEkran Görüntüleri
   
Cevapla



Hızlı Menü: