본문 바로가기
IT 소식

[스크랩] 클라우드 플레어 장애 복구 보고서

by hs_seo 2019. 8. 13.

인터넷에서 좋은 글을 보고 공유합니다. 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

정규 문자 제한사항

다음과 같은 특수문자는 이메일 처리 지연의 원인이 되므로 정규 표현식에서 지원하지 않습니다.

  • *(별표)
  • +(더하기 기호)

참고

반응형