サーバー情報の露出

不要なサーバー内部情報がクライアントに公開されています。

説明

サーバーがソフトウェアのバージョン、構成要素、デバッグメッセージなどの不要な内部情報をクライアントに公開すると、攻撃者が攻撃方法を選ぶ手掛かりになる可能性があります。

想定される影響

  • 攻撃の準備: 公開された情報から、システムの弱点を探されるおそれがあります。
  • 脆弱性の悪用: バージョン情報をもとに、既知の脆弱性を特定される可能性があります。
  • 追加の侵害: 悪用可能な弱点がある場合は、システムやデータへの攻撃に情報を利用されるおそれがあります。

対処方法

  • 応答ヘッダーやエラーメッセージに含めるサーバー情報を最小限にしてください。
  • 本番環境ではデバッグモードを無効にしてください。
  • サーバーとフレームワークの設定を確認し、不要な情報を公開しないでください。

例

アプリケーション設定の抜粋です。デバッグ応答と、サーバーやプロキシのバージョンヘッダーは別々に確認してください。DjangoのHTTPS/HSTS設定はHTTPSでの運用とSecurityMiddlewareの構成を前提とします。FlaskのREMEMBER_COOKIE_SECUREは、Flask-Loginのrememberクッキーに適用されます。

Django

変更前

python
# DEBUGを有効にしたDjango
from django.http import HttpResponse

def unsafe_view(request):
    return HttpResponse("Hello, world!")

# settings.py
DEBUG = True

変更後

python
# DEBUGを無効にしたDjango
from django.http import HttpResponse

def safe_view(request):
    return HttpResponse("Hello, world!")

# settings.py
DEBUG = False
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_SECONDS = 3600
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

説明:

  • 変更前: デバッグモードにより、エラー応答で内部情報が公開されるおそれがあります。
  • 変更後: デバッグ用のエラー応答を無効にします。ほかの設定はHTTPSやクッキーを保護するもので、サーバーのバージョンヘッダーを自動的に削除するものではありません。

Flask

変更前

python
# DEBUGを有効にしたFlask
from flask import Flask

app = Flask(__name__)
app.config['DEBUG'] = True

@app.route('/')
def unsafe():
    return "Hello, world!"

変更後

python
# DEBUGを無効にしたFlask
from flask import Flask

app = Flask(__name__)
app.config['DEBUG'] = False
app.config['SESSION_COOKIE_SECURE'] = True
app.config['REMEMBER_COOKIE_SECURE'] = True

@app.route('/')
def safe():
    return "Hello, world!"

説明:

  • 変更前: 有効なデバッグモードから内部情報が公開される可能性があります。
  • 変更後: デバッグ応答を無効にし、HTTPS用のクッキー設定を適用します。バージョンヘッダーはWebサーバーとプロキシでも別途確認してください。

FastAPI

変更前

python
# デバッグモードを有効にしたFastAPI
from fastapi import FastAPI

app = FastAPI(debug=True)

@app.get("/")
async def unsafe():
    return {"message": "Hello, world!"}

変更後

python
# デバッグモードを無効にしたFastAPI
from fastapi import FastAPI

app = FastAPI(debug=False)

@app.get("/")
async def safe():
    return {"message": "Hello, world!"}

説明:

  • 変更前: デバッグ応答によって内部情報がクライアントに伝わる可能性があります。
  • 変更後: デバッグモードを無効にして、内部情報の公開を抑えます。

参考資料