Clickjacking - was das überhaupt
ist,
was damit
möglich
ist, wie Sie es
verhindern
und welche
Angriffe
es bisher gab, wissen Sie inzwischen. In dieser Folge werden zwei mögliche
Angriffe näher betrachtet, darunter das "Likejacking" bei Facebook.
Clickjacking ganz einfach
Die einfachste Möglichkeit für einen Clickjacking-Angriff besteht im
Übereinanderlegen zweier Seiten, wie in diesem
Beispiel.
Beim Klick passiert nichts Schlimmes, es wird lediglich eine Alertbox
geöffnet - allerdings nicht von der verlinkten Seite, sondern einer
unsichtbar darüber gelegten.
Der Nachteil dieser "Brute-Force-Lösung": Das Clickjacking
funktioniert nur, wenn sich das anzuklickende, unsichtbare Ziel genau an
der Stelle befindet, an der der Benutzer auf der sichtbaren Seite klickt.
Im Beispiel habe ich das durch entsprechende Positionierungsbefehle
erreicht, was u.a. voraus setzt, dass das Fenster gross genug ist. Dass
ist nun gerade etwas, auf dass sich im Web niemand verlassen sollte. Als
Gegenmaßnahme gegen dieses Problem hat sich das "ankleben" des
unsichtbaren iframes an den Mauszeiger bewährt: Egal, wo das Opfer
klickt, das unsichtbare Ziel befindet sich unter dem Mauszeiger.
Clickjacking etwas aufwendiger
Als Beispiel für so einen Clickjacking-Angriff dient hier der für den
"Likejacking"-Angriff
auf Facebook verwendete Code, leicht zu finden über die Wall eines
Opfers oder mit der Suchmaschine Ihres geringsten Misstrauens. Hier die
relevanten Codeteile, auf das Notwendige gekürzt:
<div id="icontainer"
style="overflow:hidden; width:120px; height:40px; position:absolute;
filter:alpha(opacity=0); -moz-opacity:0.0; -khtml-opacity:0.0; opacity:0.0;">
<iframe src="ziel.html" scrolling="no" frameborder="0"
style="border:none; overflow:hidden; width:120px; height:40px;" allowTransparency="true"></iframe>
</div>
<script>
var icontainer = document.getElementById('icontainer');
var standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body
//create reference to common "body" across doctypes
function mouseFollower(e){
if (window.event)
{ // for IE
icontainer.style.top = (window.event.y-5)+standardbody.scrollTop+'px';
icontainer.style.left = (window.event.x-5)+standardbody.scrollLeft+'px';
}
else
{
icontainer.style.top = (e.pageY-5)+'px';
icontainer.style.left = (e.pageX-5)+'px';
}
}
document.onmousemove = function(e) {
mouseFollower(e);
}
</script>
Zuerst wird ein unsichtbares div-Tag für den iframe mit
der Zielseite angelegt, das später am Mauszeiger "klebt". Danach wird
dieses div-Tag über die JavaScript-Funktion
mouseFollower() an den Mauszeiger "geklebt": Bei jeder
Mausbewegung wird die Funktion mouseFollower() aufgerufen und
die Position des div-Tag entsprechend angepasst.
Im Fall des Facebook-"Likejacking" war das Ziel (im Beispiel
ziel.html) der Aufruf der Facebook-API, prinzipiell
kann jeder von Social Networks oder anderen Anbietern zum Einbinden in
andere Websites bereit gestellte Button oder Link als Ziel dienen. Gibt es
keine weitere Abfrage o.Ä., wird dann durch das "Buttonjacking" die
damit verbundene Aktion ausgelöst. Ebenso könnte z.B. eine
Pay-per-Click-Werbung eingebunden werden, wie es Shlomi Narkolayev im
Februar
demonstriert
hat.
Hier können Sie die Demo in Aktion testen, einmal mit
unsichtbarem
div-Tag und einmal mit
sichtbarem.
Beim Klick passiert nichts Schlimmes, es wird wie schon im ersten Beispiel
lediglich eine Alertbox geöffnet.
Auf der Seite mit dem sichtbaren div-Tag sehen Sie, wieso
nicht jeder Klick erfolgreich ist: Der Mauszeiger zeigt auf die linke obere
Ecke des Tags, der klickbare Button ist natürlich ein kleines
Stück innerhalb des Tags und wird nur getroffen, wenn der Mauszeiger
vor dem Klick ein kleines Stück in das Tag bewegt wird. Dazu reicht
aber schon ein kleiner Ruck an der Maus, wie er z.B. beim Druck auf die
Maustaste entsteht. Außerdem lässt sich dieses Problem umgehen,
indem der iframe so positioniert wird, dass der störende Rand
außerhalb des sichtbaren Bereichs ist. Der Einfachheit halber habe
ich hier darauf verzichtet.
Der Nachteil dieses Ansatzes: Egal wohin der Benutzer klickt, er klickt
immer auf den unsichtbaren iframe. Die Klicks haben also keine für
das Opfer sichtbare Auswirkungen - egal wohin und wie oft er klickt,
anscheinend passiert nichts, und das ist doch ziemlich verdächtig.
Beim obigen "Brute-Force-Ansatz" kann dagegen der Bereich, in dem die
Klicks in den unsichtbaren iframe gelenkt werden, eingegrenzt werden, so
dass Klicks im restlichen Bereich der Seite auf der sichtbaren Seite landen
und dort dann weitere Aktionen auslösen können. Nehmen wir z.B.
ein angebliches Video, das nicht startet, weil der Klick darauf auf eine
andere Seite umgeleitet wird. Beim Klick auf z.B. einen Hilfe-Button
reagiert die Seite aber, und damit sieht das doch sehr nach einem
harmlosen Fehler aus.
2010 - Die Entwicklung geht weiter...
Alles bisherigen Angriffe basierten auf den Entdeckungen von Jeremiah
Grossman und Robert "RSnake" Hansen bzw. waren Variationen der von
ihnen
und z.B.
Guy Aharonovsky
vorgestellten Demos. Auch das in der vorigen Folge vorgestellte und oben
näher beschriebene
"Likejacking"
bzw. "Buttonjacking" ist nichts weiter als so eine Variation.
Im März hat Lavakumar Kuppan das
'Bypassing CSRF protections with ClickJacking and HTTP Parameter Pollution'
beschrieben. Damit ist es möglich, in JSP- und teilweise
ASP.NET-Anwendungen den über zufällige Token-Werte
implementierten Schutz vor Cross-Site Request Forgery zu umgehen.
Im April hat Paul Stone von
Context Information Security
auf der Sicherheitskonferenz BLACK HAT EUROPE 2010 einige neue
Clickjacking-Angriffe
vorgestellt.
Dabei hat er z.B. Text in ein Text-Feld eingefügt, Inhalte ausgespäht
und über iframes geprüft, ob ein Benutzer auf einer bestimmten Website
eingeloggt ist. Zu seiner Präsentation gibt es ein
Whitepaper
und ein
Clickjacking Tool.
Diese neuen Entwicklungen sind das Thema der
nächsten Folge
- hier auf ceilers-news.de!
Carsten Eilers
Übersicht über alle Artikel zum Thema
- Clickjacking - Angriffe auf Seiten ohne Schwachstellen
-
- Clickjacking - Auch komplizierte Aktionen sind möglich
-
- Clickjacking - Framebuster oder HTTP-Header verhindern Angriffe
-
- Der Angriff der Clickjacking-Würmer, "Likejacking" und "Buttonjacking"
-
- Clickjacking - "Likejacking" unter die Haube geguckt
-
- Clickjacking - The next Generation
-
- Clickjacking - Drag&Drop-Angriffe und weitere Neuigkeiten
-
- Cookiejacking - Keksdiebe im Internet Explorer
-
- Likejacking - Facebook im Visier der Cyberkriminellen
-
- Clickjacking - Gute und Schlechte Nachrichten
-
- Standpunkt: Clickjacking gegen Flash, urchin.js und Duqu - nichts als Wiederholungen!
-
Wer wundert sich schon über einen Klick, der nicht funktioniert hat, wenn danach alle andere funktionieren?
Die Steigerung wäre dann, das Likejacking über XSS in irgend eine normale, vertrauenswürdige Seite einzufügen und nach dem Abfangen des Klicks den kompletten XSS-Code zu löschen. Über den einen nicht funktionierenden Klick macht sich dann bestimmt keiner große Gedanken.