Same Domain Policy bei Cookies verletzt?
Philipp Hasenfratz
- javascript
Halihallo Forumer
Javascripts Same-Domain-Policy besagt, dass jedwelche Interaktion von Javascript mit
Daten auf dieselbe Domain beschränkt ist, sodass ein Missbrauch und Zugriff auf andere
Domains ausgeschlossen ist. Als ich mich mit der client- und serverseitigen Behandlung
von Cookies auseinandergesetzt habe, ist mir jedoch etwas aufgefallen:
Nehmen wir an, wir laden ein externes Javascript von dem Host remot-host.com in unsere
HTML-Datei auf Host origin-host.com ein und lassen es einen neuen Cookie über
document.cookie erstellen. Lesen wir den Cookie dann über das selbe externe Javascript
ein, erhalten wir nicht nur diesen Cookie, sondern auch diejenigen des Hosts
origin-host.com, obwohl das Javascript nicht diesem Host angehört.
Anders formuliert:
Wann immer ein Cookie über Javascript gesetzt wird, ist die Domain automatisch auf die
der HTML-Datei gesetzt. Normalerweise ist das völlig richtig, nur halte ich es für eine
Verletzung der Same-Domain-Policy, wenn auch Cookies einer externen, hostfremden
Javascript-Datei als Cookie des Hosts der HTML-Datei gesetzt werden.
Szenario:
Es kann vorkommen, dass z.B. ein Counter-Service über Javascript in die eigene Page ein-
gebunden ist (normalerweise geschieht dies über ein image, aber oftmals wird auch Java-
Script eingesetzt, um dynamisch eine Zufallszahl anzuhängen, um das Caching zu
verhindern). Dieser Counter-Service könnte a) alle Cookies "meiner Page" auslesen und
so ggf. an Daten meiner Services rankommen; b) meine Cookies überschreiben und so meinen
Services schaden. Ich würde dieses Verhalten, was ich bisher mit IE6,NS4,NS7,NS6,Opera
reproduzieren konnte, doch als kleines Sicherheitsrisiko und Bug bezeichnen. Genauso
kann man es aber als Feature bezeichnen, denn man hat es leichter Domainübergreifende
Javascript-Services aufzubauen...
Zum selber testen:
html-Datei auf origin-host:
<code>
<script type="text/javascript">
document.cookie = 'origin-domain=test1';
</script>
<script type="text/javascript" src="http://127.0.0.1/co.js"></script>
<script type="text/javascript">
alert( 'Cookies of origin-domain: ' + document.cookie );
</script>
</code>
javascript-Datei auf remote-host:
<code>
document.cookie='remote-host=test';
alert( 'Cookies on Remote-Host ' + document.cookie );
</code>
Beim Laden erhalten wir eine Meldung der Cookies auf dem remote-host (der origin-domain
Cookie ist eben auch sichtbar), und die Meldung der Cookies auf dem origin-host, welcher
jetzt u.a. eben auch einen Cookie der fremden Domain hat.
Bei dem serverseitigen setzen des Cookies wird die Domain richtig gesetzt.
Meine Frage: Was haltet Ihr davon?
Viele Grüsse
Philipp
hi,
Nehmen wir an, wir laden ein externes Javascript von dem Host remot-host.com in unsere
HTML-Datei auf Host origin-host.com ein und lassen es einen neuen Cookie über
document.cookie erstellen. Lesen wir den Cookie dann über das selbe externe Javascript
ein, erhalten wir nicht nur diesen Cookie, sondern auch diejenigen des Hosts
origin-host.com, obwohl das Javascript nicht diesem Host angehört.
ja, das wäre in meinen augen durchaus eine verletzung der policy.
frage: hast du dieses verhalten in verschiedenen browsern getestet und überall so feststellen können, oder passiert dies nur in einem bestimmten browser?
gruss,
wahsaga
Halihallo wahsaga
frage: hast du dieses verhalten in verschiedenen browsern getestet und überall so feststellen können, oder passiert dies nur in einem bestimmten browser?
Nein, bisher konnte ich es auf IE6,NS4,NS7,NS6,Opera reproduzieren.
Nun ja, wie gesagt: Die Gefahr zum Ausnutzen dieses Bugs wäre minimal, der Angreifer
müsste beim Opfer einen externes Javascript einsetzen können. Das ist normalerweise
nicht möglich, aber es wäre gut denkbar, dass der Angreifer sich als normalen Dienst
ausgibt (eg. eben Counter-Dienst) und so zu allen Cookies seiner Kunden käme.
Aber wenn das wirklich zutrifft und im Moment spricht alles dafür (es sei denn, ich habe
einen wirklich dummen Denkfehler gemacht), halte ich das doch für einen grossen Bug, und
sogar _Browserübergreifend_.
Viele Grüsse
Philipp
Hallo Philipp,
Aber wenn das wirklich zutrifft und im Moment spricht alles dafür (es sei denn, ich habe
einen wirklich dummen Denkfehler gemacht), halte ich das doch für einen grossen Bug, und
sogar _Browserübergreifend_.
Der JavaScript-"Standard" schweigt sich aus über diesen Punkt:
http://devedge.netscape.com/library/manuals/2000/javascript/1.3/guide/sec.html#1015705 (ich habe 1.3 verlinkt, da der betreffende Abschnitt in 1.4 und 1.5 nicht mehr vorhanden ist)
Daher ist es vermutlich kein Bug sondern einfach im Standard so nicht definiert.
Viele Grüße,
Christian
Halihallo Christian
Der JavaScript-"Standard" schweigt sich aus über diesen Punkt:
In Table 14.2 steht eindeutig, dass auf document.cookie nur von Scripts zugegriffen
werden darf, die den same origin test hinter sich haben. Es steht zwar nicht, dass
document.cookie die Cookies des Hosts der Script-Datei enthalten muss, aber nimmt man
die Spezifikation genau, dürfte man auf document.cookie gar nicht zugreifen.
Daher ist es vermutlich kein Bug sondern einfach im Standard so nicht definiert.
Es ist IMHO ein Bug, aber wenn nicht von den Browserherstellern, dann in der
Spezifikation selber (nichts sagen schützt nicht vor Bug :-)).
Viele Grüsse
Philipp
Hallo Philipp,
Es steht zwar nicht, dass document.cookie die Cookies des Hosts der Script-Datei enthalten muss,
Genau das meinte ich.
Daher ist es vermutlich kein Bug sondern einfach im Standard so nicht definiert.
Es ist IMHO ein Bug, aber wenn nicht von den Browserherstellern, dann in der
Spezifikation selber (nichts sagen schützt nicht vor Bug :-)).
Dem stimme ich zu.
Viele Grüße,
Christian
Halihallo Christian
Es steht zwar nicht, dass document.cookie die Cookies des Hosts der Script-Datei enthalten muss,
Genau das meinte ich.
Ich war dem Irrglauben unterlegen, dass document hier das Javascript-Dokument
referenziert und somit die Cookies des Hosts der externen Javascript-Datei enthält.
Aber das document bleibt ja nach wie vor das HTML-Dokument, inwelches die JS-Datei
inkludiert wird, folglich ist das Read/Write Verbot auf document.cookie völlig richtig
und gerechtfertigt.
Daher ist es vermutlich kein Bug sondern einfach im Standard so nicht definiert.
Es ist IMHO ein Bug, aber wenn nicht von den Browserherstellern, dann in der
Spezifikation selber (nichts sagen schützt nicht vor Bug :-)).
Dem stimme ich zu.
Vielen Dank für Deine Antworten. Also scheint es wirklich ein Browserbug zu sein.
Vielleicht noch etwas kleines an alle:
In [pref:t=57488&m=321832] habe ich das zweite Mal auf das "Sicherheitsrisiko" hin-
gewiesen, was meiner Meinung nach übertrieben ist. Das Posting schrieb ich aufgrund einer
etwas kindischen Freude über das Auffinden eines "Sicherheitslochs". Ich gelobe
Besserung :-)
Viele Grüsse und vielen Dank
Philipp
Halihallo
Soeben auch mit serverseitig gesetzten Cookies reproduziert.
Duch die Einbindung eines externen Javascripts (eg. getarnt als Visit-Counter mit
Anticaching) ist es z.B. möglich die Session-Cookies des fremden Dienstes zu erhaschen
und sich damit in das fremde System einzuloggen...
Ich habe das an einem eigenen System soeben erfolgreich vollzogen...
Meine lieben Leute, bloss keine externen Javascripts von Drittpersonen einbinden!
Viele Grüsse
Philipp
Halihallo nochmals ;)
kleiner Nachtrag:
Die Same Domain Policy wird nicht verletzt, wenn ein fremdes Dokument über iframe oder
Frames (weiteres nicht getestet) eingelesen wird. Ein Zugriff auf ein
frames['foreign_host'].document.cookie wird zurecht mit "Access denied" quittiert.
Es verhärtet sich der Verdacht, dass ein eingebundenes Script immer "trusted" ist und
die Cookies vom "original-html-Dokument" erbt, auch wenn es von einem fremden Host
geladen wird.
Viele Grüsse
Philipp