Growl/GNTP 1.1.1が危険すぎる

今現在は修正されています! Growl/GNTP は危険じゃないよ!! あと、これはFirefox拡張の話で GNTP というプロトコルの話じゃないっす。ご注意を。


はてなユーザーがいま見ているページについてコメントをつぶやくグリモンを作った - 今日もスミマセン。Growl/GNTP :: Add-ons for Firefoxという拡張機能を知った。

Growl for WindowsというWindowsMacOSGrowlという通知機能を有効にするデーモンと組み合わせて使う拡張機能だ。

ちょっと気になったのでソースを拝見したところ。と〜っても危険なことが分かった。

この拡張機能、特定タイプのDOM Eventを受け取って通知を受け取ることが可能で、Webコンテンツからも受け取れるようになっている。これだけなら、まぁ良いのだが、データの受け取り方に問題がある。

簡単に書くと、JSONコードを拾って通知タイトルだとか内容だとかをevalでオブジェクト化している。evalするのは拡張機能内なのでChrome特権が使用可能。

  • 実証コード:Growl/GNTP test
    • Fireボタンでコード実行するよ
    • notepadが起動すると思う

実証コードではWebコンテンツ側のスクリプトのみで他プロセスを起動するようなコードになっている。もう何でもありだってことが分かるだろう。

また、

ConstellationConstellation , Growl/GNTPのaddEventListenerが第四引数がtrueなのでchrome空間外からのeventも受け取る.Growl/GNTPの方の問題.GMContextにメソッド追加の方がいい2009/06/16

はてなブックマーク - はてなユーザーがいま見ているページについてコメントをつぶやくグリモンを作った - 今日もスミマセン。

id:Constellationさんが書いているが、こちらはセキュリティ的な問題としてはまだ良い方。ユーザスクリプトからしか実行できない場合でもevalの問題が解消されないと危険であることに変わりがない。

patch

--- browserOverlay.js.old       2009-06-16 20:51:57.125000000 +0900
+++ browserOverlay.js   2009-06-16 20:51:33.171875000 +0900
@@ -14,6 +14,11 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  * */
 
+if (typeof JSON == "undefined"){
+    Components.utils.import("resource://gre/modules/JSON.jsm");
+    JSON.parse = JSON.fromString;
+    JSON.stringfy = JSON.toString;
+}
 var growlgntp = {
     APPNAME : "Firefox",
     
@@ -137,14 +142,14 @@
     externalRegisterHandler : function(e){
         var attr = e.target.getAttribute("data");
         //alert(attr);
-        var data = eval('(' + attr + ')');
+        var data = JSON.parse(attr);
         this.growl.register(data.appName, data.icon, data.notificationTypes);
     },
     
     externalNotifyHandler : function(e){
         var attr = e.target.getAttribute("data");
         //alert(attr);
-        var data = eval('(' + attr + ')');
+        var data = JSON.parse(attr);
         this.growl.notify(data.appName, data.type, data.title, data.text, data.icon);
     }
 };

上記のようなパッチを当てて、JSON.parseを使用すれば単純にコードであれば以下のような例外が投げられ、が実行されることはないと思われる。

エラー: [Exception... "'SyntaxError: No valid JSON string!' when calling method: [nsIDOMEventListener::handleEvent]"  nsresult: "0x8057001c (NS_ERROR_XPC_JS_THREW_JS_OBJECT)"  location: "<unknown>"  data: no]

もちろん、JSON.parseやGrowl for Windows脆弱性があった場合は問題が発生する可能性がある。こちらは僕には難しすぎて分からない。あと、id:Constellationさんが言及していることに関しては、とりあえず、Webコンテンツからドカドカと通知が来るのはちょっと遠慮したいなとは思うが、危険なコードが実行されたりするのかどうか分からない。

とりあえず、現状のGrowl/GNTPを使用するのはやめた方が良い。
まぁAMOでもまだ実験的アドオンとなっているとおり、レビューを通っているわけではないので、そのうちAMOから開発者側に警告が行くと思う。恥ずかしい事ながら僕も警告を受け取った人なので...。

追記(2009-06-17T18:09:00+09:00

id:snaka72さんが作者にメールを送ったことで現在AMO側には1.1.2がアップされており、僕が指摘したものはfixされたと思われる。
ただ、なぜかJSON.jsmを使わずにjson2.jsを使用する選択肢を採ったようだが。。。
まぁ何はともあれ、めでたし、めでたし。