界: Security Features
ソフトウェアのセキュリティは、セキュリティ ソフトウェアではありません。ここでは、認証、アクセス制御、機密性、暗号化、権限管理などのトピックについて説明します。
Django Bad Practices: Overly Broad Host Header Verification
Abstract
Host
ヘッダーを検証しない場合、クロスサイト リクエスト フォージェリ、キャッシュ ポイズニング攻撃、および電子メールのリンクのポイズニングに利用できる、偽の Host
値を送信することを攻撃者に許してしまいます。Explanation
Django アプリケーション設定は
例 1: あるアプリケーションにパスワードのリセット機能があります。何らかの一意の値 (電子メール アドレスなど) を送信すれば、身元を証明できます。パスワード リセット メールが送信され、そのメールにあるリンクから新しいパスワードを設定するためのページにアクセスできます。ハードコーディングされた URL を回避するために、ユーザーに送信されるリンクは
攻撃者は、攻撃対象者の電子メール、および攻撃者が動かしているサーバーを指す、偽の
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