抱える問題点とその危険性について書く。変わっていないことを確認している。ゲームタイトルをプレイするためにインストールを要求されるプログラムで、exe形式で配布されたセットアッププログラムを実行することで、ブラウザにプラグインとして組み込まれる。記事を作成している2015年1月12日現在では、PC版の多く(全部...?)のタイトルでNGMのインストールを求められ、NGMなしにはゲームの起動が行えないようになっている。スポンサーリンクプラグインとはここでいうブラウザのプラグインとは、「拡張」「エクステンション」と呼ばれるものではなく、NPAPIというIE以外の主要ブラウザが共通して持つインタフェースを通じてブラウザ内で外部のネイティブコードを実行する仕組みのことである。その実態はDLLで、ブラウザの制限を受けないため普通のネイティブアプリケーション同様どんなこともできる。DLLは以下の場所にインストールされる。インストールされたプラグインはブラウザで有効になっていれば、Webページ側からJavaScript経由でそのプラグインが持つ機能を呼び出すことができる。(詳細は後述)※IEはNPAPIの代わりにActiveXという仕組みを持っていて、NGMもActiveX用のものがあるのかもしれないが、解析・検証したのはNPAPI版のほうだけなのでActiveXについては今回書いていない。NGMが持つ機能ブラウザのプラグイン情報(about:plugins)からNGMは以下の2つのMIMEタイプを持つことがわかる。application/x-npnxgame-jpapplication/x-npnxminfo-jpまた、OllyDbgでDLLを読み込みと参照文字列一覧とブラウザからプラグインを呼び出したときに実行されるルーチンから、以下の機能をJavaScriptオブジェクトのメソッドまたはプロパティを通して呼び出せると推測できる。デバッガ上での追跡と実際にhtmlから呼び出してみてわかった。これらの機能もいずれ詳細な解析をしたいが、今回はその名前から実行したマシンに関する何らかの情報を取得できると思われる以下の2つの機能を対象に詳細な解析を行うことにした。GenerateMIDGetPCNameNGMの呼び出し方プラグインの読み込み(起動)プラグインの読み込み(起動)プラグインを呼び出すには通常objectまたはembedタグを記述し、type属性にそのプラグインに対応したMIMEタイプを指定する。GetPCNameに対応するMIMEタイプは”application/x-npnxminfo-jp”であることがわかった。以下のJavaScript関数を実行すると動的にembedタグを生成しNGMを読み込める。オブジェクトのメソッドまたはプロパティとして当該プラグインが持つ各機能を呼び出すことができる。GetPCNameはメソッドで、戻り値として文字列が返るので以下のようなコードで呼び出す。npobj.GetPCName();この2つの機能を実際に呼び出し、戻り値を確認すると、GetPCNameではその名の通り実行したPCのコンピュータ名が、GenerateMIDは実行毎に異なる23バイトの謎の文字列が得られることがわかった。NEXON以外のドメインから各メソッドを実行することができた。謎の23バイト前述のとおり、GetPCNameに関しては戻り値がそのまんまコンピュータ名なのでどのような機能か自明だった。GenerateMIDに関しては謎の文字列が得られるだけで、その文字列にどのような情報が含まれているかまでは分からなかった。そこで、npNxGameJP.dll内のGenerateMIDが呼ばれたときに実行されるルーチンを追って当該文字列の生成フローを調べた。MACアドレスの取得まず、Win32APIのGetAdaptersInfoを使ってMACアドレスのリストを取得している。その中からGetBestInterfaceで218.145.45.80との通信に使用するインタフェース、つまりNICのMACアドレスのみを得ている。当該ルーチンをCで再現すると以下のような形になる。次にGetVolumeInformationAでCドライブのボリュームシリアル番号を取得している。Cによる再現コードは以下のとおり。}謎のファイルの読み込み次にC:\ProgramData\Nexon\Common\nxmk.datのファイルを開いて何やら読み込もうとしているが、現在このファイルは存在しないため戻り値は常に「0」になっている。合計12バイト(以下では入力Iと記す)を次の手順でエンコード(暗号化)している。1バイトの乱数A,B,Cを生成するBの上位3ビットと下位5ビットを反転した値1バイトを配列Rの1番目に格納するAの上位2ビットと下位4ビットを反転した値1バイトを配列Rの2番目に格納するCの上位1ビットと下位7ビットを反転した値1バイトを配列Rの3番目に格納するAの値をインデックスとして100131E8h~100139E8hに格納されている値2バイトを取得する(この値をK1,K2とする)K1(の値がなくなったらK2)から下位4ビットを取り出しその値をNとする入力Iから1バイト取り出し、その値とBの排他的論理和を取り、その結果を配列RのN+4番目に格納する5,6の操作を入力Iがなくなるまで(14バイト分)繰り返す17バイトの配列Rを改変Base64(後述)で23バイトのASCII文字列に変換する改変Base64は処理手順そのものは普通のBase64と同じだが、以下の点が異なる。参照テーブルに「vdNkqhCaTg2eDw45z_XMxHfY1bQo6i~EcJ9ljUZG8tVn0FArBR7LyPsWmpIOuK3S」を使用するBase64では通常「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/」を使用する変換後の文字列が4の倍数にならない場合は通常「=」記号を使用してパディングを行うが、それを行わないGenerateMIDの実行毎に値が異なるのは、格納順と排他的論理和に使う値に乱数を用いているためである。上記の手順1で生成した乱数Cは配列Rの3バイト目に格納しているだけでその他の操作に使用されていない。Cの再現コードは以下のとおり。1;}GenerateMIDで生成される謎の文字列の正体がわかったので、この理解であっていることを確かめるため、エンコードと逆の手順で元の値(MACアドレス、ボリュームシリアル番号)を取り出すデコーダを作り確認を行った。作成したデコーダにGenerateMIDで生成された23バイトの文字列を入れると、確かに自PCのMACアドレスとCドライブのボリュームシリアル番号が得られた。NGMの挙動についてのまとめ(要約)NGMの機能についてNGMはexe形式で配布されたセットアッププログラムを実行することでインストールされるブラウザのプラグインであるNGMは「application/x-npnxgame-jp」「application/x-npnxminfo-jp」という2つのMIMEタイプを持つ(about:pluginsページで確認できる)前者では「Lunch」~「GameDatas」のメソッド・プロパティが、後者では「GenerateMID」「GetPCName」メソッドが使用可能と思われる前者については未検証。後者については今回の解析により確定いずれのMIMEタイプも「GetVersion」メソッドを持ち、それぞれで戻り値が異なる。暗号化は公開鍵暗号ではなくバイト単位の共通鍵方式なので、NGMのDLLを解析して鍵を得ればその文字列は誰でも復号化できるNGMの解析なしに暗号化された文字列だけ見ても出現文字が64個あることから改変Base64が使われていることぐらいしかおそらく推測できないつまり、NEXONまたは第三者がGenerateMIDで取得した文字列をXHRなどで外部へ送信しても、そのパケットを見ただけでは何の情報が送られているか分からないNGMの実際の使用例について現在、NEXON内で「GenerateMID」「GetPCName」を使用しているページ(.jsファイル含む)は確認できていない。(そもそも十分調べていない)archive.orgで過去に”「GenerateMID」を呼び出す関数”が記述されたjsファイルがあったことは確認できる。実際にそれが使用されていた(NEXONがMIDを取得していた)かどうかは不明。プラグイン側には実装されているが、実際には使用されていない可能性がある。何が問題かNEXONにNICのMACアドレス、ボリュームシリアル番号を取得される(された)可能性がある。MACアドレス、ボリュームシリアル番号をNEXON自身が取得することについては利用規約に記述があるようなので、行為そのものもの是非はともかく、ユーザの同意を得ている形になっている。NEXON以外の第三者にMACアドレス、ボリュームシリアル番号を取得される(された)可能性がある。Chromeなどでプラグイン実行がデフォルトでブロックされない時代からNGMをインストールしていた場合NEXON自身にMACアドレス等が取得されていた可能性があるNEXON以外のドメインで第三者にMACアドレス等が取得されていた可能性があるIE以外で上記以外のブラウザを使用している場合NEXON自身にMACアドレス等が取得される(されていた)可能性があるNEXON以外のドメインで第三者にMACアドレス等が取得される(されたいた)可能性があるFirefoxに関してはNEXON側からNGMを「常に有効化する」設定に変えるようアナウンスされている。いった質問をしてくるユーザに対しては便利な回答かもしれないが、これではアナウンスに従ったユーザがNEXON以外のサイトでも知らないうちにMACアドレスが取得される可能性がある。追記Firefoxでの対策記事。NGMのFirefoxでのClick-to-Play設定について現在以下のブラウザではデフォルトでNGMがブロックされず、特にユーザに通知なく実行できることを確認している。26.0.1656.60他にもあった気がするけど再検証するの面倒だからとりあえずこれだけ記載。MACアドレス・ボリュームシリアル番号が外に漏れた場合にどのような危険があるか例えば、Wi-Fiでインターネットを使用している場合、そのクライアントのMACアドレスとある程度居場所が絞り込める情報がセットで漏れた場合、無線のパケットをキャプチャすることで通信場所を特定される可能性がある。NEXONコネクト利用者でGPS情報の送信を許可しているとまさしくセットになる。(取得・保存しているかは別として)MACアドレスもしくはボリュームシリアル番号を基にクライアントPCの識別をしているサービス・サイトがあった場合に、NGMで取得した他人のMACアドレスに偽装して認証の回避やabuse行為を行うことで他ユーザをBANさせるなども可能。そもそもNEXONが生のMACアドレスを取得する必要があるのかIPアドレスに依らないクライアントの識別のためにマシン固有の値を使用したい需要は理解できる。それに生のMACアドレスを使う必要は全くなく、ハッシュ化した値を用いればよい。そのような機能をプラグインに実装する場合は自身のサイト(ドメイン)以外で使用できないようドメイン制限を掛けるか、公開鍵で暗号化を行い秘密鍵を持たない第三者には生の値が得られないようにすべきである。脆弱性と言えるか利用規約に記述があることから、NEXON自身にMACアドレス等が取得されることにユーザは同意していたとしても、プラグインがデフォルトでブロックされないブラウザを使用している場合にNEXON以外の第三者にも取得され得るのは(おそらくそのような場合を想定していない)実装の問題であり、それは脆弱性と言えなくもない。今後も危険かChromeはNPAPIの廃止を決定している。主要ブラウザでNPAPIが使えなくなればMACアドレスを取得するようなプラグインは動かすことができなくなり、NGMもそのとき寿命を迎えることになるはず。最後に同様のケースオンラインゲームのログインやスタートページではNGMのようにまずプラグインをインストールさせそのプラグインを通じてマシンの情報を取得したり、ゲームのインストール・スタートをさせる手法は他が運営するサイトでも使われている。NGM以外に詳細な解析をしたプラグインはないが、GameOnのポータルサイト(http://www.pmang.jp/)では過去にプラグイン経由で生のMACアドレスを取得していたことを確認している(現在は使われていない)プラグインは本来ブラウザの機能を拡張する汎用的なプログラムであるはずなので、主要ブラウザではドメインごとに実行を許可・禁止する仕様になっていなかった。ユーザは利用しようとするプラグインが安全であるか、持っている機能を把握し、インストールは慎重に行う必要があった。現状はこのとおり、自サービスのためだけのプラグインをユーザに具体的な説明もなくインストールさせているケースが多数ある。他のドメインで使用されることが望ましくないプラグインであっても、実行ドメインの制限がプラグインで正しくなされているか一般のユーザが検証するのは容易ではない。そのようなプラグインを安易にユーザにインストールさせようとする(主にオンラインゲーム関連の)サービスはいかがなものかと思う。コメントをキャンセルメールアドレスが公開されることはありません。NGMのFirefoxでのClick-to-Play設定についてビビビッは現在4人で更新しています。(1)この記事を書いたメンバーauthor:xx2zz13時出社16時退社の仕事を探しています。