서버 정보 노출

Server Information Exposure

설명

서버 정보 노출(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!"}

설명:

  • 변경 전: 디버그 모드가 활성화되어 있어, 서버의 내부 정보가 클라이언트에게 노출될 수 있습니다.
  • 변경 후: 디버그 모드를 비활성화하여 서버 정보를 최소화합니다.

참조