Her 'kötü' normal ifade için kötü olmayan bir alternatif var mı, yoksa dilbilgisinde şeytan var mı?


16

Görünüşe göre, ReDos saldırıları bazı (aksi takdirde yararlı) düzenli ifadelerin özelliklerini kullanır ... esas olarak NFA tarafından tanımlanan grafikte olası yolların patlamasına neden olur.

Eşdeğer bir 'kötü olmayan' regex yazarak bu tür problemlerden kaçınmak mümkün müdür? Değilse (böylece, dilbilgisi bir NFA tarafından pratik alanda / zamanda ele alınamaz), hangi ayrıştırma yaklaşımları daha iyi olurdu? Neden?


Eğer kesin teknik dili kullanmayı başarabilirsem, bu bir kazadır. Lütfen akademik olmayan bir yanıt için cevap verin :-)
David Bullock

1
Aslında sadece ReDos'd olmaktan kaçınmanın pratik bir yolunu bulmaya çalışıyorum ve bu soru ortaya çıktı.
David Bullock

Sorunuzu yeniden ifade etmek için (?): Her normal dilde, uzunluğu minimum NFA'sının durumlarının sayısı içinde bir polinom tarafından sınırlanan düzenli bir ifade var mı?
A.Schulz

1
@ A.Schulz. Soru olduğunu sanmıyorum. ReDos saldırıları böyle çalışmaz. ReDos saldırısında, normal ifade program kaynak koduna sabit olarak kodlanır ve güvenilir olduğu düşünülen geliştirici tarafından sağlanır. Daha sonra düşman, programın normal ifadeyle eşleştiği bir girdi dizesi sağlar. Eğer rakip, eşleştiricinin gerçekten uzun süre çalışmasına neden olan bir girdi dizesi bulabilirse, rakip kazanır. Dolayısıyla, rakip düzenli ifadelerden değil, olumsuz girdilerden endişe duyuyoruz. (devam)
DW

nÖ(f(n))f(n)n

Yanıtlar:


14

Düzenli bir ifade veya regexp olup olmadığınıza bağlıdır: normal ifadeler kötüdür, ancak düzenli ifadeler güzel bir şeydir ve asla size kötülük getirmeyecektir.

Normal ifade ile, modern bir düzenli ifade kastediyorum: yani, backreferences gibi ek modern özelliklere sahip düzenli bir ifade - örneğin, Perl uyumlu bir düzenli ifade. Bu, klasik düzenli ifadeler backreferences, lookahead, lookbehind, vb. İzin vermediği için, resmi diller / otomata teorisi ders kitabındaki klasik düzenli ifadeden daha güçlüdür.

nÖ(n)

Bu, normal ifade eşleştiricisinin uygulanmasına bağlıdır. Eşleştiricinin naif veya kötü bir uygulaması varsa, eşleme üstel zaman alabilir; kesinlikle bu özelliğe sahip algoritmalar vardır. Ancak bunun en iyi yanıtı muhtemelen normal ifadeyi değiştirmek değildir; hizmet reddi saldırılarından endişe ediyorsanız, daha iyi bir eşleşme seçmek muhtemelen daha iyidir.

Buna karşılık, bazı modern düzenli ifadeler kaçınılmaz olarak kötüdür. Modern bir normal ifadeniz varsa, eşleme üstel zaman gerektirebilir. Özellikle, backreferences içeren regexps NP-sert dilleri tanıyabilir. Sonuç olarak, akla yatkın varsayımlar altında, bir eşleşme için testin üstel zaman aldığı bir kötü regexps sınıfı vardır. Bu nedenle, bazı modern normal ifadeler kaçınılmaz olarak kötüdür: çalışma zamanında üstel patlamaya neden olmayacak eşdeğer bir normal ifade bulmanın mümkün bir yolu yoktur.

(Böyle bir eşdeğer var olabilir ve teoride bile bitirilebilir, ancak makul varsayımlar altında, eşdeğer normal ifadeyi bulmak, uygulamada mümkün olmayan üstel zaman alacaktır. Polinom zamanında eşdeğer normal ifadeyi bulmak için sistematik bir prosedürünüz varsa , NP-zor problemini polinom zamanında çözebilir ve P = NP olduğunu kanıtlayabilirsiniz. Ömrünüz boyunca gerçekten bulmanın bir yolu yoksa, eşdeğer bir regexp olması çok iyi olmaz.)


Arka plan ve kaynaklar:


Normal ifadeyi birden çok küçük normal ifadeye bölerek ve bunları birlikte kullanarak kötü olmayan bir alternatif bulmak daha kolay değil mi?
inf3rno

1

Bu cevap, karmaşıklık teorisinin siber güvenlik için geçerli olduğu ve bu alanda meydana gelebilecek bazı önemli nüans / inceliklerin bulunduğu bu olağandışı kesişen durumun daha kapsamlı bir görünümünü alacaktır. Bu, esasen bazı beklenmedik girdilerin bir sistemi çökmesine veya anormal derecede uzun zaman almasına neden olan patolojik davranışlara neden olduğu bir "enjeksiyon saldırısına" benzer.

Wikipedia'nın 15 kategoride Hizmet Reddi saldırısı vardır ve bu saldırı bu listede "uygulama düzeyi sellere" girer . Bir diğer benzer örnek, uygulama günlüklerini dolduran bir saldırıdır.

Enjeksiyon saldırıları için bir düzeltme "girişi temizlemek" tir. Uygulama tasarımcısı, potansiyel olarak kötü niyetli bir kullanıcı tarafından sağlanan rastgele regexps'leri derlemek gerekirse yeniden değerlendirebilir. Normal ifadedeki iç içe ifadeleri çıkarmak veya benzer bir sınırlama bu saldırıyı önlemek için muhtemelen yeterli olacaktır. Birçok modern yazılıma özgü olsalar da, düzenli ifadeleri değerlendirmeden büyük miktarda işlevsellik sağlanabilir. Bağlam önemlidir, bazı uygulamalar böyle bir güvenlik gerektirmez.

Burada geçerli olan hata toleransını / direncini artırmak için başka bir yaklaşım , yazılım yığını / hiyerarşisinin farklı seviyelerinde belirtilen zaman aşımlarıdır . Buradaki fikir, "ortalama" düzenli ifade değerlendirmesinde bir zaman / işlemci veya talimat limiti belirtmek ve aşılırsa erken sonlandırmak olacaktır. Özel çözümlerle uygulanabilirler, ancak çok fazla yazılım veya programlama dili bu amaç için yerleşik zaman aşımlarına veya çerçevelere sahip değildir.

Hata toleransını artırmak için zaman aşımlarının kullanılmasına güzel bir örnek ve bu tür sorunları hafifletmek için üst düzey bir tasarım / mimari / pov gösterir: Yüksek Hacimli Hata Toleransı, Dağıtılmış Sistem / Netflix. Düzenli ifadelere özel olarak bağlı hiçbir şey yoktur, ancak buradaki nokta: neredeyse tüm uygulama seviyesi mantığı bu çerçeveye veya benzer bir şeye sığabilir.

Bu makalede , özellikle geri izlemenin yavaş regexp eşleşmesine nasıl yol açabileceği belirtilmektedir. Normal ifadelerin birçok farklı özelliği vardır ve hangilerinin en kötü durum davranışlarına yol açtığı değerlendirilmeye çalışılabilir.

İşte önerilen statik analiz çözümleri ile bu özel konunun güzel bir bilimsel araştırması :

  • Altyapısal Mantıklarla Düzenli İfade Üstel Çalışma Zamanı için Statik Analiz / Rathnayake, Thielecke

    Geri izleme kullanan düzenli ifade eşleşmesi, sistem güvenliği literatüründe REDoS olarak bilinen algoritmik bir karmaşıklık saldırısına yol açan üstel çalışma süresine sahip olabilir. Bu yazıda, belirli bir düzenli ifadenin bazı girdiler için üstel çalışma süresine sahip olup olmadığını tespit eden yakın zamanda yayınlanan bir statik analiz üzerine inşa ediyoruz. Geçiş ilişkilerinin güçlerini ve ürünlerini oluşturarak ve böylece REDoS problemini erişilebilirliğe indirgeyerek sistematik olarak daha doğru bir analiz yapıyoruz. Analizin doğruluğu, arama ağaçlarının altyapısal bir hesabı kullanılarak kanıtlanır; burada ağacın üstel havaya neden olan dallanması, doğrusal olmama biçimi olarak karakterize edilir.


Bu cevap ReDos'un bazı yönleri hakkında karışık görünüyor. 1. ReDoS'un enjeksiyon saldırısı ile ilgisi yoktur. Enjeksiyon saldırıları (örneğin, XSS, SQL enjeksiyonu, komut enjeksiyonu vb.) Tamamen farklıdır. 2. ReDos, bir düşman tarafından gönderilen kötü amaçlı regexps ile ilgili değildir. Normalde normal ifade programda sabit olarak kodlanır (geliştirici tarafından sağlanır) ve giriş dizesi bir kullanıcı tarafından sağlanır. Sorun, giriş doğrulama ile makul bir şekilde çözülemez, çünkü genellikle sorunu ortadan kaldıracak net bir giriş doğrulama politikası yoktur.
DW

puanlarınızın ReDos ref'ye dayalı teknik / saç spreyi olduğunu düşünün ve ağaçlar için ormanı özlüyor. onun benzeri "hazırlanmış enjeksiyon saldırılar". cevap kodda regexps kullanmanın alternatifleri olduğuna işaret ediyor. statik analiz "kötü regexps" bulabilirsiniz. cevabın tüm noktaları geçerlidir. "normalde normal ifade programda sabit olarak kodlanır (geliştirici tarafından sağlanır) ve giriş dizesi bir kullanıcı tarafından sağlanır" gibi bir cümle, yerlerde daha belirsiz olan ve kötü niyetli bir saldırgana atıfta bulunan ReDos yazımıyla tam olarak eşleşmez. .
vzn
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.