Prototype Pollution ist eine JavaScript-Schwachstelle, bei der ein Angreifer Eigenschaften an einem gemeinsam geerbten Prototyp verändert. Andere Objekte besitzen diese Werte anschließend scheinbar ebenfalls. Abhängig von der späteren Nutzung entstehen Autorisierungsfehler, manipulierte Konfigurationen, Cross-Site Scripting oder serverseitig sogar Codeausführung.
Warum sind __proto__ und constructor gefährlich?
JavaScript löst fehlende Eigenschaften entlang der Prototypenkette auf. Unsichere rekursive Merge- oder
Pfadfunktionen behandeln Schlüssel aus JSON wie normale Eigenschaften. Besondere Schlüssel wie
__proto__ oder die Kette constructor.prototype können dadurch statt eines lokalen
Werts den Prototyp verändern.
Vereinfachtes Codebeispiel
Verwundbar:
function setPath(target, path, value) {
const parts = path.split('.');
let current = target;
for (const part of parts.slice(0, -1)) {
current = current[part] ??= {};
}
current[parts.at(-1)] = value;
}
setPath({}, 'constructor.prototype.isAdmin', true);
console.log(({}).isAdmin); // true
Sicherer: Schlüssel ablehnen und nur erwartete Felder übernehmen.
const BLOCKED_KEYS = new Set(['__proto__', 'prototype', 'constructor']);
function safeSet(target, path, value) {
const parts = path.split('.');
if (parts.some((part) => BLOCKED_KEYS.has(part))) {
throw new Error('Unsafe property path');
}
// Zusätzlich: Pfad gegen eine fachliche Allowlist prüfen.
}
Eine Blockliste ist nur eine zusätzliche Grenze. Robuster ist eine kleine Positivliste erwarteter Felder,
ein Schema-Validator mit additionalProperties: false und der Verzicht auf generische Deep-Merge-
Funktionen für nicht vertrauenswürdige Daten.
Client- und serverseitige Auswirkungen
| Kontext | Mögliche Folge |
|---|---|
| Browser | Manipulierte DOM- oder Sanitizer-Konfiguration, XSS, veränderte Request-Optionen. |
| Node.js | Umgehung von Prüfungen, veränderte Template-/Prozessoptionen, in bestimmten Gadgets Command Injection. |
| Bibliothek | Viele Anwendungen werden indirekt über verwundbare Merge-, Querystring- oder Utility-Pakete betroffen. |
Prävention und Erkennung
- - Abhängigkeiten aktualisieren und Advisories für transitive Pakete beachten.
- - Eingaben mit einem Schema validieren und unbekannte Eigenschaften ablehnen.
- -
Object.hasOwn()statt impliziter geerbter Werte für Sicherheitsentscheidungen nutzen. - - Für reine Schlüssel-Wert-Container gegebenenfalls
Object.create(null)oderMapverwenden. - - Nach verdächtigen Schlüsseln in Requests und nach unerwarteten Prototypwerten in Tests suchen.
Nützliche Open-Source-Werkzeuge
ppfuzz prüft Webanwendungen auf serverseitige Prototype-Pollution-Pfade. PPMap unterstützt bei der Suche nach client- und serverseitigen Varianten. Für Abhängigkeiten eignen sich OSV-Scanner oder Trivy. Scanner finden nicht jedes anwendungsspezifische Gadget; Ergebnisse müssen im Code und in einer isolierten Testumgebung bestätigt werden.
Vielen Dank für dein Feedback! Wir werden es prüfen und unseren Artikel anpassen.
Hast du Feedback zum Thema Prototype Pollution? Schreib uns!
Weitere Dienstleistungen
Zusätzliche IT-Sicherheitslösungen für umfassenden Schutz
Red Teaming
Simulation echter Angriffe auf Ihr Unternehmen inklusive Personen, Infrastruktur und Prozesse. Ein umfassender Ansatz zur Überprüfung Ihrer gesamten Sicherheitsstrategie.
Mehr erfahrenPhishing-Übungen
Praxisnahe Phishing-Simulationen zur Sensibilisierung Ihrer Mitarbeiter. Erhöhen Sie die Awareness und reduzieren Sie das Risiko erfolgreicher E-Mail-basierter Angriffe.
Mehr erfahren