모든 '사악한'정규식에 대해 비 사악한 대안이 있습니까? 아니면 악마가 문법에 있습니까?


16

분명히 ReDos 공격은 (다른 유용한) 정규 표현식의 특성을 악용합니다. 본질적으로 NFA에서 정의한 그래프를 통해 가능한 경로를 폭발시킵니다.

동등한 '비악'정규식을 작성하여 이러한 문제를 피할 수 있습니까? 그렇지 않은 경우 (그래서 문법을 NFA가 실제 공간 / 시간에서 처리 할 수없는 경우) 어떤 구문 분석 방법이 더 좋을까요? 왜?


정확한 기술 언어를 사용했다면 우연입니다. 비 학술에 대한 답을 바보로 작성하십시오 :-)
David Bullock

1
실제로 ReDos'd가되는 것을 피할 수있는 실용적인 방법 을 찾으려고 노력하고 있으며이 질문이 나왔습니다.
David Bullock

질문을 바꾸려면 (?) : 모든 정규 언어에는 최소 NFA 상태의 수에서 다항식으로 길이가 한정된 정규 표현식이 있습니까?
A.Schulz

1
@ A.Schulz. 나는 그것이 질문이라고 생각하지 않습니다. 이것이 ReDos 공격이 작동하는 방식이 아닙니다. ReDos 공격에서 regexp는 프로그램 소스 코드에 하드 코딩되고 개발자가 신뢰할 수있는 것으로 추정되는 개발자가 제공합니다. 그런 다음 공격자는 프로그램이 정규 표현식과 일치하는 입력 문자열을 제공합니다. 적이 정말 긴 시간 동안 매처를 실행시키는 입력 문자열을 찾을 수 있으면 적이 승리합니다. 따라서 우리는 적의 정규 표현식이 아니라 적의 입력에 대해 우려하고 있습니다. (계속)
DW

결과적으로, 나는 그 질문이 대신 있다고 생각합니다. 모든 정규 언어에는 정규 표현식이 있습니다. 정규 표현식과 문자 문자열 을 일치시키는 데 시간 이 걸리고 , 여기서 은 그렇지 않습니다. 함수 (예 : 다항식 등)가 빠르게 증가하고 있습니까? [우연히,이 재구성은 대답이 내가 대답에서 언급 한 것처럼 일치하는 데 사용되는 알고리즘에 달려 있음을 분명히합니다.] 최소 NFA 크기의 함수로서 정규 표현식의 크기는 그렇지 않습니다. 여기서 정말 중요합니다. O ( f ( n ) ) f ( n ) nnO(f(n))f(n)n
DW

답변:


14

정규 표현식을 가지고 있는지 정규 표현식을 가지고 있는지에 달려 있습니다. 정규 표현식은 악하지만 정규 표현식은 아름다움이며 결코 당신을 악하게 만들지 않습니다.

정규 표현식으로, 나는 현대 정규 표현식, 즉 역 참조와 같은 추가 현대 기능을 가진 정규 표현식 (예 : Perl 호환 정규 표현식)을 의미합니다. 고전 정규 표현식은 역 참조, 미리보기, 뒤 돌이 등을 허용하지 않기 때문에 공식 언어 / 자전거 이론 교과서의 고전 정규 표현식보다 더 강력합니다.

고전적인 정규 표현식의 경우, 정규 표현식을 구현하면 정규 표현식이 너무 나쁘지 않습니다. 특히 일치하는 표준 알고리즘은 정규식을 NFA로 변환 한 다음 입력 문자열에서 NFA를 실행하는 것입니다. 이 알고리즘의 경우 정규 표현식이 고정 된 경우 문자 문자열 을 테스트하는 최악의 실행 시간 은 입니다. 이것은 실행 시간이 너무 빠르게 폭발 할 수 없음을 의미합니다. 실행 시간이 기하 급수적으로 증가하는 문자열이 없습니다. 따라서이 알고리즘을 사용하는 매처를 사용하는 경우 클래식 정규 표현식은 악의가 없습니다.O ( N )nO(n)

이것은 정규 표현식 매처의 구현에 따라 다릅니다. 매처의 순진한 구현이있는 경우 일치하는 데 시간이 오래 걸릴 수 있습니다. 해당 속성을 가진 알고리즘이 있습니다. 그러나 이에 대한 가장 좋은 대답은 아마도 정규 표현식을 바꾸지 않는 것입니다. 서비스 거부 공격이 우려되는 경우 더 나은 매처를 선택하는 것이 좋습니다.

이에 비해 일부 현대 정규 표현식은 피할 수 없을 정도로 악하다. 최신 정규 표현식이 있으면 일치하는 데 지수 시간이 필요할 수 있습니다. 특히 역 참조가있는 정규 표현식은 NP-hard 언어를 인식 할 수 있습니다. 결과적으로, 그럴듯한 가정 하에서 일치 테스트에 기하 급수적으로 시간이 걸리는 악의 정규 표현식이 있습니다. 따라서 일부 현대식 정규 표현식은 불가피하게 악합니다. 실행 시간이 기하 급수적으로 증가하지 않는 동등한 정규 표현식을 찾을 수있는 방법은 없습니다.

(이러한 등가물이 존재할 수 있고 이론 상으로는 찾을 수 있지만, 그럴듯한 가정 하에서 등가 정규 표현식을 찾는 데 실제로는 불가능한 기하 급수적 시간이 소요됩니다. 그런 다음 다항식 시간에 NP-hard 문제를 해결하여 P = NP임을 증명할 수 있습니다. 실제로 정규 표현식을 찾지 못하면 동등한 정규 표현식이 존재하지 않는 것이 좋습니다.)


배경과 출처 :


정규식을 여러 개의 작은 정규식으로 나누고 조합하여 사용하여 사악하지 않은 대안을 찾는 것이 쉽지 않습니까?
inf3rno

1

이 답변은 복잡성 이론이 사이버 보안에 적용 가능하고이 영역에서 발생할 수있는 중요한 뉘앙스 / 미묘함을 포함하는 이례적인 크로스 커팅 상황에 대해보다 포괄적 인 관점을 취합니다. 이것은 예상치 못한 입력으로 인해 시스템이 충돌하거나 비정상적으로 오랜 시간이 걸리는 병리학 적 행동을 일으키는 "주입 공격"과 본질적으로 유사합니다.

Wikipedia에는 ​​15 가지 범주의 서비스 거부 공격 이 있으며이 공격은 해당 목록의 "애플리케이션 수준 홍수" 에 해당합니다. 다소 유사한 또 다른 예는 응용 프로그램 로그를 채우는 공격입니다.

주입 공격에 대한 한 가지 해결책은 "입력을 정리"하는 것입니다. 응용 프로그램 디자이너는 잠재적으로 악의적 인 사용자가 제공 한 임의의 정규 표현식을 컴파일해야하는 경우 재평가 할 수 있습니다. 정규 표현식이나 다른 유사한 제한에서 중첩 식을 제거하면이 공격을 피할 수 있습니다. 그것들은 많은 현대 소프트웨어에 내재되어 있지만 정규 표현식을 평가하지 않고도 많은 기능을 제공 할 수 있습니다. 상황에 따라 일부 응용 프로그램에는 이러한 보안이 필요하지 않습니다.

여기에 적용 가능한 내결함성 / 탄력성을 향상시키는 또 다른 방법 은 서로 다른 수준의 소프트웨어 스택 / 계층에 지정된 시간 초과 입니다. 아이디어는 "평균"정규식 평가에 시간 / CPU 또는 명령 제한을 지정하고 초과되면 조기 종료하는 것입니다. 그것들은 커스텀 솔루션으로 구현 될 수 있지만 소프트웨어 나 프로그래밍 언어에는 이러한 목적을 위해 내장 된 타임 아웃이나 프레임 워크가 없습니다.

다음은 내결함성을 개선하기 위해 시간 초과를 사용하는 좋은 예이며 이러한 문제를 완화하기위한 고급 디자인 / 아키텍처 / pov를 보여줍니다. 대용량, 분산 시스템 / Netflix의 내결함성 . 정규 표현식에 특별히 연결된 것은 없지만 여기서 요점은 거의 모든 응용 프로그램 수준 논리가이 프레임 워크 또는 이와 유사한 것에 맞을 수 있다는 것입니다.

이 기사에서는 특히 역 추적 이 어떻게 정규 표현식 일치를 느리게 만들 수 있는지 설명합니다 . 정규 표현식에는 다양한 기능이 있으며 최악의 동작을 유발하는 기능을 평가할 수 있습니다.

정적 분석 솔루션이 제안 된 이 특정 주제에 대한 과학적 조사는 다음과 같습니다.

  • 구조적 논리를 통한 정규식 지수 런타임에 대한 정적 분석 / Rathnayake, Thielecke

    역 추적을 사용하는 정규식 일치는 지수 런타임을 가질 수 있으며 시스템 보안 문헌에서 REDoS로 알려진 알고리즘 복잡성 공격을 초래합니다. 이 백서에서는 특정 정규식이 일부 입력에 대해 지수 런타임을 가질 수 있는지 여부를 감지하는 최근에 게시 된 정적 분석을 작성합니다. 우리는 전이 관계의 힘과 결과물을 형성함으로써 REDoS 문제를 도달 가능성으로 줄임으로써보다 정확한 분석을 체계적으로 구성합니다. 지수 적 파열을 일으키는 나무의 가지가 비선형의 형태로 특징 지어지는 검색 구조의 구조적 미적분학을 사용하여 분석의 정확성이 입증됩니다.


이 답변은 ReDos의 일부 측면에 대해 혼란스러워 보입니다. 1. ReDoS는 주입 공격과 관련이 없습니다. 주입 공격 (예 : XSS, SQL 주입, 명령 주입 등)은 완전히 다릅니다. 2. ReDos는 적에 의해 제출 된 악의적 인 정규 표현식에 관한 것이 아닙니다. 일반적으로 정규식은 프로그램 (하드웨어에서 제공)에 하드 코딩되며 입력 문자열은 사용자가 제공합니다. 일반적으로 문제를 제거하기에 충분한 명확한 입력 유효성 검사 정책이 없기 때문에 입력 유효성 검사로 문제를 합리적으로 해결할 수 없습니다.
DW

당신의 포인트는 ReDos 심판을 바탕으로 기술 / 헤어 스 플리 팅에 해당한다고 생각하고 나무의 숲을 그리워하십시오. 그 와 유사 "제작 된 주입 공격"로 설정합니다. 대답은 코드에서 정규 표현식을 사용하는 것에 대한 대안이 있음을 지적합니다. 정적 분석은 "악한 정규식"을 찾을 수 있습니다. 답변의 모든 포인트가 유효합니다. "일반적으로 정규 표현식은 프로그램에서 하드 코딩되고 (개발자가 제공) 입력 문자열은 사용자가 제공합니다"와 같은 문장은 더 모호한 ReDos 쓰기와 정확히 일치하지 않으며 악의적 인 공격자 등을 나타냅니다. .
vzn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.