Hotmail/Live Mail Information Disclosure vulnerability (Date: March 16, 2007)

important

This information is at (Date: March 16, 2007)


Guess where this data came from? Right, from just that script, with a constant URL

guard...? MS's way at March 16, 2007


if (location.host == "www.msn.com" || location.host == "my.msn.com" || ...) {

nice trick ! making the location of this script dynamic


var location = {host: "whatever you want", toString: function() {return this.host}};
var window = {location: location};

alert(window.location.host);
alert(window.location);
alert(location.host);

nice trick ! making the location of this script dynamic


var document = {location: {href: "test", toString: function() {return this.href}}};
alert(document.location);
alert(document.location.href);
alert(window.document.location);

Mario's way

from http://maliciousmarkup.blogspot.com/2008/11/html-form-controls-reviewed.html

for IE6, IE7, IE8 (except for IE8 standard mode)

<form id="location" host="my.msn.com" ></form>
<script>
alert(location.host); // my.msn.com
</script>

上は何を言っているかというと

三者に容易に推測可能なURLをもつJSの配信

公開したくないデータを配信するために第三者に容易に推測可能なURLをもつJSを提供するパターンには問題点があるケースもあります。
かつて、海外の研究者によってマルチサイトなサインインを使ったケースで具体的にみつけられたのでした。サイトAでサインインしたメンバーに対してのみサイトBから固定URLでJSデータを提供したい、このときに、そのJSデータには以下のような仕掛けをすると破られる可能性があるということです。

if (location.host == "サイトBのホスト" || location.host == "サイトAのホスト" || ...) {
そのためには、罠のページに誘導しておいて、その罠のページのlocation.hostを偽装してやればよい、という発想。

Marioによるexploit

<form id="location" host="my.msn.com" ></form>
<script>
alert(location.host); // my.msn.com
</script>
上記でlocation.hostの偽装ができることでしょう。ただし、IE6,IE7での非標準な実装に依拠しています。これはバグではなく意図した仕様ですので、安心して使えます【謎】
上記を埋め込む場所は攻撃者が作る罠のページなので、IE8のユーザに対しても、IE7モードのHTMLを作成してさしあげればよいです。locaton.hostを捏造してから、固定URLでもって秘密のデータJSをアクセスすれば、データ提供側の仕組みであるlocatio.host限定による漏洩防御が無効化されるというお話になります。
なお、くだんのHOTMAILは、現在、固定URLでのデータ配信をしていませんので、試しても無駄だと思われます。また、サードパーティcookieをブロックするIEの機構が働いていればcookieで認証されているユーザのみにデータ配信をする仕組みをとるはずですので、罠のページからの固定URLのJSのアクセスができません。
いずれにせよ、JSでデータ配信をする際に、location.hostやdocument.domainで制限をかけることはやってはいけないことですね。そのようなわけですので、変なサイトをみつけたら、世の平和のためにも是非IPAのほうに報告してあげてくださいませ。

marioの方法ならば、偽のlocation.hostを見破るのに、location.ownerDocumentの存在を調べればよいかもしれませんが、確実な方法ではないかもしれませんね。

遊び

ちなみにmarioの方法をちょっと拡張すれば、
locaton.replace('foo')と書くとalert('foo')となるようにもできます。

<form id="location" replace="initialValue" ></form>
上のようなものを用意します。【謎】のreplace属性には、string型だけを属性値をしてセット可能なように見えますが、setAttributeメソッドを使うと、functionをセットすることができます。お試しください。

location.setAttribute("replace", function(x){alert(x)});
location.replace('Wow'); // alert('Wow')

同様にdocument.cookieやdocument.domainなどでもいろいろ遊べます。ただし、同一ドメイン制限ポリシーをかいくぐることは、私の知る限りではできません。XHRなど。

AVTokyo

今年のAVtokyoに参戦しようかと、ネタを考えたいたもののうちひとつを、今日の日記に書きました。 もうひとつは、Firefoxでアドレスバーの偽装をしてみようかというもの(document.referrer偽装について調べていたらその系でアドレスバー偽装ぽいものが…正しいサイトに遷移後時間がたつと自動的に罠サイトに遷移、もちろんコンテンツはそっくくりなので気がつくにはアドレスバーの内容が変化するかどうか見極めなくてはいけない)ま、不完全ですので(正しいサイト表示中にカーソルが砂時計でモーダルな感じになっちゃう)、ネタとして不発なのでした。残念。
おとつい、このところ体調が悪かった家族が入院しました。そんなこともあって地元から離れるわけにもいかず。みなさんとお会いしたかったのですが、またの機会を待つことといたします。