공격에 대한 정규식의 사용자 입력 보호


9

정규식 서비스 거부 (ReDoS)를 알고 있습니다. 사용자가 기하 급수적으로 느린 패턴을 제출하지 않으면 서 사용자 정의 정규식을 작성할 수있는 합리적인 방법이 있습니까?


세부 정보가 부족합니다. 플랫폼, 사용법 등
whatsisname

8
사용자가 잘못된 정규 표현식을 제출하지 않도록하는 대신 일정 기간이 지나면 실행을 취소하는 솔루션 일 수 있습니까?
Samuel

답변:


8

정규 표현식의 문제점은 정규 표현식 자체가 아니라 역 추적과 같은 모든 종류의 "편리한"기능을 가진 정규 표현식 엔진이라는 것입니다. 따라서 이러한 기능없이 정규식 엔진을 사용하면 피할 수 있습니다.

정규식 컴퓨터 과학 개념은 유한 상태 머신으로 컴파일 된 후 항상 선형 시간으로 일치시킬 수 있습니다. 따라서 상태 머신 기반 정규식 엔진을 ReDoS에 사용할 수 없습니다. 그러나 병리학 적 예에서 필요한 상태 기계가 다소 커질 수 있습니다. 그러나 사용 가능한 메모리를 제한하는 것은 사용 가능한 계산 시간을 제한하는 것보다 쉬운 경향이 있습니다.

RE2 엔진은 신뢰할 수없는 정규 표현식에 대처하기 위해 특별히 개발 된 선형 회 실행되도록 설계되었습니다.

다른 대안은 정규식을 간단한 표기법으로 조립하는 것입니다. 예를 들어 사용자가 글로브 패턴 (예 :)을 사용하도록 허용 할 수 있습니다 *.txt. 그런 다음, 예를 들어 중첩을 허용하지 않고 탐욕스러운 수량자를 사용하여 역 추적을 방지하는 방식으로 구문 분석 할 수 있습니다. 많은 사용 사례에서 단순화 된 패턴 표기법만으로 충분합니다.


11

정규 표현식을 분석하여 분석 자체가 느려 지지 않고 느리게 진행되는지 여부를 확인 하면 정지 문제를 해결하는 데 도움이됩니다. 다시 말해, 정확하고 완전한 솔루션을 찾을 수 없습니다 .

당신은 물론, 정확하고있는 솔루션을 찾을 수 있습니다 완성. 예를 들어, 사용하기에 안전한 제한된 기능 목록 (예 : 문자 클래스 예, 반복 번호 ...)으로 작업 할 수 있습니다. 이를 통해 많은 중요하지 않은 정규 표현식을 전달하고 모든 중요한 규칙을 거부하며 자동으로 안전하지만 자동으로 증명하기에는 너무 잘못된 규칙을 잘못 거부 할 수 있습니다.


3
첫 번째 진술에 대한 인용이 있습니까? 그런 증거를 보는 데 관심이 있습니다. 정규식은 튜링이 완료되지 않으므로 정지 문제가 적용되지 않을 수 있습니다.
Sebastian Redl

3
@SebastianRedl 그것의 엄밀히 말하면, 정규 표현식 것은 사실 하지 튜링 완성하지만, 인기가 사용중인 모든 정규식 라이브러리는 그들이 더 이상 정기적으로하지 않습니다 확장이있다. 실제로 사용자를 문자 그대로 정규식으로 제한 하면이 상황에 적합한 솔루션이 될 수 있습니다.
Kilian Foth

2
@KilianFoth : IIRC, 심지어 정규 정규 표현식 (CompSci의 단어 의미)에도 기하 급수적 인 역 추적이 필요할 수 있습니다. 그러나 그것들은 Turing-complete가 아니기 때문에 주어진 정규 표현식에 대해 이론적 으로이 상한을 설정할 수 있습니다. 그러나 이로 인해 두 가지 문제가 발생합니다. 상한을 자동으로 결정하는 것은 사소한 작업이 아니며 결과가 예상 보다 훨씬 높은 상한과 같이 결과가 부적절하게 높아질 수 있습니다 .
MSalters 2018 년

@msalters 모든 진정한 정규식은 기계적으로 결정적인 유한 상태 오토 마톤으로 변환 가능합니다. 즉, 역 추적없이 표현식을 항상 일치시킬 수 있습니다. 물론 FSA가 비합리적으로 커질 수 있지만 생성 된 FSA의 상태 수를 제한하면 문제의 공격을 방지하기에 충분한 솔루션이 될 수 있습니다.
Jules

1

라자루스 프로젝트의 파서 작성자로서 주어진 정규 표현식에 대해 주어진 텍스트에서 어떤 리소스가 소비되는지 이해할 수있는 방법이 없다고 말하고 싶습니다.

동일한 자원을 소비하지 않으면 (적어도 큰 의미에서) 의미합니다.

따라서 가장 좋은 방법은 별도의 스레드에서 구문 분석기를 실행하고 시간 초과 후 종료하십시오.


0

다른 답변 외에도 솔루션은 자체 정규식 라이브러리를 롤링하여 실행 중에 성능 계측을 허용하므로 일부 기준이 충족되면 실행을 중간에 중단시킬 수있는 수단을 제공 할 수 있습니다.

마찬가지로 다른 스레드에서 정규식을 실행하고 너무 오래 걸리면 스레드를 종료 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.