인터넷에서 좋은 글을 보고 공유합니다. 2019년 7월 2일에 발생한 클라우드플레어 서버 장애 사태에 대한 장애보고서입니다. 상세한 내용은 번역본과 원문을 참고하시면 좋을 것 같습니다. 바쁘신 분들을 위한 요약정보는 다음과 같습니다.
원인 및 처리
- 방화벽 정책에 적용된 정규식이 문제였음
- 적용된 정규식이 과도한 백트래킹을 유발
- 백트래킹으로 인한 CPU 사용률 급증
- 사용자 응답 지연으로 장애 발생
- 방화벽 정책을 원복하여 장애 해소
- 방화벽에 사용된 정규식 라이브러리 변경
- 정규식의 처리 시간 테스팅 추가 등
정규식이 과도한 문제를 발생시켰다??
여기서 정규식에 어떻게 과도한 문제를 발생했는지 알아보겠습니다.
정규식 알고리즘
- 저희가 사용하는 정규식은 크게 두 가지 분류가 있음
- Spencer 류
- 펄, PCRE, 파이썬, 루비, 자바
- 평균적으로 충분히 빠르고, 표현력이 좋음
- 퇴각검색 이용
- Thompson 류
- awk, sed, grep, RE2, Go, 러스트
- 전진하면서 처리
- 빠름
- 스펜서류를 이용하는 정규식은 표현에 따라서 연산이 많아질 수 있기 때문에 해킹 공격에도 이용
- ReDoS 공격
- 참고 https://www.slideshare.net/sublee/ss-113085659
정규식의 백트래킹
- 클라우드 플레어는 PCRE(Perl Compatiable Regular Experessions)를 이용하여 정규식을 처리하고 있었음
- PCRE는 퇴각 검색(백트래킹)을 이용하여 x=x 라는 문자열을 정규식을 이용하여 처리하면 23번의 반복을 거쳐 처리
- x=xx 는 33번, x=xxx는 45번, x가 20개면 555번의 과정을 거침
- 단순한 패턴 매칭 처리에도 여러번의 과정을 거쳐야 함
# 전체 정규식 (?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))
전체 정규식에서 문제가 된 부분
.: 문자 1개
*: 0번 이상 발생
..=.*
## 해결 방안
+ 방화벽 정책을 수정
+ 정규식 처리 라이브러리를 변경
+ re2 [바로가기](https://github.com/google/re2)
+ 구글에서 제공하는 정규식 라이브러리
+ 입력 문자열의 길이에 선형으로 동작하는 것을 보장
+ 적당한 시간에 처리되지 않으면 실패를 반환
## re2의 제약사항
https://support.google.com/a/answer/1371417?hl=ko
정규 문자 제한사항
다음과 같은 특수문자는 이메일 처리 지연의 원인이 되므로 정규 표현식에서 지원하지 않습니다.
- *(별표)
- +(더하기 기호)
참고
반응형
'IT 소식' 카테고리의 다른 글
[스크랩] 카카오 뱅크에 사용된 기술 (0) | 2017.10.30 |
---|---|
[스크랩] MS. 윈도우10 1607업데이트를 통해 Bash Shell 제공예정 (0) | 2016.03.31 |
[스크랩] FBI, 아이폰 잠금해제 성공… 애플 보안 구멍 (0) | 2016.03.31 |