[하루한줄] CVE-2021-33203: Django path traversal vulnerability

URL

GHSL-2021-075: Path injection in Django - CVE-2021-33203

Target

  • tested version: Django 3.2.2

Explain

파이썬에서 작성된 오픈소스 웹 프레임워크 Django에서 path traversal 취약점이 발견되었습니다. 해당 취약점은 django.contrib.admindocs 모듈이 활성화되었을 때 발생합니다.

class TemplateDetailView(BaseAdminDocsView):
...
	def get_context_data(self, **kargs):
	...
	template_file = Path(directory) / template
	if template_file.exists():
		template_contents = template_file.read_text()
...

get_context_data() 함수에서 해커는 template 변수를 임의의 값으로 설정할 수 있고 이를 별다른 검증 없이 Path join 합니다. 이를 이용해 template directory 외부 경로의 파일을 제공할 수 있어 http://localhost:8000/admin/doc/templates//etc/passwd/와 같은 요청을 보내는 것으로 파일 시스템 내 임의 경로의 파일 내용이 렌더링 메서드로 전달되어 파일 내용이 유출될 수 있습니다. 해당 취약점은 아래와 같이 safe_join 함수를 사용해 경로를 합치는 것으로 패치되었습니다.

template_file = Path(safe_join(directory, template))

자세한 패치 히스토리는 https://github.com/django/django/commit/46572de2e92fdeaf047f80c44d52269e54ad68db 에서 확인할 수 있습니다.