security of vimperator

そういえば言及してるひとをみたことがないなと思って。せっかく流行ってきたのに水さすなとか言われそうだけど誰かがイヤな思いする前に言っといた方が親切だと思うので自重しない方向で。

まず vimp って何かってのはざっくりいってしまうと JavaScript 1.8 shell だってこと。出発点は web browser にも vim like な interface を !! なんだけどそれを実現するための手段として vim の持つ特徴を模倣するというのがまずあって

  • home position から手を動かさなくていい key bind
  • key bind を自由に変更することができる柔軟性
  • plugin による拡張性
  • command line からの ex-command による操作
  • scripting language shell としての command line

ってのが vim の特徴として挙げられると思う。そして後半の拡張性や ex-command 、 shell を実現するために何が必要かな ? -> それらは vim の持つ scripting language で実現されている -> 最近の web browser も EcmaScript ( やその独自拡張 ) って scripting language があるじゃない -> じゃあそれを使おう <- イマココ!! っていう流れ ( だと思う ) 。 web browser らしい特徴や機能の付加もひとつの目標だとは思うんだけどそれも web と親和性の高い EcmaScript を使うことでどうとでもなるという戦略もあると思う。まぁなんで Firefox に絞ったのかはよくわからないけど言い出しっぺの Martin 氏の好みとかなんじゃないかなとか ( てけとー。

というわけなので JavaScript 1.8 でできることは全部できる。そして plugin や command line からの :echo や :javascript もすべて含めて script は chrome 特権で駆動されるので Firefox3 の他の機能 ( XPCOM, Places etc ) もフルに使える。これ自体は addon でしか使えなかった機能を使って実装できるとか履歴なんかの private なデータを扱ってより user friendly な機能を提供できるのですばらしいことなんだけど。

で、これらの利点は security という観点から見るとものすごく厄介だ。 XMLHttpRequest を cross domain で使用することもできる ( multi_requester.js では任意の URL へ request を出してデータを取ってきているし twitter.js や reading.js では twitter に post している ) し XPCOM を使えるので filesystem に access することもできる ( memo.js では firefox の profile directory に local file を作成して書き込んでいる ) 。

こういうことができてしまうとたとえば自分の管理する server から virus を引っ張ってきて仕込むとか data を server に送るとか片っ端からファイルを消していく plugin とかができてしまう。さらにマトモな plugin の一部にそういう処理を書いておくだけで攻撃が成立するのでタチが悪い。別に plugin じゃなくてもコード貼って vimperatorrc に追記するように促したり :javascript の here document で流し込むように書いておくとかでいくらでも騙せる。ここらへんがどれほどの脅威なのかは Firefox addon の提供ページがなぜ https なのかとか GreasemonkeyGM_xmlhttpRequest の実装をする際にどれだけ苦労したかとかが参考になるんじゃないかな。

んでまぁどうやってこういったことから身を守るかなんだけどとれる方法は

  • 信頼できる plugin しか使わない
  • 信頼できる人の vimperatorrc しか参考にしない
  • 不用意にコピペを :javascript の here document で流し込まない
  • JavaScript を理解する

くらいかな。何が信頼できるかっていう問題はあるんだけど plugin なら本家の scripts ( http://vimperator.org/trac/wiki/Vimperator/Scripts ) で紹介されているものとか CodeRepos の vimperator-plugin directory ( http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/ ) にあるものは大方信頼できると見ていい。常に誰かの目が入っているので誰かが悪さをしにくいからだ。ただ、既存の plugin でも改変されたものが commit されて誰も気付かない可能性もあるのでそこは注意。そんなことするひとはいないんだけど何が起こるかわからないしね。 vimperatorrc や :javascript の here document に関しては自分で判断するしかないんだけどそのためにはやっぱり JavaScript の知識が必要になってくるのでわからないひとは無茶をしないというのがいい。

そして信頼できるかどうかの判断をしたいとかもっと生産的に plugin を作りたいってひとはこれを機会に JavaScript を学ぶことを考えてみていいと思う。個人的に programming language の学習ってのは対話型の shell でいろいろやってみるのが一番手っ取り早いと思ってて、対話型ではないけれども幸い vimpJavaScript shell だ。学び始めるにはちょうどいい platform だと思う。おれも vimpJavaScript への入り口だったし今もサイ本を読んでて気になるところがあったら :echo や :javascript で試している。 :time で簡易的な benchmark もとれるのでどういう記述をすべきかという根拠も与えてくれるいい教材だとも思うしね。