분명히 ReDos 공격은 (다른 유용한) 정규 표현식의 특성을 악용합니다. 본질적으로 NFA에서 정의한 그래프를 통해 가능한 경로를 폭발시킵니다.
동등한 '비악'정규식을 작성하여 이러한 문제를 피할 수 있습니까? 그렇지 않은 경우 (그래서 문법을 NFA가 실제 공간 / 시간에서 처리 할 수없는 경우) 어떤 구문 분석 방법이 더 좋을까요? 왜?
분명히 ReDos 공격은 (다른 유용한) 정규 표현식의 특성을 악용합니다. 본질적으로 NFA에서 정의한 그래프를 통해 가능한 경로를 폭발시킵니다.
동등한 '비악'정규식을 작성하여 이러한 문제를 피할 수 있습니까? 그렇지 않은 경우 (그래서 문법을 NFA가 실제 공간 / 시간에서 처리 할 수없는 경우) 어떤 구문 분석 방법이 더 좋을까요? 왜?
답변:
정규 표현식을 가지고 있는지 정규 표현식을 가지고 있는지에 달려 있습니다. 정규 표현식은 악하지만 정규 표현식은 아름다움이며 결코 당신을 악하게 만들지 않습니다.
정규 표현식으로, 나는 현대 정규 표현식, 즉 역 참조와 같은 추가 현대 기능을 가진 정규 표현식 (예 : Perl 호환 정규 표현식)을 의미합니다. 고전 정규 표현식은 역 참조, 미리보기, 뒤 돌이 등을 허용하지 않기 때문에 공식 언어 / 자전거 이론 교과서의 고전 정규 표현식보다 더 강력합니다.
고전적인 정규 표현식의 경우, 정규 표현식을 구현하면 정규 표현식이 너무 나쁘지 않습니다. 특히 일치하는 표준 알고리즘은 정규식을 NFA로 변환 한 다음 입력 문자열에서 NFA를 실행하는 것입니다. 이 알고리즘의 경우 정규 표현식이 고정 된 경우 문자 문자열 을 테스트하는 최악의 실행 시간 은 입니다. 이것은 실행 시간이 너무 빠르게 폭발 할 수 없음을 의미합니다. 실행 시간이 기하 급수적으로 증가하는 문자열이 없습니다. 따라서이 알고리즘을 사용하는 매처를 사용하는 경우 클래식 정규 표현식은 악의가 없습니다.O ( N )
이것은 정규 표현식 매처의 구현에 따라 다릅니다. 매처의 순진한 구현이있는 경우 일치하는 데 시간이 오래 걸릴 수 있습니다. 해당 속성을 가진 알고리즘이 있습니다. 그러나 이에 대한 가장 좋은 대답은 아마도 정규 표현식을 바꾸지 않는 것입니다. 서비스 거부 공격이 우려되는 경우 더 나은 매처를 선택하는 것이 좋습니다.
이에 비해 일부 현대 정규 표현식은 피할 수 없을 정도로 악하다. 최신 정규 표현식이 있으면 일치하는 데 지수 시간이 필요할 수 있습니다. 특히 역 참조가있는 정규 표현식은 NP-hard 언어를 인식 할 수 있습니다. 결과적으로, 그럴듯한 가정 하에서 일치 테스트에 기하 급수적으로 시간이 걸리는 악의 정규 표현식이 있습니다. 따라서 일부 현대식 정규 표현식은 불가피하게 악합니다. 실행 시간이 기하 급수적으로 증가하지 않는 동등한 정규 표현식을 찾을 수있는 방법은 없습니다.
(이러한 등가물이 존재할 수 있고 이론 상으로는 찾을 수 있지만, 그럴듯한 가정 하에서 등가 정규 표현식을 찾는 데 실제로는 불가능한 기하 급수적 시간이 소요됩니다. 그런 다음 다항식 시간에 NP-hard 문제를 해결하여 P = NP임을 증명할 수 있습니다. 실제로 정규 표현식을 찾지 못하면 동등한 정규 표현식이 존재하지 않는 것이 좋습니다.)
배경과 출처 :
Perl 호환 정규 표현식은 어떤 언어를 인식합니까? 그리고 현대적인 정규 표현식의 표현력은 현대 regexps '에가 NP-하드 언어를 인식 할 수 있음을 정당화에 대한 참조를 제공합니다.
유한 상태 오토마타에서 역 참조, 미리보기 및 미리보기를 시뮬레이션하는 방법은 무엇입니까? 그리고 regexp와는 정규 표현식이없는 경우? 정규 표현식과 정규 표현식의 차이점을 이해하는 데 도움이 될 수 있습니다.
Russ Cox의이 기사 에는 정규 표현식 매처를 빌드하는 두 가지 방법에 대한 좋은 설명이 있으며 올바른 알고리즘을 사용하는 경우 실행 문자열이 입력 문자열 길이에 선형 인 이유를 설명합니다 (정규 표현식이 고정되어 있고 길이는 상수로 취급됩니다). 특히 Thompson 알고리즘이라고도하는 NFA 기반 알고리즘은 선형 최악의 실행 시간을 갖습니다. 또한 일부 인기있는 언어가 정규 표현식으로 기하 급수적으로 정규 표현식을 구현하는 방법을 보여주고 현대 정규 표현식의 어떤 측면이 지수 실행 시간을 도입 할 수 있는지에 대해 설명합니다.
이 게시물에서는 P! = NP라고 가정합니다. 요컨대, "타당한 가정"을 언급 할 때 지수 시간 가설을 언급하고 있습니다.
이 답변은 복잡성 이론이 사이버 보안에 적용 가능하고이 영역에서 발생할 수있는 중요한 뉘앙스 / 미묘함을 포함하는 이례적인 크로스 커팅 상황에 대해보다 포괄적 인 관점을 취합니다. 이것은 예상치 못한 입력으로 인해 시스템이 충돌하거나 비정상적으로 오랜 시간이 걸리는 병리학 적 행동을 일으키는 "주입 공격"과 본질적으로 유사합니다.
Wikipedia에는 15 가지 범주의 서비스 거부 공격 이 있으며이 공격은 해당 목록의 "애플리케이션 수준 홍수" 에 해당합니다. 다소 유사한 또 다른 예는 응용 프로그램 로그를 채우는 공격입니다.
주입 공격에 대한 한 가지 해결책은 "입력을 정리"하는 것입니다. 응용 프로그램 디자이너는 잠재적으로 악의적 인 사용자가 제공 한 임의의 정규 표현식을 컴파일해야하는 경우 재평가 할 수 있습니다. 정규 표현식이나 다른 유사한 제한에서 중첩 식을 제거하면이 공격을 피할 수 있습니다. 그것들은 많은 현대 소프트웨어에 내재되어 있지만 정규 표현식을 평가하지 않고도 많은 기능을 제공 할 수 있습니다. 상황에 따라 일부 응용 프로그램에는 이러한 보안이 필요하지 않습니다.
여기에 적용 가능한 내결함성 / 탄력성을 향상시키는 또 다른 방법 은 서로 다른 수준의 소프트웨어 스택 / 계층에 지정된 시간 초과 입니다. 아이디어는 "평균"정규식 평가에 시간 / CPU 또는 명령 제한을 지정하고 초과되면 조기 종료하는 것입니다. 그것들은 커스텀 솔루션으로 구현 될 수 있지만 소프트웨어 나 프로그래밍 언어에는 이러한 목적을 위해 내장 된 타임 아웃이나 프레임 워크가 없습니다.
다음은 내결함성을 개선하기 위해 시간 초과를 사용하는 좋은 예이며 이러한 문제를 완화하기위한 고급 디자인 / 아키텍처 / pov를 보여줍니다. 대용량, 분산 시스템 / Netflix의 내결함성 . 정규 표현식에 특별히 연결된 것은 없지만 여기서 요점은 거의 모든 응용 프로그램 수준 논리가이 프레임 워크 또는 이와 유사한 것에 맞을 수 있다는 것입니다.
이 기사에서는 특히 역 추적 이 어떻게 정규 표현식 일치를 느리게 만들 수 있는지 설명합니다 . 정규 표현식에는 다양한 기능이 있으며 최악의 동작을 유발하는 기능을 평가할 수 있습니다.
정적 분석 솔루션이 제안 된 이 특정 주제에 대한 과학적 조사는 다음과 같습니다.
구조적 논리를 통한 정규식 지수 런타임에 대한 정적 분석 / Rathnayake, Thielecke
역 추적을 사용하는 정규식 일치는 지수 런타임을 가질 수 있으며 시스템 보안 문헌에서 REDoS로 알려진 알고리즘 복잡성 공격을 초래합니다. 이 백서에서는 특정 정규식이 일부 입력에 대해 지수 런타임을 가질 수 있는지 여부를 감지하는 최근에 게시 된 정적 분석을 작성합니다. 우리는 전이 관계의 힘과 결과물을 형성함으로써 REDoS 문제를 도달 가능성으로 줄임으로써보다 정확한 분석을 체계적으로 구성합니다. 지수 적 파열을 일으키는 나무의 가지가 비선형의 형태로 특징 지어지는 검색 구조의 구조적 미적분학을 사용하여 분석의 정확성이 입증됩니다.