Unvollständige Filterung einer oder mehrerer Instanzen von Sonderzeichen

Beschreibung

Unvollständige Filterung einer oder mehrerer Instanzen von Sonderzeichen ist eine Schwachstelle bei der Eingabevalidierung, bei der Software einige, aber nicht alle Instanzen von Sonderzeichen aus Eingabedaten filtert. Dies manifestiert sich auf zwei primäre Weisen: Filterung nur des ersten (oder letzten) Vorkommens eines Sonderzeichens, während zusätzliche Instanzen verbleiben, oder fehlende Filterung aller Arten von Sonderzeichen, wenn mehrere verschiedene gefährliche Elemente vorhanden sind. Die ungefilterten Instanzen können dann verwendet werden, um Injection-Angriffe gegen nachgelagerte Komponenten auszuführen.

Risiko

Wenn die Filterung nur auf einzelne Instanzen abzielt, können Angreifer mehrere Kopien gefährlicher Sequenzen einfügen, um den Schutz zu umgehen. Wenn beispielsweise nur das erste "../" entfernt wird, hat eine Eingabe mit "../../" nach der Filterung immer noch eine Traversal-Sequenz. Ebenso, wenn nur einfache Anführungszeichen gefiltert werden, aber keine doppelten Anführungszeichen, bleibt SQL-Injection über doppelt zitierte Strings möglich. Diese Schwachstelle ist häufig, wenn Entwickler nicht-globale String-Ersetzungsfunktionen oder Regex-Muster ohne globale Flags verwenden. Der resultierende partielle Schutz kann grundlegende Sicherheitstests bestehen, während er weiterhin ausnutzbar bleibt.

Lösung

Verwenden Sie immer globale Ersetzungsmechanismen beim Filtern gefährlicher Elemente. In regulären Ausdrücken verwenden Sie das /g-Flag (oder Äquivalent) für globales Matching. In String-Ersetzungsfunktionen verwenden Sie eine Schleife, bis keine Ersetzungen mehr auftreten, um verschachtelte Muster zu behandeln. Noch besser: Verwenden Sie Allowlist-Validierung, die nur bekannt sichere Zeichen akzeptiert. Testen Sie Filter mit Eingaben, die mehrere Instanzen gefährlicher Sequenzen an verschiedenen Positionen enthalten. Erwägen Sie die Verwendung speziell entwickelter Sanitisierungsbibliotheken, die alle Variationen berücksichtigen. Für kontextspezifische Ausgabe (SQL, HTML, Shell) bevorzugen Sie parametrisierte APIs oder Kodierung gegenüber Eingabefilterung.

Häufige Auswirkungen

AuswirkungDetails
IntegritätBereich: Integrität

Unerwarteter Zustand - Ungefilterte Instanzen von Sonderzeichen verursachen unbeabsichtigtes Anwendungsverhalten.
VertraulichkeitBereich: Vertraulichkeit

Anwendungsdaten lesen - Mehrere Traversal-Sequenzen ermöglichen Dateizugriff nach partieller Filterung.
IntegritätBereich: Integrität

Unautorisierten Code ausführen - Verbleibende Sonderzeichen ermöglichen Injection-Angriffe.

Beispielcode

Verwundbarer Code

# Verwundbar: Entfernt nur das erste Vorkommen
my $Username = GetUntrustedInput();

# Verwundbar: Kein /g-Modifikator - entfernt nur erstes "../"
$Username =~ s/\.\.\///;

my $filename = "/home/user/" . $Username;
ReadAndSendFile($filename);

# Angriff: "../../../etc/passwd"
# Nach Filter: "../../etc/passwd"
# Ergebnis: Traversiert zu /etc/passwd
// Verwundbar: Nicht-globale Regex-Ersetzung
function vulnerableFilter(input) {
    // Verwundbar: Kein 'g'-Flag - nur erste Übereinstimmung ersetzt
    return input.replace(/\.\.\//, '');
}

// Angriff: "../../../etc/passwd" wird zu "../../etc/passwd"

Lösungscode

# Behoben: Globale Ersetzung mit Schleife für verschachtelte Muster
my $Username = GetUntrustedInput();

# Behoben: Schleife bis keine Änderungen (behandelt verschachtelte Muster)
my $prev;
do {
    $prev = $Username;
    # /g für globale Ersetzung
    $Username =~ s/\.\.\///g;
    # Auch Backslash-Variante behandeln
    $Username =~ s/\.\.\\//g;
} while ($Username ne $prev);

# Besser: Mit Allowlist validieren
unless ($Username =~ /^[a-zA-Z0-9_-]+$/) {
    die "Ungültiges Benutzernamenformat";
}

my $filename = "/home/user/" . $Username;
// Behoben: Verwende globales Flag
function fixedFilter(input) {
    // Behoben: 'g'-Flag für globale Ersetzung
    let result = input;
    let prev;
    do {
        prev = result;
        result = result.replace(/\.\.[\\/]/g, '');
    } while (result !== prev);

    return result;
}

Verwandte CWEs

  • CWE-791: Unvollständige Filterung von Sonderzeichen (Eltern)
  • CWE-793: Nur Filterung einer Instanz eines Sonderzeichens (Kind)
  • CWE-794: Unvollständige Filterung mehrerer Instanzen von Sonderzeichen (Kind)

Referenzen

  1. MITRE Corporation. "CWE-792: Incomplete Filtering of One or More Instances of Special Elements." https://cwe.mitre.org/data/definitions/792.html
  2. OWASP. "Input Validation Cheat Sheet." https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
  3. CERT. "IDS11-J. Perform any string modifications before validation."