Чи існує для кожного «злого» виразу, чи існує альтернатива, яка не є злою, чи в граматиці є чорт?


16

Мабуть, атаки ReDos експлуатують характеристики деяких (інакше корисних) регулярних виразів ... по суті викликаючи вибух можливих шляхів через графік, визначений NFA.

Чи можна уникнути подібних проблем, написавши рівнозначний «не злий» підсумок? Якщо ні (таким чином, граматика не може оброблятись у практичному просторі / часі NFA), який підхід до розбору був би кращим? Чому?


Якщо мені вдалося використовувати точну технічну мову, це випадковість. Будь ласка, притупіть свої відповіді на неакадемічний :-)
Девід Буллок

1
Я насправді просто намагаюся знайти практичний спосіб, щоб не стати ReDos'd , і це питання виникло.
Девід Баллок

Перефразовуючи своє запитання (?): Чи кожна регулярна мова має регулярний вираз, довжина якої обмежена поліномом у кількості станів мінімальної NFA?
А.Шульц

1
@ A.Schulz. Я не думаю, що це питання. Це не так, як працюють атаки ReDos. В атаці ReDos regexp жорстко кодується у вихідний код програми та надається розробником, якому, як вважається, довіряють. Потім супротивник отримує введення рядка введення, який програма співпадає з регулярним виразком. Якщо противник може знайти вхідний рядок, який змушує запускати матч протягом дуже тривалого часу, противник виграє. Отже, нас турбують змагальні введення, а не змагальні регулярні вирази. (продовження)
DW

Отже, я думаю, що замість цього виникає запитання: чи кожна регулярна мова має регулярний вираз таким чином, що відповідність рядка символів проти цього регулярного вираження займає час O ( f ( n ) ) , де f ( n ) є деяким не надто- швидко зростаюча функція n (скажімо, поліном, чи щось подібне)? [Між іншим, ця переформулювання дає зрозуміти, що відповідь буде залежати від алгоритму, який використовується для узгодження ... як я згадую у своїй відповіді.] Розмір регулярного виразу як функція від розміру мінімальної NFA не відповідає дійсно має значення тут. нО(f(н))f(н)н
DW

Відповіді:


14

Це залежить від того, чи маєте ви регулярний вираз чи регулярне вираження: регулярні вирази - це зло, але регулярні вирази - це краса і ніколи не зроблять вас злом.

Під регулярним виразом я маю на увазі сучасний регулярний вираз: тобто регулярний вираз з додатковими сучасними функціями, такими як зворотні посилання - наприклад, регулярний вираз, сумісний з Perl. Це є більш потужним, ніж класичне регулярне вираження з підручника з теорії формальних мов / автоматів, оскільки класичні регулярні вирази не допускають зворотних посилань, пошуку, огляду назад тощо.

Для класичного регулярного вираження, якщо у вас є хороша реалізація для відповідника, то жодне регулярне вираження не є занадто злим. Зокрема, стандартним алгоритмом зіставлення є перетворення регулярного виразу в NFA і потім виконання NFA у рядок введення. Для цього алгоритму найгірший час запуску для тестування рядка -символу - O ( n ) , коли регулярний вираз фіксований. Це означає, що час роботи не може вибухнути занадто швидко. Немає рядка, який би викликав експоненціальне збільшення часу роботи. Таким чином, якщо ви використовуєте математику, яка використовує цей алгоритм, жоден класичний регулярний вираз не буде злим.нО(н)

Це залежить від реалізації відповідного регулярного виразу. Якщо у вас є наївна або погана реалізація відповідника, то відповідність може зайняти експоненціальний час; безумовно, є алгоритми з цим властивістю. Але найкраща відповідь на це, мабуть, не зміна регулярного виразу; напевно, краще вибрати кращий збірник, якщо вас турбують атаки відмови в обслуговуванні.

Для порівняння, деякі сучасні виразки неминуче злі. Якщо у вас є сучасний регулярний вираз, то відповідність може вимагати експоненціального часу. Зокрема, регулярні вирази з зворотними пересиланнями можуть розпізнавати жорсткі мови NP. Отже, за правдоподібних припущень, існує клас злих регенексів, де тестування на відповідність займає експоненціальний час. Таким чином, деякі сучасні регулярні виразки неминуче злі: немає єдиного можливого способу знайти еквівалентний регулярний вираз, який не спричинить експоненціальний вибух у часі роботи.

(Такий еквівалент може існувати і навіть теоретично підходить до кінця, але, за правдоподібних припущень, пошук еквівалентного регулярного вираження забирає експоненціальний час, що практично неможливо на практиці. Якщо у вас була систематична процедура пошуку еквівалентного регулярного виразів у поліноміальний час , тоді ви могли б вирішити NP-важку проблему за багаточлен, довівши, що P = NP. Це не дуже добре для того, щоб існувати еквівалентний регулярний вираз, якщо немає способу знайти його протягом життя.)


Передумови та джерела:


Чи не простіше знайти недобру альтернативу, розділивши регулярний вираз на декілька менших регулярних виразів і використовувати їх у комбінації?
inf3rno

1

Ця відповідь більш детально розгляне цю незвичну ситуацію, що стосується перехресних ситуацій, де теорія складності застосовна до кібербезпеки, а приклад містить деякі суттєві нюанси / тонкощі, які можуть відбутися в цій галузі. Це по суті схоже на "ін'єкційну атаку", коли певні несподівані введення спричиняють патологічну поведінку, або руйнуючи систему, або спричиняючи її ненормально тривалий час.

У Вікіпедії є 15 категорій атак на відмову в сервісі, і ця атака потрапляє до "наводнення рівня програми" у цьому списку. Ще один дещо подібний приклад - атака, яка заповнює журнали додатків.

Одне виправлення для ін'єкційних атак - це "очищення введення". Дизайнер додатків може переоцінити, якщо необхідно скомпілювати довільні регулярні вирази, надані потенційно шкідливим користувачем. Для усунення цієї атаки, ймовірно, буде достатньо лише викреслити вкладені вирази в регулярному вираженні або якесь інше подібне обмеження. Хоча вони властиві багатьом сучасним програмним забезпеченням, можна забезпечити велику кількість функціональних можливостей без оцінки регулярних виразів. Контекст має значення, деякі програми не потребують такої безпеки.

Інший підхід для поліпшення відмовостійкості / стійкості, застосований тут, є тайм-аути, визначені на різних рівнях програмного забезпечення / ієрархії. Ідея полягала б у тому, щоб визначити обмеження часу / процесора чи інструкції для "середнього" регулярного оцінювання виразів та припинити достроково, якщо його перевищено. Вони можуть бути реалізовані за допомогою спеціальних рішень, але не дуже багато програмного забезпечення або мов програмування мають вбудовані тайм-аути або рамки для цієї мети.

Ось чудовий приклад використання тайм-аутів для покращення відмовостійкості та показує дизайн / архітектуру / pov високого рівня для пом’якшення таких проблем: Допуск відмов у великій гучності, розподілена система / Netflix. Він не має нічого конкретно пов'язаного з регулярними виразами, але в цьому і суть: практично будь-яка / вся логіка рівня програми може вписатися в цю рамку або щось подібне.

Ця стаття вказує на те, як зворотний трек зокрема може призвести до повільного зіставлення регулярних показів У Regexps є багато різних особливостей, і можна спробувати оцінити, які з них призводять до гіршого поведінки.

Ось приємне наукове дослідження цієї конкретної теми із запропонованим рішенням статичного аналізу :

  • Статичний аналіз для регулярного експоненційного періоду регулярної експресії за допомогою підструктурної логіки / Rathnayake, Thielecke

    Регулярна відповідність виразів за допомогою зворотного відстеження може мати експоненціальний час виконання, що призводить до алгоритмічної атаки складності, відомої як REDoS в літературі щодо системних систем. У цій роботі ми спираємося на нещодавно опублікований статичний аналіз, який виявляє, чи може заданий регулярний вираз мати експоненціальний час виконання для деяких входів. Ми систематично будуємо більш точний аналіз, формуючи потужності та продукти перехідних відносин і тим самим зводячи проблему REDoS до доступності. Правильність аналізу доведена за допомогою підструктурного обчислення дерев пошуку, де розгалуження дерева, що викликає експоненціальне вибухування, характеризується як форма нелінійності.


Ця відповідь здається заплутаною щодо деяких аспектів ReDos. 1. ReDoS не має нічого спільного з ін'єкційною атакою. Атака ін'єкцій (наприклад, XSS, ін'єкція SQL, введення команд тощо) абсолютно різні. 2. ReDos - це не шкідливі повторні виклики, подані противником. Як правило, регулярно кодується програма у програмі (надається розробником), а рядок введення надається користувачем. Проблему неможливо вирішити шляхом перевірки введення, оскільки зазвичай немає чіткої політики перевірки вводу, яка була б достатньою для усунення проблеми.
DW

подумайте, що ваші бали складаються з технічних характеристик / роздрібнення волосся на основі відмови від ReDos і пропускає ліс для дерев. його схожий на «оброблені атаки ін'єкції». у відповіді вказується, що в коді є альтернативи використанню регулярних виразів. статичний аналіз може знайти «злі регенекси». всі пункти відповіді справедливі. речення на кшталт "типово regexp жорстко кодується в програмі (надається розробником), а рядок введення надається користувачем" точно не відповідає запису ReDos, який місцями є більш розпливчастим, і стосується зловмисного зловмисника тощо .
vzn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.