次世代プラットフォームのセキュリティモデル考察(前編)

4.426 Aufrufe

Veröffentlicht am

セキュリティキャンプ2016 講義資料

Veröffentlicht in: Internet

次世代プラットフォームのセキュリティモデル考察(前編)

  1. 1. SECURITY CAMP 2016 次世代プラットフォームの セキュリティモデル考察 (株)セキュアスカイ・テクノロジー 長谷川陽介 (株)リクルートテクノロジーズ 西村 宗晃 (前編)
  2. 2. SECURITY CAMP 2016 講義紹介 HTML5やJavaScriptを利用したアプリケーション開発 技術、HTTPによる機器間の通信技術はWebという枠を 超え様々な分野で応用されつつあります。この講義では、 ElectronやCordova、Chromeアプリを題材に、これら 新世代のプラットフォームに備わっているセキュリティ上 の保護機構や、プラットフォームの使用により発生が予見 される問題点などについて考察し、アプリケーション開発 者がどういった点に気を付けなければいけないかの指標 を示せるような技術を身につけることを目的とします。
  3. 3. はせがわようすけ @hasegawayosuke (株)セキュアスカイ・テクノロジー 常勤技術顧問 セキュリティキャンプ講師 (2008年~) OWASP Kansaiチャプターリーダー OWASP Japanボードメンバー CODE BLUEカンファレンス レビューボード http//utf-8.jp/ jjencodeとかaaencodeとか Black Hat Japan 2008, 韓国 POC 2008、POC 2010、OWASP AppSec APAC 2014他講演多数
  4. 4. SECURITY CAMP 2016 WebアプリケーションのJSへのシフト ブラウザの高機能化 HTML5による表現力の向上 JavaScriptの実行速度の向上 JavaScriptプログラミング効率の向上 言語仕様の充実化 プログラミング環境の改善 実行コードのブラウザ上へのシフト ネイティブアプリからWebアプリへ 従来サーバ側で行っていた処理がクライアントの JavaScript上へ
  5. 5. SECURITY CAMP 2016 Webを超えてのHTML+JavaScript Webアプリ以外でもHTML+JavaScriptで開発 HTML,CSS,JavaScriptという標準化された規格 マルチプラットフォームへの移植性 Webアプリで培われた資産や開発環境 開発者の「新しいもの好き」の満足感 新旧さまざまなアーキテクチャ Microsoft HTML Application Firefox OS Apache Cordova / Adobe PhoneGap Electron / NW.js Chrome Apps
  6. 6. SECURITY CAMP 2016 Webを超えてのHTML+JavaScript Microsoft HTML Application  おそらくもっとも古い(1999年)HTMLによるアプリケーション作成の仕組 み Firefox OS  ブラウザをOSとしてしまうことで、HTML+JSをアプリケーションとして動作 させる Apache Cordova / Adobe PhoneGap  主にスマートフォン向けアプリをHTML+JSで作成可能にするフレーム ワーク Electron / NW.js  node.js+Chromiumでマルチプラットフォームなデスクトップアプリを開 発可能にするフレームワーク Chrome Apps  Chromeを意識させずに利用することで動作するデスクトップアプリ環境
  7. 7. SECURITY CAMP 2016 Webを超えてのHTML+JavaScript 本講義では以下の3種類を対象として取り扱いま す Electron Chrome Apps Apache Cordova
  8. 8. SECURITY CAMP 2016 Electronアプリ
  9. 9. SECURITY CAMP 2016 Electronアプリ node.jsとChromiumを内包 メインプロセス アプリケーション全体を統括。node.jsそのもの。 レンダラプロセス ブラウザ+node.js メインプロセス レンダラプロセス Electronアプリ IPC
  10. 10. SECURITY CAMP 2016 Electronアプリ メインプロセス内でレンダラプロセスを生成 { "name" : "Application name", "version" : "0.1", "main" : "main.js" } let win = new BrowserWindow( {width:840,height:700} ); win.loadURL( `file://${__dirname}/index.html` ); <html> <head>...</head> <body>...</body> </html> main.js - メインプロセス index.html - レンダラプロセス package.json
  11. 11. SECURITY CAMP 2016 Electronアプリ レンダラではブラウザ内でnode.jsが動く nodeを無効にすることもできる(デフォルトで有効) <script> function foo(){ let fs = require( "fs" ); fs.readFile( "./test.txt", { encoding: "utf-8" }, (err, data)=>{ document.getElementById("main").textContent = data; } ); } </script> <div id="main"> </div>
  12. 12. SECURITY CAMP 2016 Electronアプリ - WebView 他のサイトをレンダラ内に埋め込む iframeと異なりwebview内から外側は完全に 見えない (window.topとか) webviewごとにnode機能の有無を指定可能 <webview src="http://example.jp/"></webview> <webview src="http://example.jp/" nodeintegration></webview> https://github.com/electron/electron/blob/master/docs/api/web-view-tag.md
  13. 13. SECURITY CAMP 2016 Electronアプリのセキュリティ Electronの倒し方 (2016-03-07) http://utf-8.jp/public/2016/0307/electron.pdf Electronのセキュリティその後 (2016-06-29) http://utf-8.jp/public/2016/0629/electron.pdf Electronのセキュリティは難しい? — Mobage Developers Blog (2016-04-28) http://developers.mobage.jp/blog/electron-security
  14. 14. SECURITY CAMP 2016 演習 Electronアプリの調査
  15. 15. SECURITY CAMP 2016 演習 : Electronアプリの調査 Electronアプリを調査し、脆弱性や潜在的な脅 威を調べる Webアプリとして動作しているSNSをパッケージ化し たもの Electronアプリ、SNSアプリ(WebView内)それぞれ を調べる 具体的な脆弱性でなくてもOK 「こういう条件のときに危険かも知れない」というレベ ルでOK
  16. 16. SECURITY CAMP 2016 演習 : Electronアプリの調査 Electronをインストール Electronアプリをダウンロード http://utf-8.jp/camp2016/electron.zip ZIPを展開後、以下のようにするとElectronアプ リが起動する  参考:配布されているElectronアプリの場合 通常はasar形式で 配布される C:¥foo¥bar¥electron>electron . C:¥foo>npm install -g asar C:¥foo>asar e app.asar app C:¥foo>cd app C:¥foo¥app>notepad main.js C:¥foo¥app>electron . C:¥foo¥bar¥>npm -g install electron-prebuilt
  17. 17. SECURITY CAMP 2016 演習 - 答え合わせ Electronアプリの調査
  18. 18. SECURITY CAMP 2016 演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る?
  19. 19. SECURITY CAMP 2016 演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る?
  20. 20. SECURITY CAMP 2016 レンダラでnode機能が有効 メインプロセスでBrowserWindow生成時、明 示的に無効にしなければレンダラ内でnode機 能が有効になる // main.js win = new BrowserWindow( {width:840,height:700} ); win.loadURL( `file://${__dirname}/index.html` ); // main.js win = new BrowserWindow( {width:840,height:700, webPreferences:{nodeIntegration:false} } ); win.loadURL( `file://${__dirname}/index.html` );
  21. 21. SECURITY CAMP 2016 レンダラでnode機能が有効 レンダラ内にXSSがあれば攻撃者は任意コード 実行が可能になる <html> <script> elm.innerHTML = fs.readFileSync( file, {encoding:"utf8"} ); </script> .... <webview src="http://example.jp/"> </webview> <html> Content of http://example.jp </html> DOM-based XSS 
  22. 22. SECURITY CAMP 2016 レンダラでnode機能が有効 レンダラ内にXSSがあれば攻撃者は任意コード 実行が可能になる 演習用アプリにも実際にXSSがある デモ: XSSを使って攻撃者が任意コード実行 // index.js wv.addEventListener( "page-title-updated", function( e ){ document.getElementById("info").innerHTML = e.title + " / electron v." + process.versions.electron + " node v." + process.versions.node; document.title = e.title; }, false );
  23. 23. SECURITY CAMP 2016 レンダリングでnode機能が有効 出来る限り{nodeIntegration:false}を指定し てレンダラでのnodeを無効にする レンダラ内でnode機能が使いたい場合は IPC経由でメインプロセスに処理を任せる preload機能を使う  http://utf-8.jp/public/2016/0629/electron.pdf  ただし現状(v1.2.5)ではうまく動かない // main.js win = new BrowserWindow( {width:840,height:700, webPreferences : { nodeIntegration : false, preload : './preload.js' } } ); win.loadURL( `file://${__dirname}/index.html` );
  24. 24. SECURITY CAMP 2016 演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る?
  25. 25. SECURITY CAMP 2016 WebViewでnode機能が有効 WebView内でnode機能が有効になっている 明示的に指定しない場合は無効 ※レンダラのnode機能が無効の場合は、レンダラ内 のWebViewのnodeは有効にはできない // index.html <webview src="..." id="wv" nodeintegration></webview> // index.html <webview src="..." id="wv"></webview>
  26. 26. SECURITY CAMP 2016 WebViewでnode機能が有効 WebView内のWebアプリにXSSがあれば攻撃 者は任意コード実行が可能になる <html> .... <webview src="http://example.jp/" nodeintegration> </webview> </html> <html> <script> elm.innerHTML = xhr.responseText; </script> </html> DOM-based XSS 
  27. 27. SECURITY CAMP 2016 WebViewでnode機能が有効 WebView内のWebアプリにXSSがあれば攻撃 者は任意コード実行が可能になる 演習用のSNSにも実際にXSSがある デモ:XSSを使って攻撃者が任意コード実行
  28. 28. SECURITY CAMP 2016 WebViewでnode機能が有効 WebView内からnode機能が呼び出せる Webアプリ部分にXSSがなくても、広告提供者に悪 意がある or 広告が汚染されればPC上で任意コー ドの実行が可能
  29. 29. SECURITY CAMP 2016 WebViewでnode機能が有効 XSSがなくても広告が汚染されれば任意コード 実行が可能になる <html> <webview src="http://example.jp/" nodeintegration> </webview> </html> <html> <iframe src="広告サイト"> </iframe> </html> <html> <script> require("child_process").exec( "calc.exe", null ); </script> </html> 悪意のある広告 
  30. 30. SECURITY CAMP 2016 WebViewでnode機能が有効 出来る限りwebviewタグでnode機能を有効に しない webview内でnode機能が使いたい場合は preload機能を使う BrowserWindowのpreloadは動作しないが、 WebViewのpreloadは動作する <webview src="..." preload="./preload.js"></webview>
  31. 31. SECURITY CAMP 2016 演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る?
  32. 32. SECURITY CAMP 2016 リンククリックで外部コマンドが起動 URLクリック時にOSのブラウザを起動させたい URLとしてfile://C:/windows/notepad.exeな どが与えられるとそれが起動する // index.js const {shell} = require('electron'); wv.addEventListener( "new-window", function( e ){ shell.openExternal( e.url ); }, false );
  33. 33. SECURITY CAMP 2016 リンククリックで外部コマンドが起動 shell.openExternalにはhttp、httpsのみを与 えるようにする // index.js const {shell} = require('electron'); wv.addEventListener( "new-window", function( e ){ if( /^https?:¥/¥//.test( e.url ) ){ shell.openExternal( e.url ); } }, false );
  34. 34. SECURITY CAMP 2016 演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る?
  35. 35. SECURITY CAMP 2016 node機能が無効なとき レンダラでnodeが無効なときはどこまで安全? XSSがあればアプリ内の機能は自由に呼び出せる 画面に偽情報の表示は可能  偽ログイン画面など WebViewでnodeが無効なときはどこまで安全? XSSがあればWebアプリとしては通常のXSSと同じ だけの脅威 XSSがなくても広告が悪意を持てば偽情報の表示 は可能  偽ログイン画面など
  36. 36. SECURITY CAMP 2016 Chrome Apps
  37. 37. SECURITY CAMP 2016 Chrome Apps Chromeを意識させることなくHTML+JSをアプ リのように実行 https://developer.chrome.com/apps/about_apps 使いたい機能を事前にmanifest.jsonで定義 Content Security Policyがデフォルト有効 インラインのスクリプトやevalなどは使えない https://developer.chrome.com/apps/contentSecurityPolicy XSSが発生しても被害が限定的 { ..., "permission" : [ "clipboardRead", "fileSystem" ], ...}
  38. 38. SECURITY CAMP 2016 Apache Cordova
  39. 39. SECURITY CAMP 2016 Apache Cordova …は西村さんにバトンタッチ
  40. 40. SECURITY CAMP 2016 質問? hasegawa@utf-8.jp hasegawa@securesky-tech.com @hasegawayosuke http://utf-8.jp/

×