ReDoS - ReDoS

The қызмет көрсетуден тұрақты түрде бас тарту (ReDoS)[1]болып табылады алгоритмдік күрделілік шабуыл өндіретін а қызмет көрсетуден бас тарту қамтамасыз ету арқылы тұрақты өрнек бұл бағалау өте ұзақ уақытты алады. Шабуыл көбіне пайдаланады тұрақты экспрессиялық енгізу бар экспоненциалды уақыт ең нашар жағдай: қабылданған уақыт енгізу мөлшеріне қатысты экспоненталық өсе алады. Шабуыл жасаушы баяулауы немесе жауапсыз қалуы арқылы осындай тұрақты өрнекті ұсыну арқылы бағдарламаны шектеусіз уақытты өңдеуге жұмсауы мүмкін.[2][3]

Сипаттама

Тұрақты өрнек («regex») сәйкестендіруді a құру арқылы жасауға болады ақырғы күйдегі автомат. Regex-ті оңай түрлендіруге болады анықталмаған автоматтар (NFAs), онда әрбір күй және енгізу символы үшін келесі бірнеше күйлер болуы мүмкін. Автоматты құрастырғаннан кейін бірнеше мүмкіндіктер бар:

  • қозғалтқыш оны а-ға айналдыруы мүмкін детерминирленген ақырлы күйдегі автомат (DFA) және нәтижені енгізу арқылы іске қосыңыз;
  • матч табылғанға дейін немесе барлық жолдар сыналып, істен шыққанша, қозғалтқыш барлық мүмкін жолдарды бір-бірлеп көруі мүмкін («кері шегіну»).[4][5]
  • қозғалтқыш мүмкін емес жолдарды қарастыруы мүмкін емес автоматты автоматты параллель;
  • қозғалтқыш анықталмаған автоматты DFA-ға айналдыра алады жалқау (яғни, ұшу кезінде, матч кезінде).

Жоғарыда аталған алгоритмдердің ішіндегі алғашқы екеуі проблемалы. Біріншісі проблемалы, себебі детерминирленген автоматтың мүмкіндігі болуы мүмкін қайда екенін көрсетеді - автоматты емес жағдайдағы күйлер саны; осылайша NFA-дан DFA-ға ауыстыру қажет болуы мүмкін экспоненциалды уақыт. Екіншісі проблемалы, себебі автоматты емес автоматта ұзындықтың экспоненциалды саны болуы мүмкін , сондықтан ұзындықты енгізу арқылы жүру керек экспоненциалды уақытты алады.[6]Соңғы екі алгоритм патологиялық мінез-құлықты көрсетпейді.

Патологиялық емес тұрақты тіркестер үшін проблемалық алгоритмдер әдетте жылдам болатындығына назар аударыңыз, ал іс жүзінде оларды күтуге болады «жинақтау «O (m) уақыттағы регекс және оны O (n) уақытында сәйкестендіріңіз; оның орнына NFA-ны модельдеу және DFA-ны жалқау есептеу O2n) ең нашар күрделілік.[7] Regex қызметінен бас тарту осы үміттер пайдаланушы ұсынған regex-ке қолданылған кезде пайда болады және пайдаланушы ұсынатын зиянды тұрақты тіркестер regex матчінің ең нашар күрделілігін тудырады.

Регекс алгоритмдерін тиімді әдіспен жазуға болатынымен, көптеген регекстік қозғалтқыштар регекс тілдерін қосымша құрылымдармен кеңейтеді, оларды әрдайым тиімді шешу мүмкін емес. Мұндай кеңейтілген өрнектер негізінен regex-ті жүзеге асыруға мәжбүр етеді бағдарламалау тілдері backtracking қолдану.

Мысалдар

Экспоненциалды кері шегіну

Мәселенің ең күрделі түрі әдеттегі өрнектерді сәйкестендіруге байланысты болады, мұнда кейбір өрнектер кіріс жолының ұзындығында экспоненциалды болатын жұмыс уақыты болады.[8] Ішектері үшін таңбалар, орындалу уақыты . Бұл тұрақты өрнектің үш қасиеті болған кезде болады:

  • тұрақты өрнек қайталануды қолданады (+, *) ішкі өрнекке;
  • субэкспрессия бір кіріске бірнеше тәсілмен сәйкес келуі мүмкін немесе субэкспрессия мүмкін ұзағырақ сәйкестіктің префиксі болып табылатын енгізу жолымен сәйкес келуі мүмкін;
  • және қайталанған субэкспрессиядан кейін субэкспрессия сәйкес келмейтін нәрсеге сәйкес келетін өрнек болады.

Екінші шарт екі мысалмен жақсы түсіндіріледі:

  • жылы (a | a) + $, қайталану ішкі өрнекке қолданылады a | aсәйкес келуі мүмкін а ауысымның әр жағында екі жолмен.
  • жылы (a +) * $, қайталану ішкі өрнек қолданылады a +сәйкес келуі мүмкін а немесе аажәне т.б.

Осы екі мысалда да біз қолдандық $ үшінші шартты қанағаттандыратын жолдың соңына сәйкес келу үшін, бірақ бұл үшін басқа таңбаны қолдануға болады. Мысалға (а | аа) * с бірдей проблемалық құрылымға ие.

Жоғарыда келтірілген үш тұрақты өрнек форманың жолдарына қолданылған кезде экспоненциалды жұмыс уақытын көрсетеді . Мысалы, егер сіз оларды қарсы қоюға тырыссаңыз ааааааааааааааааааааааааа! экспрессиялық қозғалтқышта оны аяқтау айтарлықтай ұзақ уақытты алады және әр қосымша үшін жұмыс уақыты шамамен екі есеге артады а дейін !.

Сонымен қатар, көпмүшелік уақыт болатын кері трекинг болуы мүмкін , экспоненциалды орнына. Бұл сондай-ақ ұзақ уақытқа созылатын кірістерде қиындықтар тудыруы мүмкін, бірақ бұл мәселеге аз көңіл бөлінді, өйткені зиянды енгізу айтарлықтай әсер ету үшін әлдеқайда ұзағырақ болуы керек. Мұндай үлгінің мысалы «a * b? a * x«, кіріс ерікті түрде ұзақ тізбекті болған кезде»а«.

Интернеттегі репозиторийлердегі осал регектер

Интернеттегі тұрақты экспрессиялық репозиторийлерде «зұлымдық» деп аталатын немесе зиянды регектер табылды. Зұлымдықты табу жеткілікті екенін ескеріңіз қосалқытолық регге шабуыл жасау үшін өрнек:

  1. RegExLib, id = 1757 (электрондық поштаны тексеру) - қараңыз қызыл бөлігі, ол Evil Regex болып табылады
    ^ ([a-zA-Z0-9])(([[-.] | [_] +)? ([a-zA-Z0-9] +)) *(@) {1} [a-z0-9] + [.] {1} (([az] {2,3}) | ([az] {2,3} [.] {1} [az] {2,3})) $
  2. OWASP-ті тексеру репозиторийі, Java Classname - қараңыз қызыл бөлігі, ол Evil Regex болып табылады
    ^(([a-z]) +.) +[A-Z] ([a-z]) + $

Бұл екі мысал енгізуге де бейім ааааааааааааааааааааааааа!.

Шабуылдар

Егер регестің өзіне пайдаланушының енгізуі әсер етсе, шабуылдаушы зиянды регекс енгізіп, жүйені осал ете алады. Сондықтан, көп жағдайда, пайдаланушыға серверде ерікті үлгілерді орындау мүмкіндігін алып тастау арқылы жүйелі түрде қызмет көрсетуден бас тартуға болады. Бұл жағдайда веб-қосымшалар мен мәліметтер базасы негізгі осал қосымшалар болып табылады. Сонымен қатар, зиянды бет пайдаланушының веб-шолушысын іліп қоюы немесе оның жадының еркін көлемін қолдануы мүмкін.

Алайда, жоғарыдағы параграфтардың кейбір мысалдары басқаларына қарағанда айтарлықтай «жасанды» емес; осылайша, олар бағдарламалық қателіктер нәтижесінде осал регектерді қалай қолдануға болатындығын көрсетеді. Бұл жағдайда электрондық пошта сканерлері және кіруді анықтау жүйелері осал болуы мүмкін. Бақытымызға орай, көп жағдайда проблемалы тұрақты тіркестерді «жаман емес» қалып ретінде қайта жазуға болады. Мысалға, (. * a) + қайта жазуға болады ([^ a] * a) +.

Веб-қосымшаға қатысты, бағдарламашы жүйенің клиентінде де, сервер жағында да енгізуді растау үшін бірдей тұрақты өрнекті қолдана алады. Шабуылшы клиенттің кодын тексеріп, жаман сөз тіркестерін іздей алады және оны іліп қою үшін жасалған кірісті тікелей веб-серверге жібере алады.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ OWASP (2010-02-10). «Регекске қызмет көрсетуден бас тарту». Алынған 2010-04-16.
  2. ^ RiverStar бағдарламалық жасақтамасы (2010-01-18). «Қауіпсіздік бюллетені: тұрақты сөз тіркестерін қолдану туралы ескерту». Алынған 2010-04-16.
  3. ^ Ристик, Иван (2010-03-15). ModSecurity анықтамалығы. Лондон, Ұлыбритания: Feisty Duck Ltd. 173. ISBN  978-1-907117-02-2.
  4. ^ Crosby and Wallach, Usenix Security (2003). «Қызмет көрсетуден жүйелі түрде бас тарту». Алынған 2010-01-13.
  5. ^ Брайан Салливан, MSDN журналы (2010-05-03). «Қызметтік шабуылдар мен қорғаныстарды үнемі білдіруден бас тарту». Алынған 2010-05-06.
  6. ^ Киррэйдж, Дж .; Ратнаяк, А .; Thielecke, H. (2013). «Қызмет көрсетуден бас тартуға бағытталған тұрақты экспрессияны статикалық талдау». Желілік және жүйелік қауіпсіздік. Мадрид, Испания: Шпрингер. 135–148 беттер. arXiv:1301.0849. дои:10.1007/978-3-642-38631-2_11.
  7. ^ DFA-ны жалқау есептеу, әдетте, NFA модельдеу сияқты ең нашар жағдайды сақтай отырып, детерминделген автоматтардың жылдамдығына жетуі мүмкін. Алайда оны жүзеге асыру едәуір күрделі және жадты көбірек қолдана алады.
  8. ^ Джим Манико және Адар Вейдман (2009-12-07). «OWASP Podcast 56 (ReDoS)». Алынған 2010-04-02.

Сыртқы сілтемелер