Unsachgemäße Neutralisierung von CRLF-Sequenzen ('CRLF Injection')

Beschreibung

CRLF Injection ist eine Schwachstelle, die auftritt, wenn Software Ausgabedatensätze unter Verwendung von extern beeinflussten Eingaben konstruiert, aber Carriage Return (CR, \r, %0d) und Line Feed (LF, \n, %0a) Zeichen nicht oder nicht korrekt neutralisiert. In HTTP und vielen textbasierten Protokollen begrenzen CRLF-Sequenzen Header und trennen Header vom Body-Inhalt. Angreifer nutzen diese Schwachstelle aus, um beliebige Header einzuschleusen, HTTP-Antworten aufzuteilen, Log-Dateien zu manipulieren oder die Struktur von Protokollnachrichten zu ändern. HTTP Response Splitting ist eine besonders gefährliche Form der CRLF-Injection, die Cache-Poisoning, Cross-Site-Scripting und Session-Hijacking-Angriffe ermöglicht.

Risiko

CRLF-Injection ermöglicht je nach Kontext mächtige Angriffe. In HTTP-Antworten können Angreifer zusätzliche Header einschleusen, einschließlich Set-Cookie für Session-Fixation, Location für Redirect-Angriffe oder Sicherheits-Header, um Schutzmaßnahmen zu deaktivieren. HTTP Response Splitting ermöglicht das Einschleusen vollständiger gefälschter Antworten, die von Proxies gecacht werden können, was weitreichende Angriffe gegen andere Benutzer ermöglicht. In E-Mail-Headern ermöglicht CRLF-Injection E-Mail-Header-Injection für Spam-Relay oder Spoofing. Log-Injection kann Log-Dateien beschädigen, falsche Einträge einschleusen, um Spuren zu verwischen, oder Log-Viewer ausnutzen, die für Terminal-Escape-Sequenzen anfällig sind. Die Einfachheit der Ausnutzung kombiniert mit potenziell schwerwiegenden Auswirkungen macht dies zu einer hochprioritären Schwachstellenklasse.

Lösung

Entfernen oder codieren Sie alle CR- und LF-Zeichen aus Benutzereingaben, bevor Sie diese in HTTP-Header, Log-Nachrichten, E-Mail-Header oder andere zeilengetrennte Kontexte einbinden. Verwenden Sie framework-bereitgestellte Funktionen zum Setzen von HTTP-Headern, die die Codierung automatisch handhaben. Validieren Sie, dass Benutzereingaben keine unerwarteten Zeilenumbrüche enthalten. Für URLs und Redirect-Ziele validieren Sie gegen Allowlists erlaubter Domains und Pfade. Implementieren Sie ordnungsgemäße Ausgabecodierung für den spezifischen Kontext (URL-Codierung für URL-Parameter, Header-Codierung für HTTP-Header). Verwenden Sie moderne Web-Frameworks, die CRLF-Injection standardmäßig in Header-Setzfunktionen verhindern.

Häufige Auswirkungen

AuswirkungDetails
IntegritätBereich: Integrität

HTTP Response Splitting ermöglicht das Einschleusen beliebiger Inhalte einschließlich bösartigem JavaScript, gefälschten Login-Seiten oder irreführenden Informationen.
ZugriffskontrolleBereich: Zugriffskontrolle

Session-Fixation durch eingeschleuste Set-Cookie-Header kann Kontoübernahme und unbefugten Zugriff ermöglichen.
VertraulichkeitBereich: Vertraulichkeit

Cache-Poisoning durch Response-Splitting kann Daten anderer Benutzer offenlegen oder diese auf bösartige Seiten umleiten.

Beispielcode + Lösungscode

Anfälliger Code

from flask import Flask, request, redirect, make_response

app = Flask(__name__)

@app.route('/redirect')
def vulnerable_redirect():
    # ANFÄLLIG: Benutzereingabe direkt im Location-Header
    # Angriff: url=http://example.com%0d%0aSet-Cookie:%20session=malicious
    url = request.args.get('url')
    response = make_response('Weiterleitung...')
    response.headers['Location'] = url  # CRLF-Injection möglich
    response.status_code = 302
    return response

@app.route('/setlang')
def set_language():
    # ANFÄLLIG: Benutzereingabe im Cookie ohne Bereinigung
    # Angriff: lang=en%0d%0aSet-Cookie:%20admin=true
    lang = request.args.get('lang')
    response = make_response('Sprache gesetzt')
    response.headers['Set-Cookie'] = f'language={lang}'
    return response

Korrigierter Code

from flask import Flask, request, redirect, make_response, abort
import re
from urllib.parse import urlparse

app = Flask(__name__)

def sanitize_header_value(value):
    """CRLF-Zeichen aus Header-Werten entfernen"""
    if value is None:
        return None
    # CR, LF und Null-Bytes entfernen
    return re.sub(r'[\r\n\x00]', '', value)

def validate_redirect_url(url):
    """Redirect-URL gegen Allowlist validieren"""
    allowed_domains = ['example.com', 'trusted.com']

    try:
        parsed = urlparse(url)
        if parsed.scheme not in ['http', 'https']:
            return None
        if parsed.netloc not in allowed_domains:
            return None
        return url
    except:
        return None

@app.route('/redirect')
def safe_redirect():
    url = request.args.get('url', '')

    # CRLF-Zeichen bereinigen
    url = sanitize_header_value(url)

    # Gegen Allowlist validieren
    safe_url = validate_redirect_url(url)
    if not safe_url:
        abort(400, 'Ungültige Redirect-URL')

    # Framework-Redirect-Funktion verwenden (fügt Schutz hinzu)
    return redirect(safe_url)

@app.route('/setlang')
def safe_set_language():
    lang = request.args.get('lang', 'en')

    # Gegen Allowlist validieren
    allowed_languages = ['en', 'de', 'fr', 'es', 'ja']
    if lang not in allowed_languages:
        lang = 'en'

    # response.set_cookie() anstelle von manuellem Header verwenden
    response = make_response('Sprache gesetzt')
    response.set_cookie('language', lang, httponly=True, secure=True)
    return response

Ausgenutzt in der Praxis

HTTP Response Splitting-Angriffe (Webanwendungen, historisch)

CRLF-Injection, die HTTP Response Splitting ermöglicht, wurde gegen verschiedene Webanwendungen ausgenutzt, um Cache-Poisoning-Angriffe durchzuführen, bei denen bösartige Antworten von Proxy-Servern gecacht und anderen Benutzern ausgeliefert werden.


Tools zum Testen/Ausnutzen

  • Burp Suite — Web-Sicherheitstestplattform mit CRLF-Injection-Erkennung in Headern und Antworten.

  • CRLFuzz — Automatisierter CRLF-Injection-Schwachstellenscanner.


CVE-Beispiele

  • CVE-2023-27350 — PaperCut CRLF-Injection in der Druckauftragsverarbeitung.

  • CVE-2021-33026 — Flask-Caching CRLF-Injection in der Cache-Key-Verarbeitung.


Referenzen

  1. MITRE. "CWE-93: Improper Neutralization of CRLF Sequences." https://cwe.mitre.org/data/definitions/93.html

  2. OWASP. "HTTP Response Splitting." https://owasp.org/www-community/attacks/HTTP_Response_Splitting