계: Security Features

소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.

Django Bad Practices: Overly Broad Host Header Verification

Abstract
Host 헤더를 확인하지 않으면 공격자가 Cross-Site Request Forgery, 캐시 감염 공격, 전자 메일의 링크 감염에 사용할 수 있는 허위 Host 값을 보낼 수 있습니다.
Explanation
Django 응용 프로그램 설정에서는 "*"를 ALLOWED_HOSTS 설정의 항목으로 지정합니다. 이 설정은 django.http.HttpRequest.get_host()에서 Host 헤더를 확인하는 데 사용됩니다. 값이 "*"이면 Host 헤더에서 모든 호스트가 허용됩니다. 공격자는 이를 캐시 감염 공격이나 전자 메일의 링크를 감염시키는 데 사용할 수 있습니다.

예제 1: 응용 프로그램에서 암호 재설정 기능을 제공하며, 이를 통해 사용자는 일정 유형의 고유 값(예: 전자 메일 주소)을 전송하여 자신을 식별할 수 있습니다. 그러면 새 암호를 설정할 수 있는 페이지의 링크와 함께 암호 재설정 전자 메일이 발송됩니다. 사용자에게 전송되는 링크는 하드코드된 URL을 방지하기 위해 암호 재설정 기능을 제공하는 사이트를 참조하도록 Host 값을 사용하여 생성할 수 있습니다. 예:


...
def reset_password(request):
url = "http://%s/new_password/?token=%s" % (request.get_host(), generate_token())
send_email(reset_link=url)
redirect("home")
...


공격자는 자신이 제어하는 서버를 가리키는 허위 Host 헤더 값과 피해자의 전자 메일을 제출하여 피해자의 암호를 재설정하려고 할 수 있습니다. 이 경우 피해자는 암호 재설정 시스템으로 연결되는 링크가 포함된 전자 메일을 받게 되며, 해당 링크를 방문하기로 결정하면 공격자의 제어에 따라 피해자의 자격 증명을 수집하도록 허위 양식을 제공하는 사이트를 방문하게 됩니다.
References
[1] Django Foundation Host header validation
[2] Django Foundation ALLOWED_HOSTS
[3] Standards Mapping - General Data Protection Regulation (GDPR) Access Violation
[4] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective C.3.1 - Web Software Attack Mitigation
[5] Standards Mapping - Web Application Security Consortium Version 2.00 Application Misconfiguration (WASC-15)
desc.structural.python.django_bad_practices_overly_broad_host_header_verification