Fehlende Passwortfeld-Maskierung

Beschreibung

Fehlende Passwortfeld-Maskierung ist eine Schwachstelle, bei der eine Anwendung Passworteingaben während der Eingabe nicht maskiert, wodurch die Passwortzeichen auf dem Bildschirm sichtbar werden. Wenn Passwortfelder eingegebene Zeichen anzeigen, anstatt sie mit Punkten oder Sternchen zu maskieren, kann jeder in Sichtweite das Passwort beobachten und erfassen. Dies umfasst Shoulder-Surfing-Angriffe an öffentlichen Orten, aufgezeichnete Bildschirmfreigabe-Sitzungen, Screenshots und Videoaufnahmen von Benutzersitzungen.

Risiko

Sichtbare Passworteingabe erzeugt erhebliche Risiken für die Offenlegung von Anmeldeinformationen. Shoulder-Surfing in öffentlichen Bereichen wie Cafés, Flughäfen oder Großraumbüros ermöglicht nahestehenden Beobachtern, Passwörter zu erfassen. Bildschirmaufnahme-Malware kann sichtbare Anmeldeinformationen während der Eingabe erfassen. Bildschirmfreigabe-Sitzungen während Support-Anrufen oder Präsentationen können versehentlich Passwörter offenlegen. Screenshots, die zur Fehlerbehebung erstellt wurden, können sichtbare Passwörter enthalten. Mobile Geräte, die in der Öffentlichkeit verwendet werden, sind aufgrund kleinerer Bildschirme und kürzerer Betrachtungsabstände besonders anfällig.

Lösung

Implementieren Sie Passwort-Maskierung mit geeigneten Eingabetyp-Attributen (type="password" in HTML). Bieten Sie einen optionalen "Passwort anzeigen"-Schalter, der Zeichen vorübergehend sichtbar macht, mit klarer visueller Anzeige, wenn das Passwort sichtbar ist. Stellen Sie sicher, dass die Passwort-Maskierung konsistent auf alle Passwort-Eingabeformulare angewendet wird, einschließlich Anmeldung, Registrierung, Passwortänderung und Passwortzurücksetzung. Testen Sie auf allen unterstützten Plattformen und Browsern.

Häufige Auswirkungen

AuswirkungDetails
ZugriffskontrolleBereich: Zugriffskontrolle

Schutzmechanismus umgehen - Sichtbare Passwortzeichen ermöglichen unbefugten Beobachtern, Anmeldeinformationen zu erfassen, wodurch sie die Authentifizierung umgehen können.

Beispielcode

Verwundbarer Code

<!-- Verwundbar: Passwortfeld ohne Maskierung -->
<form action="/login" method="POST">
    <label>Benutzername:</label>
    <input type="text" name="username">

    <!-- Verwundbar: type="text" für Passwort -->
    <label>Passwort:</label>
    <input type="text" name="password">
    <!-- Passwort sichtbar während der Eingabe! -->

    <button type="submit">Anmelden</button>
</form>
// Verwundbar: React-Komponente mit unmaskiertem Passwort
function VerwundbaresLogin() {
    const [password, setPassword] = useState('');

    return (
        <form>
            <label>Passwort:</label>
            {/* Verwundbar: type="text" */}
            <input
                type="text"
                value={password}
                onChange={(e) => setPassword(e.target.value)}
            />
        </form>
    );
}
// Verwundbar: iOS ohne sichere Texteingabe
import UIKit

class VerwundbarerLoginVC: UIViewController {
    let passwordField = UITextField()

    override func viewDidLoad() {
        super.viewDidLoad()
        passwordField.placeholder = "Passwort"
        // Fehlt: passwordField.isSecureTextEntry = true
    }
}

Lösungscode

<!-- Behoben: Passwort-Maskierung mit optionalem Anzeigen/Verbergen -->
<form action="/login" method="POST">
    <label>Benutzername:</label>
    <input type="text" name="username" autocomplete="username">

    <label>Passwort:</label>
    <div class="password-container">
        <!-- Behoben: type="password" für Maskierung -->
        <input type="password" name="password" id="password"
               autocomplete="current-password">
        <button type="button" onclick="togglePassword()"
                aria-label="Passwortsichtbarkeit umschalten">
            👁️
        </button>
    </div>
</form>

<script>
function togglePassword() {
    const pwd = document.getElementById('password');
    pwd.type = pwd.type === 'password' ? 'text' : 'password';
    // Automatisches Ausblenden nach 3 Sekunden
    if (pwd.type === 'text') {
        setTimeout(() => { pwd.type = 'password'; }, 3000);
    }
}
</script>
// Behoben: React mit maskiertem Passwort
function SicheresLogin() {
    const [password, setPassword] = useState('');
    const [showPassword, setShowPassword] = useState(false);

    useEffect(() => {
        if (showPassword) {
            const timer = setTimeout(() => setShowPassword(false), 3000);
            return () => clearTimeout(timer);
        }
    }, [showPassword]);

    return (
        <form>
            <label>Passwort:</label>
            <input
                type={showPassword ? 'text' : 'password'}
                value={password}
                onChange={(e) => setPassword(e.target.value)}
                autoComplete="current-password"
            />
            <button type="button" onClick={() => setShowPassword(!showPassword)}>
                {showPassword ? 'Verbergen' : 'Anzeigen'}
            </button>
        </form>
    );
}
// Behoben: iOS mit sicherer Texteingabe
import UIKit

class SichererLoginVC: UIViewController {
    let passwordField = UITextField()
    var isPasswordVisible = false

    override func viewDidLoad() {
        super.viewDidLoad()
        passwordField.placeholder = "Passwort"
        passwordField.isSecureTextEntry = true  // Behoben
        passwordField.textContentType = .password
    }

    @objc func toggleVisibility() {
        isPasswordVisible.toggle()
        passwordField.isSecureTextEntry = !isPasswordVisible
        
        if isPasswordVisible {
            DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { [weak self] in
                self?.passwordField.isSecureTextEntry = true
                self?.isPasswordVisible = false
            }
        }
    }
}

CVE-Beispiele

Keine spezifischen CVEs für diese CWE, aber fehlende Passwort-Maskierung ist ein häufiger Befund bei Sicherheitsbewertungen und Compliance-Audits (PCI-DSS, HIPAA).


Referenzen

  1. MITRE Corporation. "CWE-549: Missing Password Field Masking." https://cwe.mitre.org/data/definitions/549.html
  2. OWASP. "Authentication Cheat Sheet."
  3. W3C. "HTML5 input types - password."