界: Security Features

ソフトウェアのセキュリティは、セキュリティ ソフトウェアではありません。ここでは、認証、アクセス制御、機密性、暗号化、権限管理などのトピックについて説明します。

Django Bad Practices: Overly Broad Host Header Verification

Abstract
Host ヘッダーを検証しない場合、クロスサイト リクエスト フォージェリ、キャッシュ ポイズニング攻撃、および電子メールのリンクのポイズニングに利用できる、偽の 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