Links mit „noopener“ manipulationssicher auszeichnen

So schließen Sie die "target-blank"-Sicherheitslücke...

Werbung
Eine Sicherheitslücke, die eigentlich ein Feature ist - und sich ganz einfach schließen lässt...
Eine Sicherheitslücke, die eigentlich ein Feature ist - und sich ganz einfach schließen lässt...

„Link ist Link, da kann doch gar nichts passieren!“ – wer als Webentwickler bisher so dachte, hat leider nicht mit der JavaScript-Eigenschaft window.opener gerechnet.

Diese kann von Hackern auf einer verlinkten Seite missbraucht werden, um den Sourcecode der Quellseite zu modifizieren. Die vermeintliche Sicherheitslücke greift aber erst dann, wenn die Ziel-URL des Links mit target=“_blank“ in einem neuen Tab (oder einem neuen Fenster) geöffnet wurde.

Das Attribut target=“_blank“ in Links ist praktisch, um es dem Nutzer zu ermöglichen, nach dem Öffnen einer anderen URL wieder zum ursprünglichen Fenster zurückzukehren. So kann eine Website beliebige Verweise zu Inhalten Dritter setzen und dennoch den Besucher längere Zeit an sich binden.

„target-blank“-Sicherheitslücke ausnutzen

Wir haben zur Demonstration ein HTML-Dokument vorbereitet, welches mittels window.opener sowohl die Buttons als auch den Hintergrund dieser Seite rot einfärbt:

Wenn Sie anschließend hierhin zurückkehren, werden die Änderungen sichtbar sein.

Um danach das ursprüngliche Erscheinungsbild wiederherzustellen, aktualisieren Sie einfach die Seite im Webbrowser (oder klicken hier).

Funktionaler HTML-Code des Links:

<a href="https://www.14all.eu" target="_blank">Link</a>

Nun sind ein paar geänderte Farbwerte wenig mehr als eine harmlose Spielerei. Doch mittels dieser Methode können auch größere Eingriffe in den Seiteninhalt vorgenommen und sogar Skripte bzw. andere aktive Elemente unbemerkt injiziert werden.

Im schlimmsten Fall wird im Hintergrund eine Phishing-Website aufgerufen und alle folgenden Interaktionen mit der ursprünglichen Website so unbemerkt umgeleitet.

Das kann für den Nutzer fatale Folgen haben, da er ja nicht mit einer Manipulation rechnet, sondern sich darauf verlässt, nachwievor den ursprünglichen Seiteninhalt vorzufinden.

Wie funktioniert das genau?

Betrachten wir das JavaScript, welches von der Testseite ausgeführt wird:

opener.document.body.style.background = "#ff0000";
opener.document.getElementsByName("ofa-button").style.background-color = "#ff0000";

Die Eigenschaft opener stellt eine Referenz zur aufrufenden Seite her und erlaubt den Zugriff auf deren DOM, seine Objekte und Eigenschaften.

„target-blank“-Sicherheitslücke schließen

Glücklicherweise lässt sich dieses Problem relativ einfach beheben.

Durch Anfügen des Attributs rel=“noopener“ im Link unterbindet der Browser den Zugriff auf den Inhalt der Quellseite. Zum Beweis verlinken wir nun erneut auf das manipulierende HTML-Dokument:

Im Gegensatz zum ersten Versuch bleiben nun alle Elemente dieser Seite unangetastet.
Funktionaler HTML-Code des Links:

<a href="https://www.14all.eu" target="_blank" rel="noopener">Link</a>

Gefährdungspotential: Niedrig

Bislang sind zwar keine größeren Angriffe mit dieser Methode bekannt (und auch wenig wahrscheinlich), trotzdem empfiehlt es sich, alle externen Links mit dem rel=“noopener“-Attribut zu versehen. Jedenfalls immer dann, wenn gleichzeitig target=“_blank“ verwendet wird.

Da es sich bei window.opener nicht um eine Sicherheitslücke, sondern um den Nebeneffekt einer im Grunde sinnvollen JavaScript-Funktion handelt, dürfte dieses Problem für längere Zeit bestehen und sollte deshalb durch den beschriebenen Workaround neutralisiert werden.

Tipp für Content Management Systeme

Die meisten Content Management Systeme (einschließlich WordPress und Typo3) fügen das Attribut rel=“noopener“ inzwischen standardmäßig in erzeugten Links ein. Im Zweifel empfiehlt sich ein Update auf die neueste Version oder die Nutzung eines verfügbaren Plugins.


Autor: Tobias Eichner | Datum der Veröffentlichung: September 2018
Wichtig: Bitte beachten Sie die Nutzungsbedingungen und rechtlichen Hinweise für diesen Beitrag!