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
| Auswirkung | Details |
|---|---|
| Zugriffskontrolle | Bereich: 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
- MITRE Corporation. "CWE-549: Missing Password Field Masking." https://cwe.mitre.org/data/definitions/549.html
- OWASP. "Authentication Cheat Sheet."
- W3C. "HTML5 input types - password."