1-day 분석

CVE-2023-36053 분석

Namchun 2023. 9. 8. 01:03

이번 제 27회 해킹캠프 CTF에서 웹해킹 문제에 해당 CVE와 유사한 문제가 출제되었다.

우선 CVE를 이용한 문제는 필자에게는 처음이었고, 대회가 끝나고 실제로 제보하신 스틸리언 윤석찬님의 풀이를 들으며 굉장히 흥미로운 취약점이라 생각되어 가볍게 분석? 공부를 해보았다.

 

https://nvd.nist.gov/vuln/detail/CVE-2023-36053

 

NVD - CVE-2023-36053

CVE-2023-36053 Detail Modified This vulnerability has been modified since it was last analyzed by the NVD. It is awaiting reanalysis which may result in further changes to the information provided. Description In Django 3.2 before 3.2.20, 4 before 4.1.10,

nvd.nist.gov

 

해당 취약점은 Django 4.2, 4.1, 3.2 버전에서 발견된 Potential ReDoS (잠재적인 정규식을 이용한 서비스 거부) 취약점으로써 EmailValidator의 domain_regex라는 내부 변수로 도메인의 유효성을 검사할 때 제대로된 길이 검사가 이루어지지 않아 발생하게 된다.

 

 

유의깊게 봐야할 부분은

  • [A-Z0-9-]{0,61}[A-Z0-9] : 도메인 이름의 중간 부분을 나타내며, 대문자, 숫자 또는 하이픈 문자를 0에서 61번 반복할 수 있음
  • + : 하나 이상의 도메인 이름 구성 요소를 나타냄

이렇게 두 가지로, 도메인 부분에 61글자의 문자열을 계속 중첩하여 추가할 수 있음을 알 수 있다.

ex) "n4mchun@gmail.gmail.gmail.gmail.gmail. ... gmail.com" -> DoS 공격!

 

 

 

그렇다면 현재 코드는 어떻게 패치되었는지 살펴보도록 하겠다.

pip install Django==4.2.3

git clone https://github.com/django/django.git

(install Django version 4.2.3)

(4.2.3)

코드를 살펴보면 위의 패치 전 정규표현식과 전혀 다르지 않다.

 

하지만 아래의 __call__함수를 보면 value를 넣어서 객체를 호출할 때 value의 길이가 320이 넘는지 검사하는 코드가 추가되었고, 아까 작성한 악성 메일 문자열을 넣게된다면 ValidationError로 실행이 종료된다.

 

(약 171MB 크기의 악성 메일 문자열을 검사하는 코드)

 

 

 

그래도 정규표현식이 변한 것은 아니기에 길이 320 이하의 "n4mchun@gmail.gmail.gmail.gmail.gmail.gmail.gmail.com" 처럼 긴 문자열을 삽입하게 되면 정상적인 도메인이라고 판단한다.

하지만 저정도의 문자열로는 연산 과정에서 유의미한 시간 지연이 발생하지는 않을 것으로 예상된다.

 

따라서 이러한 ReDoS 공격을 막기 위해서는 정규식 검사를 하기 전, 길이 검사 등의 적절한 사전 검사 코드가 필요할 것이라 생각한다.


reference

https://nvd.nist.gov/vuln/detail/CVE-2023-36053

https://ufo.stealien.com/2023-07-03/django-cve-2023-36053

https://docs.djangoproject.com/en/4.2/releases/security/