
CVE-2023-49438 - Flask-Security-Too의 오픈 리다이렉트 취약점

Python 패키지 Flask-Security-Too <=버전 5.3.2의 오픈 리디렉션 취약점으로 인해 공격자가 /login 및 /register 경로의 ?next 매개변수를 악용하여 조작된 URL을 통해 의심하지 않는 사용자를 악성 사이트로 리디렉션할 수 있습니다.
Flask-Security-Too는 next 매개변수에 지정된 URL이 상대적이거나 요청 URL과 동일한 네트워크 위치를 가지고 있는지 확인하는 로직을 포함합니다. 이는 오픈 리디렉션을 방지하기 위한 시도로 구현되었습니다.
Flask-Security-Too Python 패키지는 이전에 검증 로직 우회에 취약한 것으로 발견되었으며, 버전 4.1.0에서는 https://example/login?next=\\\github.com과 같은 이전에 알려진 예제를 패치했습니다.
그러나 웹 브라우저가 URL에서 슬래시를 정규화하는 방식으로 인해 우회 방법이 발견되어 패키지가 버전 <=5.3.2에서 취약하게 되었습니다.
https://example/login?next=/\github.com
https://example/login?next=\/github.com
CVE-2021-32618에서 이전에 언급된 바와 같이, "Werkzeug를 WSGI 계층으로 사용하는 경우(Flask 애플리케이션에서 매우 일반적), 기본적으로 항상 Location 헤더를 절대 경로로 보장하므로 이 공격 벡터는 무의미합니다."
그러나, Werkzeug >=2.1.0에서 autocorrect_location_header 구성이 False로 변경되었습니다. 즉, 리디렉션의 Location 헤더가 기본적으로 상대 경로가 됩니다. 따라서 이 문제는 이전에는 영향을 받지 않았으나 Werkzeug >=2.1.0을 WSGI 계층으로 사용하는 애플리케이션에 영향을 줄 수 있습니다.
pip install -U Flask-Security-Too
또는
app.config['SECURITY_REDIRECT_VALIDATE_MODE'] = "regex"
app.config['SECURITY_REDIRECT_VALIDATE_RE'] = r"^/{4,}|\\{3,}|[\s\000-\037][/\\]{2,}(?![/\\])|[/\\](https://github.com/brandon-t-elliott/cve-2023-49438/blob/main/%5B%5E/%5C%5C%5D%7C/%5B%5E/%5C%5C%5D)*[/\\].*"
또는
@app.after_request
def fix_location_header(response):
response.autocorrect_location_header = True
return response
우회 방법 발견: Brandon T. Elliott, 2023년 11월