aboutme:138721
JavaScript で、読み込んだ二つのソースの間(inter-script)で安全に関数を渡す(delegation)の方法を考えていたのだが、現行のバージョンである限り、できなさそうだった。
JRF 2011年5月11日 (水)
二つのソースの認証みたいなののは、(function (){ ...ここにソース... })() で隠蔽化したところで共有鍵を持っておき、sha1 とかのハッシュを取ったメッセージをやり取りすればいいだろう…というところまでは簡単だが、問題は、delegation 関数の「乗っ取り」。
JRF 2011年5月11日 4419
隠蔽化したとき、別のソースで使える関数は、「グローバル変数」に代入しておくしか受け渡しの方法がないようだが、当然、変数なので、そこに別の値がセットされることも置きうる。
だから、↓に似た感じで、中に入って途中の処理を偽装しながら細工するというのに、弱くなる。
《ICカードの迷信をバカにできるほど端末管理できてる?》
http://jrf.cocolog-nifty.com/column/2006/04/post_8.html
JRF 2011年5月11日 8849
だから、まぁ、delegation はセキュリティとか認証とかは使わずに、それ以外の部分で、電子署名的ハッシュ利用をし、arguments.calllee.caller もチェックすれば、それで、偽造を防ぐことはだいたいでき
そうだというところまでは作ってみた。(あくまで私個人はアルゴリズム的には「できてる」と考えた。)
ただ、やっぱり delegation に認証がないのは、後日の侵入チェックなどを考えると苦しい気がする。
JRF 2011年5月11日 8070
要は、読み取り専用書き込み不可の変数ができればいいのだが、JavaScript にはそういうのはなかった。
const, watch, freeze とあったが、どれも対応ブラウザが限られている上に、どれもセキュアじゃない。
const はオブジェクトをそこに入れるのは意味が違うだろうし、watch は誰でも unwatch & watch できるので、watch を使ってないことを知らないのが条件になる。freeze はオブジェクトまるごとなので、window オブジェクトをまるごと freeze できない以上、グローバル変数の書き込みを禁じるようには作用させられない。
JRF 2011年5月11日 6724
ただし、Firefox 4 が対応している ECMA-262 5th edition で導入された Object.defineProperty は、適切に機能すると言えそうである。
《defineProperty - MDC Docs》
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty
JRF 2011年5月11日 7356
が、↓で書いたように Firefox 4 には私にとってはまだクリティカルなバグが残ってるので、使えていないんだけど。(なぜか、 caller も使えなかったし。)
《昨晩、Firefox 4.0.1 にアップデートしてみたのだが、Greasemonkey との絡みなどで、いろいろ不具合が出たので、とりあえず 3.6.17 に戻した。》
http://jrf.aboutme.jp/user_statuses/show/138720
JRF 2011年5月11日 0372
typo 「関数を渡す(delegation)の方法」→「関数を渡す(delegation の)方法」。
typo 「置きうる」→「起きうる」。
行修正 「だいたいでき\nそうだ」→「だいたいできそうだ」。
修正 「watch を使ってないことを知らないのが条件」→「watch を使っていることを攻撃者が知らないのが条件」。
JRF 2011年5月11日 2305
トラックバック
他サイトなどからこの記事に自薦された関連記事(トラックバック)の一覧です。
昨晩、Firefox 4.0.1 にアップデートしてみたのだが、Greasemonkey との絡みなどで、いろいろ不具合が出たので、とりあえず 3.6.17 に戻した。 続きを読む
受信: 2012-01-04 20:51:09 (JST)
↓のコードで inter-script delegation があればいいなってことになって実験していた。
《電子署名の替わりに Loaded Magic》
http://jrf.cocolog-nifty.com/software/2011/05/post.html
JRF 2011年5月11日 0456