1. 개요
ReDoS(Regular expression Denial of Service)서비스 거부 공격 중의 하나로 정규 표현식의 취약점을 이용한 공격 방법이다.
2. 방식
핵심적인 내용을 짚자면, ReDoS는 서버가 처리하는 알고리즘의 시간복잡도를 급증시켜 서버의 자원을 급격히 고갈시켜버리는 식으로 공격한다. 소모 자원을 비정상적으로 올리기만 하면 그 뒤는 다른 서비스 거부 공격과 동일하므로 핵심은 시간복잡도를 증가시키는 것이다.정규 표현식의 존재 의의는 일정한 패턴을 두고 들어오는 입력값들이 그 패턴과 일치하는지를 파악하기 위함이다. 컴퓨터공학 분야를 잘 모르는 일반인들도 알기 쉽게 설명하자면, 인터넷을 이용하면서 이메일이나 휴대폰번호, 비밀번호 같이 어떤 값을 입력해야 하는 곳에 제약이 걸려 있는 것을 본적이 있을 것이다. '특수문자가 하나 포함될 것', '@ 문자가 반드시 중간에 들어갈 것' 등과 같이 사용자가 입력한 값이 요구하는 조건에 맞는지 아닌지 판단하기 위해 사용되는 것이 바로 정규 표현식이다.
ReDoS는 여기에 비정상적인 문자열을 입력함으로써 정규 표현식 처리에 걸리는 시간을 비정상적으로 오래 걸리게 만든다. 서버의 컴퓨팅 자원이 여기에 죄다 소모되어버리니 서버는 결국 뻗게 되고 마는 것이다.
3. 위험성
ReDoS 자체는 사고 발생시 비교적 대응이 쉽고 해당 로직을 교체하거나 방어 코딩을 추가하는 것으로 사후 재발생을 막을 수 있기 때문에, 보안 수위를 높여도 끊임없이 새로운 공격 루트가 생겨나는 DDoS 공격과 비교하면 형편은 낫다.오히려 그렇기 때문에 상대적으로 낮은 인지도가 문제점으로 꼽히곤 한다. ReDoS 발생을 막기 위해서는 백트래킹 기법을 사용하지 않는 정규 표현식 엔진을 사용할 필요가 있지만 이를 사용하지 않는 경우가 꽤 많다. 백트래킹 기법을 사용하지 않으면 일반적인 검출 로직에 비효율성이 생기는 경우가 몇 있긴 하지만 그렇지 않은 구간에서도 무분별하게 사용되곤 한다는게 문제.
4. 사례
2016년 7월 20일, ReDoS 공격으로 Stack Overflow의 사이트가 34분간 중단되는 사고가 발생했다. 해당 서비스 중단은 게시글의 공백 여부를 체크하는 정규 표현식 알고리즘이 일으킨 과부하가 원인이었다. 공격자는 약 2만 자의 공백문자가 포함된 게시글을 의도적으로 송신했으며 서버 자원 고갈이 발생하여 서버가 뻗었던 것.2019년 7월에는 Cloudflare의 DNS서버가 중단되는 사고가 있었다. 이 또한 XSS 공격을 방지하기 위해 쓰인 URL 검출 규칙이 ReDoS를 유발했다.