설명
서버 정보 노출(Server Information Exposure)은 서버가 불필요하게 내부 정보(예: 서버 버전, 소프트웨어 구성 요소, 디버그 메시지)를 클라이언트에게 노출하는 취약성입니다. 이러한 정보는 공격자가 시스템을 공격하는 데 유용하게 사용될 수 있습니다.
잠재적 영향
- 공격 표면 증가: 공격자는 노출된 정보를 바탕으로 시스템의 취약점을 찾고 공격할 수 있습니다.
- 취약점 악용: 서버 소프트웨어의 버전 정보 등을 통해 알려진 취약점을 악용할 수 있습니다.
- 시스템 손상: 민감한 정보가 노출되어 시스템이 손상되거나 데이터가 유출될 수 있습니다.
해결 방법
- 정보 최소화: 응답 헤더와 에러 메시지에 포함되는 서버 정보를 최소화합니다.
- 디버그 모드 비활성화: 프로덕션 환경에서는 디버그 모드를 비활성화합니다.
- 보안 설정 적용: 서버 소프트웨어와 프레임워크의 보안 설정을 강화하여 정보 노출을 방지합니다.
예시
애플리케이션 설정의 발췌입니다. 디버그 응답과 서버·프록시의 버전 헤더는 별도로 점검하세요. Django의 HTTPS/HSTS 설정은 HTTPS 배포와 SecurityMiddleware 구성을 전제로 하며, Flask의 REMEMBER_COOKIE_SECURE는 Flask-Login의 remember 쿠키에 적용됩니다.
Django
변경 전
python
# Unsafe Django code (DEBUG mode enabled)
from django.http import HttpResponse
def unsafe_view(request):
return HttpResponse("Hello, world!")
# settings.py
DEBUG = True
변경 후
python
# Safe Django code (DEBUG mode disabled)
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
# Unsafe Flask code (DEBUG mode enabled)
from flask import Flask
app = Flask(__name__)
app.config['DEBUG'] = True
@app.route('/')
def unsafe():
return "Hello, world!"
변경 후
python
# Safe Flask code (DEBUG mode disabled)
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용 쿠키 설정을 적용합니다. 서버 버전 헤더는 웹 서버와 프록시에서도 별도로 확인하세요.
FastAPI
변경 전
python
# Unsafe FastAPI code (Debug mode enabled)
from fastapi import FastAPI
app = FastAPI(debug=True)
@app.get("/")
async def unsafe():
return {"message": "Hello, world!"}
변경 후
python
# Safe FastAPI code (Debug mode disabled)
from fastapi import FastAPI
app = FastAPI(debug=False)
@app.get("/")
async def safe():
return {"message": "Hello, world!"}
설명:
- 변경 전: 디버그 모드가 활성화되어 있어, 서버의 내부 정보가 클라이언트에게 노출될 수 있습니다.
- 변경 후: 디버그 모드를 비활성화하여 서버 정보를 최소화합니다.
참조
- OWASP: Information Exposure
- CWE: CWE-200: Exposure of Sensitive Information to an Unauthorized Actor
- CWE: CWE-209: Generation of Error Message Containing Sensitive Information
- CWE: CWE-497: Exposure of Sensitive System Information to an Unauthorized Control Sphere
- Django 4.0의 제거된 X-XSS-Protection 설정