Jede Programmiersprache bringt ihre eigenen Sicherheitslücken mit sich, und JavaScript bildet da keine Ausnahme. Die Ausnutzung von JavaScript-Sicherheitslücken kann zu Datenmanipulation, Sitzungsumleitung, unberechtigtem Datenzugriff und mehr führen. Obwohl JavaScript-Sicherheitsrisiken in erster Linie mit clientseitiger Funktionalität in Verbindung gebracht werden, können sie auch in serverseitigen Umgebungen erhebliche Bedrohungen darstellen.
Für jede Anwendung ist das Vertrauen der Kunden von großer Bedeutung. Dieses Vertrauen aufrechtzuerhalten erfordert die Sicherung von Kundendaten und die Gewährleistung der Sicherheit von Anwendungen. Glücklicherweise können durch die Implementierung angemessener Schutzmaßnahmen diese Risiken gemindert und die Sicherheit Ihrer Anwendung verbessert werden.
In diesem Artikel werden einige der häufigsten JavaScript-Sicherheitsbedrohungen untersucht und effektive Tools und Strategien erörtert, um Ihre Anwendung vor potenziellen Angriffen zu schützen.
Cross-Site Scripting
Cross-Site Scripting (XSS) ist ein Sicherheitsrisiko, das es einem Angreifer ermöglicht, bösartigen clientseitigen Code in eine Website einzufügen. Laut dem Open Web Application Security Project (OWASP) Top-10-Sicherheits-Schwachstellen von 2021 belegt XSS den dritten Platz als häufigster Angriffsvektor.
Maßnahmen zur Minimierung von XSS
Eingabevalidierung
Stellen Sie sicher, dass die Benutzereingabe den erwarteten Datentypen, Formaten und Bereichen entspricht. Entfernen oder maskieren Sie potenziell schädliche Zeichen, um Injection zu verhindern.
function validateInput(input) {
return input.replace(/[^a-zA-Z0-9]/g, ''); // Allow only alphanumeric characters
}
Ausgabe-Kodierung
Konvertiere Sonderzeichen im Output in ihre HTML-Entity-Äquivalente, um potenziell schädliche Skripte zu neutralisieren, bevor sie gerendert werden.
function encodeHTML(input) {
return input.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
Clickjacking
Clickjacking ist ein betrügerischer Angriff, bei dem Benutzer dazu gebracht werden, auf ein Element zu klicken, mit dem sie nicht interagieren möchten. Diese Technik beinhaltet das Einbetten einer legitimen Website in eine bösartige Website – oft unter Verwendung eines unsichtbaren oder irreführend positionierten HTML <iframe>
-, um Benutzeraktionen zu übernehmen. Als Ergebnis können Angreifer Login-Daten stehlen, unbefugte Berechtigungen erlangen oder Benutzer sogar dazu bringen, Malware unwissentlich zu installieren.
Ein häufiger Weg, dies zu erreichen, ist die Verwendung von CSS, um einen überlappenden Button hinzuzufügen, dessen opacity
auf fast 0 gesetzt ist. Dadurch wird der Benutzer dazu gebracht, auf einen unbeabsichtigten Button oder Link zu klicken.
Wie man Clickjacking verhindert
Die X-Frame-Options geben dem Browser an, ob die Website in einem iframe eingebettet werden kann. Es gibt drei Optionen:
- DENY – Verhindert, dass die Seite vollständig in einem iframe angezeigt wird
- SAMEORIGIN – Erlaubt die Einbettung der Seite nur, wenn die Anfrage von der gleichen Domain stammt
- ALLOW-FROM – Erlaubt die Einbettung der Seite nur durch eine spezifische, vertrauenswürdige Domain
In Node.js können Sie helmet
verwenden, um diese Optionen wie unten gezeigt festzulegen:
const helmet = require("helmet");
const app = express();
app.use(
helmet({
xFrameOptions: { action: "sameorigin" },
}),
);
Ein wirksamer Schutz gegen Clickjacking besteht darin, den Content Security Policy (CSP) Header zu implementieren. CSP bietet eine granulare Kontrolle darüber, wie und wo Inhalte eingebettet werden können, was unbefugtes Framing verhindert.
Um Clickjacking-Risiken zu minimieren, fügen Sie die frame-ancestors
-Anweisung in Ihren CSP-Header ein. Zum Beispiel:
Content-Security-Policy: frame-ancestors 'self' https://www.example.org;
Diese Richtlinie stellt sicher, dass das geschützte Dokument nur von seinem eigenen Ursprung ('self'
) und explizit zugelassenen Domains wie example.org
eingebettet werden kann. Sie blockiert alle unbefugten Versuche, den Inhalt zu rahmen, und schützt Benutzer vor Clickjacking-Angriffen.
Hinweis: Wenn sowohl frame-ancestors als auch X-Frame-Options festgelegt sind, ignorieren Browser, die frame-ancestors unterstützen, X-Frame-Options.
Cross-Site Request Forgery (CSRF)
CSRF (manchmal auch XSRF genannt) nutzt das Vertrauen einer Website in den Browser eines Benutzers aus, indem unbefugte Anfragen im Namen des Benutzers gestellt werden. Angreifer täuschen Benutzer dazu, Aktionen ohne deren Wissen auszuführen, was möglicherweise zu Datenlecks oder unerwünschten Transaktionen führt. Ein paar Beispiele sind das Aktualisieren der persönlichen Daten des Opfers, das Initiieren einer Überweisung vom Bankkonto des Opfers oder sogar das Umleiten einer Paketzustellung an eine andere Adresse.
Lassen Sie uns ein konkretes Beispiel betrachten. Sie besuchen die Website Ihrer Bank und haben sich angemeldet. Angenommen, Sie erhalten eine E-Mail für ein Gewinnspiel, das vorgibt, von Ihrer Bank zu stammen. Der Link führt Sie zu einer scheinbar unverdächtigen Webseite. Hinter den Kulissen wird eine POST-Anfrage ausgelöst und an die legitime Bankanwendung gesendet.
curl --location --request POST 'https://acmebank.com/transfer?routing=852363&fromAccountNumber=123456789&toAccountNo=987654321' \
--header 'Cookie: session=acmebanksessionvalue'
Auf der Anwendungsseite acmebank.com sendet das „script“-Tag das Formular ab, sobald der Benutzer die Seite lädt, ohne jegliche Benutzervalidierung oder dass der Benutzer überhaupt bemerkt, was passiert, wie unten gezeigt.
<html>
<body>
<form action="https://acmebank.com/transfer" method="POST">
<input type="hidden" routing="852363" fromAccountNo="123456789" toAccountNo="987654321" amount="5000" />
</form>
<script>
window.addEventListener("DOMContentLoaded", () => {
document.querySelector("form").submit();
});
</script>
</body>
</html>
Das obige Formular erstellt die folgende Anfrage an die tatsächliche Anwendung, acmebank. Die Anfrage enthält das legitime Benutzersitzungscookie, enthält jedoch unsere Bankkontonummer! Da Ihre Sitzung bei Ihrer Bank noch aktiv ist, wird die Überweisung des Betrags durchgeführt, wenn keine andere Validierung vorhanden ist.
Wie man sich gegen CSRF verteidigt
Setzen Sie das SameSite-Attribut auf Strict. Dies steuert, ob ein Cookie bei Cross-Site-Anfragen gesendet wird.
- Solche Sitzungscookies sollten eine kurze Lebensdauer haben. Erfordern Sie eine erneute Authentifizierung für sensible Aktionen, um Risiken zu mindern.
Verwenden Sie CSRF-Sitzungs-eindeutige Tokens. Dieses Token kann dann in ein Formular aufgenommen werden, das vom Browser übermittelt wird. Für jede Anfrage vergleicht der Server das vom Client gesendete Token mit seinem gespeicherten Wert für die Sitzung. Verwenden Sie die Bibliothek csrf-csrf zur Konfiguration eindeutiger Tokens.
Datenübernahme einer Sitzung
Sitzungsumleitung tritt auf, wenn ein Angreifer das Sitzungstoken eines Benutzers stiehlt, was es ihnen ermöglicht, sich als Benutzer auszugeben und unbefugten Zugriff auf deren Konto zu erhalten.
Wie man Sitzungsumleitung verhindert
Verwenden Sie sichere Cookies
Setzen Sie die Sicher
und HttpOnly
Flags auf Sitzungscookies, um unbefugten Zugriff zu verhindern. Das Setzen des Sicher-Attributs verhindert, dass das Sitzungscookie im Klartext übertragen wird, und erlaubt nur die Übertragung über HTTPS-Verbindungen. Das Setzen des Http-Only
Attributs erzwingt, dass der Browser den Zugriff auf das Cookie vom DOM aus nicht zulässt wodurch verhindert wird, dass clientseitige Skript-basierte Angriffe auf die in diesen Cookies gespeicherten sensiblen Daten zugreifen.
Aktivieren Sie die Multi-Faktor-Authentifizierung (MFA)
Fügen Sie eine zusätzliche Sicherheitsebene hinzu, um Benutzer zu überprüfen. Dies ist eine sehr verbreitete Methode, die Sie in den meisten sicheren Anwendungen finden werden. Einfache Integrationen sind über Anbieter wie Okta und Duo verfügbar.
Implementieren Sie eine Sitzungsablaufzeit
Laufende Sitzungen automatisch ablaufen lassen, um Angriffsfenster zu reduzieren.
Codierpraktiken und Tools für Sicherheit auf hohem Niveau
Verwundbarkeitsscans
Ein Schwachstellenscanner sorgt für die Sicherheit Ihrer Anwendung. Das Scannen Ihrer Bibliotheken, Netzwerke, Anwendungen und Geräte hilft, Schwächen aufzudecken, die Angreifer ausnutzen könnten. Tools wie Snyk und Sonarqube können problemlos in JavaScript-Codebasen integriert werden. Diese Tools arbeiten parallel mit bekannten Listen von Schwachstellen, die von OWASP gepflegt werden. Durch nahtlose Integration als Teil des Entwicklungsprozesses bieten diese Scanner Entwicklern und Sicherheitsteams Echtzeit- und präzise Einblicke in Code-Schwachstellen und Lösungen zu deren Behebung.
Penetrationstests und Bewertungen
Entwickler können Praktiken des Penetrationstests übernehmen, um aktiv potenzielle Schwachstellen innerhalb einer Anwendung zu überprüfen und auszunutzen. Ethische Hacker simulieren Angriffe aus der realen Welt, um die Sicherheitslage von Webanwendungen zu bewerten, indem sie JavaScript-Code und Benutzerinteraktionen manipulieren.
Um dies zu erreichen, können Entwickler benutzerdefinierten JavaScript-Code schreiben, um die Szenarien zu simulieren, oder sie können spezialisierte Penetrationstest-Tools nutzen, die JavaScript verwenden, um den Prozess des Scannens nach gängigen Schwachstellen wie XSS zu automatisieren, indem sie OWASP ZAP verwenden. Weitere Informationen zu Penetrationstests finden Sie in OWASP’s offiziellem Leitfaden.
Web Application Firewall (WAF)
Mit dem Wachstum von Anwendungen steigt auch der Webverkehr, was die Anfälligkeit für Angriffe erhöht. Die Implementierung einer Web Application Firewall (WAF) hilft, sich gegen bösartigen Verkehr zu schützen, indem HTTP-Anfragen gefiltert und überwacht werden. Dies umfasst die Integration mit Drittanbieter-WAF-Anbietern wie Cloudflare oder AWS WAF. Mit WAF können Sie Regeln definieren wie:
- Das Land oder der geografische Standort, von dem die Anfragen stammen.
- IP-Adresse, CIDR-Bereich und Domainnamen, von denen die Anfragen stammen.
- Begrenzung der Anfrage-Längen und Abfrageparameter, um Injektionsangriffe zu verhindern.
- SQL-Code, der wahrscheinlich bösartig ist. Angreifer versuchen, Daten aus Ihrer Datenbank zu extrahieren, indem sie bösartigen SQL-Code in eine Webanfrage einbetten. Dies wird als SQL-Injection bezeichnet.
- Erkennung und Blockierung eingebetteter Skripte, die Teil von XSS-Angriffen sein könnten.
Eine WAF kann auch helfen, verteilte Denial-of-Service (DDoS)-Angriffe zu mildern und die Verfügbarkeit von Anwendungen zu gewährleisten.
Den Datenschutz sicherstellen
Es ist entscheidend, robuste Maßnahmen zur Datensicherheit zu implementieren, wenn sichere Informationen gespeichert oder abgerufen werden. Zu den bewährten Verfahren gehören:
- Durchsetzung strenger Passwortrichtlinien und Förderung der Nutzung von Passwortmanagern. Darüber hinaus sollten Sie Ihre Benutzer ermutigen, einen Passwortmanager zu verwenden, damit sie komplexere Passwörter verwenden können und sich keine Sorgen um das Erinnern machen müssen (Verwenden Sie LastPass oder 1Password).
- Schutz vor Brute-Force-Angriffen auf Anmeldeseiten durch Begrenzung der Rate, Kontosperren nach einer bestimmten Anzahl von fehlgeschlagenen Versuchen und CAPTCHA-Herausforderungen.
- Verwenden von HTTP-Headern wie:
- HTTP Access-Control-Allow-Origin zur Steuerung, welche Ursprünge auf Ressourcen zugreifen können.
- HTTP X-Content-Type-Options zur Vermeidung von MIME-Typ-Sicherheitsrisiken.
- Subressourcen-Integrität (SRI), um sicherzustellen, dass Ressourcen von CDNs unverfälscht sind.
Abschluss
Die Sicherheit von JavaScript ist ein fortlaufender Prozess, der einen proaktiven Ansatz erfordert, um Anwendungen vor sich entwickelnden Bedrohungen zu schützen. Die Implementierung bewährter Praktiken wie Eingabevalidierung, CSP-Header, sicheres Sitzungsmanagement und Schwachstellenscanning kann das Risiko von Angriffen wie XSS, CSRF und Sitzungsübernahme erheblich verringern.
Zusätzlich stärkt die Nutzung von Sicherheitswerkzeugen wie WAFs, Penetrationstests und MFA die Resilienz von Anwendungen. Die Priorisierung der Sicherheit in jeder Phase der Entwicklung ermöglicht es Entwicklern, robuste und vertrauenswürdige Anwendungen zu erstellen, die gegen moderne Cyberbedrohungen geschützt bleiben.
Source:
https://dzone.com/articles/enhancing-security-in-javascript