
Python パッケージ Flask-Security-Too バージョン 5.3.2 以下に存在するオープンリダイレクトの脆弱性により、攻撃者は /login および /register ルートの ?next パラメータを悪用した巧妙な URL を介して、無防備なユーザーを悪意のあるサイトにリダイレクトできます。
Flask-Security-Too には、next パラメータ内で指定された URL が相対 URL であるか、リクエスト URL と同じネットワークロケーションであるかを検証するロジックが含まれています。これはオープンリダイレクトを防止するために実装されています。
Flask-Security-Too Python パッケージは、以前に検証ロジックのバイパスが可能であることが判明しており、バージョン 4.1.0 では https://example/login?next=\\\github.com のような既知の例が修正されました。
しかし、Web ブラウザが 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)*[/\\].*"
または
autocorrect_location_header を True に設定する:@app.after_request
def fix_location_header(response):
response.autocorrect_location_header = True
return response
回避策は Brandon T. Elliott により発見されました(2023年11月)