Kullanıcıların düzenli ifadelerin saldırılara karşı girişini koruma


9

Düzenli İfade Hizmet Reddi'nin (ReDoS) farkındayım. Kullanıcıların, katlanarak yavaş bir kalıp göndermediklerini garanti ederken özel regex'ler oluşturmasına izin vermenin makul bir yolu var mı?


Detaylar eksik. Platform, kullanım vb.
whatsisname

8
Kullanıcının kötü bir normal ifade göndermesini önlemek yerine, belki belirli bir süre sonra yürütmeyi iptal ettiğiniz bir çözüm?
Samuel

Yanıtlar:


8

Düzenli ifadelerle ilgili sorun normal ifadenin kendisi değil, geri izleme gibi her türlü “kullanışlı” özelliğe sahip normal ifade motorudur. Bu nedenle, bu özelliklere sahip olmayan bir regex motoru kullanmaktan kaçınır.

Bilgisayar bilimi kavramının düzenli ifadeleri, sonlu durum makinesine derlendikten sonra daima doğrusal zamanda eşleştirilebilir. Dolayısıyla, durum makinesi tabanlı bir normal ifade motoru ReDoS için kullanılamaz. Bununla birlikte, gerekli durum makineleri patolojik örneklerde oldukça büyük olabilir. Ancak kullanılabilir belleği sınırlamak, kullanılabilir hesaplama süresini sınırlamaktan daha kolay olma eğilimindedir.

RE2 motoru güvenilmeyen regexes başa özel olarak geliştirilen ve lineer zamanı yürütülmesi için tasarlanmıştır.

Başka bir alternatif, regex'leri basitleştirilmiş bir gösterimle birleştirmektir. Örneğin, kullanıcıların glob kalıplarını (örneğin *.txt) kullanmasına izin verebilirsiniz . Daha sonra, örneğin iç içe yerleştirmeye izin vermeyerek ve sadece açgözlü niceleyiciler kullanarak geri izlemeyi önleyecek şekilde ayrıştırabilirsiniz. Birçok kullanım durumunda, basitleştirilmiş bir desen gösterimi tamamen yeterlidir.


11

Düzenli bir ifadenin analizinin kendisi yavaşlamadan yavaş olup olmayacağını görmek için durma problemini çözmek anlamına gelir. Başka bir deyişle, doğru ve eksiksiz bir çözüm bulmak mümkün değildir .

Elbette, doğru ve bir çözüm bulabilirsiniz içinde tamamlandı. Örneğin, kullanımı güvenli özelliklerin kısıtlayıcı bir beyaz listesiyle çalışabilirsiniz (örneğin, karakter sınıfları evet, tekrar no ...). Bu, çok sayıda eleştirel olmayan regex'i geçirmenize, tüm kritik olanları reddetmenize ve (yanlış) iyi, ancak otomatik olarak güvenli olduğunu kanıtlamak için çok karmaşık olan bazılarını reddetmenize izin verecektir.


3
İlk ifadeniz için bir alıntı var mı? Böyle bir kanıt görmek isterim. Normal ifadeler Turing-complete değildir, bu nedenle durma sorunu geçerli olmayabilir.
Sebastian Redl

3
@SebastianRedl Bu en açık konuşmak gerekirse, normal ifadeler olduğu doğru değil Turing tamamlama, ama popüler kullanımda tüm regex kütüphaneler bunları artık normal hale uzantıları vardır. Kullanıcılarınızı kelimenin tam anlamıyla düzenli ifadelerle sınırlamak aslında bu durum için iyi bir çözüm olabilir.
Kilian Foth

2
@KilianFoth: IIRC, gerçek düzenli ifadeler bile (kelimenin CompSci anlamında) üstel miktarda geri izleme gerektirebilir. Ancak Turing tamamlanmadığı için, herhangi bir normal ifade için bu üst sınırı kurmak teorik olarak mümkündür. Bununla birlikte, bu iki problemi açık bırakır: üst sınırı otomatik olarak belirlemek önemsiz bir görevdir ve sonuç makul olmayan yüksek sonuçlar verebilir (olduğu gibi, bir üst sınır beklenen süreden çok daha yüksek ).
MSalters

msalters herhangi bir gerçek düzenli ifade mekanik olarak deterministik bir sonlu durum otomatına dönüştürülebilir, yani ifadeyi geri izlemeden eşleştirmek her zaman mümkündür. Elbette FSA'nız mantıksız bir şekilde büyüyebilir, ancak bu, üretilen FSA'daki devlet sayısı sınırının söz konusu saldırıyı önlemek için yeterli bir çözüm olduğunu göstermektedir.
Jules

1

Lazarus projesinin yeniden ayrıştırıcısının yazarı olarak, herhangi bir düzenli ifadeyi belirli bir metinde hangi kaynakları tüketeceğini anlamanın hiçbir yolu olmadığını söyleyebilirim.

Aynı kaynakları harcamadan demek istiyorum (en azından big-O anlamında).

Bu yüzden en iyi yaklaşım - ayrıştırıcıyı ayrı bir iş parçacığında yeniden çalıştırın ve zaman aşımından sonra öldürün.


0

Diğer cevaplara ek olarak, kendi regex kütüphanenizi yürütmek, yürütme sırasında performans enstrümantasyonuna izin vermek ve böylece bazı kriterler karşılandığında yürütmeyi yarıya indirmek için araçlar sağlamak için bir çözüm de olabilir.

Benzer şekilde, regexes'i başka bir iş parçacığında çalıştırabilir ve çok uzun sürerse iş parçacıklarını öldürebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.