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

341 Views

August 12, 16

スライド概要

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

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

次世代プラットフォームの セキュリティモデル考察 (前編) (株)セキュアスカイ・テクノロジー (株)リクルートテクノロジーズ 長谷川陽介 西村 宗晃 SECURITY CAMP 2016

2.

講義紹介 HTML5やJavaScriptを利用したアプリケーション開発 技術、HTTPによる機器間の通信技術はWebという枠を 超え様々な分野で応用されつつあります。この講義では、 ElectronやCordova、Chromeアプリを題材に、これら 新世代のプラットフォームに備わっているセキュリティ上 の保護機構や、プラットフォームの使用により発生が予見 される問題点などについて考察し、アプリケーション開発 者がどういった点に気を付けなければいけないかの指標 を示せるような技術を身につけることを目的とします。 SECURITY CAMP 2016

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.

WebアプリケーションのJSへのシフト ブラウザの高機能化  HTML5による表現力の向上  JavaScriptの実行速度の向上 JavaScriptプログラミング効率の向上  言語仕様の充実化  プログラミング環境の改善 実行コードのブラウザ上へのシフト  ネイティブアプリからWebアプリへ  従来サーバ側で行っていた処理がクライアントの JavaScript上へ SECURITY CAMP 2016

5.

Webを超えてのHTML+JavaScript Webアプリ以外でもHTML+JavaScriptで開発  HTML,CSS,JavaScriptという標準化された規格  マルチプラットフォームへの移植性  Webアプリで培われた資産や開発環境  開発者の「新しいもの好き」の満足感 新旧さまざまなアーキテクチャ  Microsoft HTML Application  Firefox OS  Apache Cordova / Adobe PhoneGap  Electron / NW.js  Chrome Apps SECURITY CAMP 2016

6.

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を意識させずに利用することで動作するデスクトップアプリ環境 SECURITY CAMP 2016

7.

Webを超えてのHTML+JavaScript 本講義では以下の3種類を対象として取り扱いま す  Electron  Chrome Apps  Apache Cordova SECURITY CAMP 2016

8.

Electronアプリ SECURITY CAMP 2016

9.

Electronアプリ node.jsとChromiumを内包 メインプロセス  アプリケーション全体を統括。node.jsそのもの。 レンダラプロセス  ブラウザ+node.js Electronアプリ メインプロセス IPC レンダラプロセス SECURITY CAMP 2016

10.
[beta]
Electronアプリ
メインプロセス内でレンダラプロセスを生成
package.json
{

}

"name"
: "Application name",
"version" : "0.1",
"main"
: "main.js"

main.js - メインプロセス
let win = new BrowserWindow( {width:840,height:700} );
win.loadURL( `file://${__dirname}/index.html` );

index.html - レンダラプロセス
<html>
<head>...</head>
<body>...</body>
</html>
SECURITY CAMP 2016

11.
[beta]
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>

SECURITY CAMP 2016

12.

Electronアプリ - WebView 他のサイトをレンダラ内に埋め込む <webview src="http://example.jp/"></webview> iframeと異なりwebview内から外側は完全に 見えない (window.topとか) webviewごとにnode機能の有無を指定可能 <webview src="http://example.jp/" nodeintegration></webview> https://github.com/electron/electron/blob/master/docs/api/web-view-tag.md SECURITY CAMP 2016

13.

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 SECURITY CAMP 2016

14.

演習 Electronアプリの調査 SECURITY CAMP 2016

15.

演習 : Electronアプリの調査 Electronアプリを調査し、脆弱性や潜在的な脅 威を調べる  Webアプリとして動作しているSNSをパッケージ化し たもの  Electronアプリ、SNSアプリ(WebView内)それぞれ を調べる  具体的な脆弱性でなくてもOK 「こういう条件のときに危険かも知れない」というレベ ルでOK SECURITY CAMP 2016

16.

演習 : Electronアプリの調査 Electronをインストール C:¥foo¥bar¥>npm -g install electron-prebuilt Electronアプリをダウンロード  http://utf-8.jp/camp2016/electron.zip ZIPを展開後、以下のようにするとElectronアプ リが起動する C:¥foo¥bar¥electron>electron . 参考:配布されているElectronアプリの場合  通常はasar形式で 配布される 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 . SECURITY CAMP 2016

17.

演習 - 答え合わせ Electronアプリの調査 SECURITY CAMP 2016

18.

演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている  Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている  SNS内にXSSが存在していると何でもできる  広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016

19.

演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている  Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている  SNS内にXSSが存在していると何でもできる  広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016

20.

レンダラで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` ); SECURITY CAMP 2016

21.
[beta]
レンダラでnode機能が有効
レンダラ内にXSSがあれば攻撃者は任意コード
実行が可能になる


<html>
DOM-based XSS
<script>
elm.innerHTML = fs.readFileSync( file, {encoding:"utf8"} );
</script>
....
<webview src="http://example.jp/">
<html>
Content of http://example.jp
</html>
</webview>

SECURITY CAMP 2016

22.
[beta]
レンダラでnode機能が有効
レンダラ内に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 );

 デモ: XSSを使って攻撃者が任意コード実行

SECURITY CAMP 2016

23.
[beta]
レンダリングで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` );

SECURITY CAMP 2016

24.

演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている  Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている  SNS内にXSSが存在していると何でもできる  広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016

25.

WebViewでnode機能が有効 WebView内でnode機能が有効になっている  明示的に指定しない場合は無効 // index.html <webview src="..." id="wv" nodeintegration></webview> // index.html <webview src="..." id="wv"></webview> ※レンダラのnode機能が無効の場合は、レンダラ内 のWebViewのnodeは有効にはできない SECURITY CAMP 2016

26.
[beta]
WebViewでnode機能が有効
WebView内のWebアプリにXSSがあれば攻撃
者は任意コード実行が可能になる

<html>
....
<webview src="http://example.jp/" nodeintegration>
<html>
DOM-based XSS
<script>
elm.innerHTML = xhr.responseText;
</script>
</html>

</webview>
</html>

SECURITY CAMP 2016

27.

WebViewでnode機能が有効 WebView内のWebアプリにXSSがあれば攻撃 者は任意コード実行が可能になる  演習用のSNSにも実際にXSSがある  デモ:XSSを使って攻撃者が任意コード実行 SECURITY CAMP 2016

28.

WebViewでnode機能が有効 WebView内からnode機能が呼び出せる  Webアプリ部分にXSSがなくても、広告提供者に悪 意がある or 広告が汚染されればPC上で任意コー ドの実行が可能 SECURITY CAMP 2016

29.
[beta]
WebViewでnode機能が有効
XSSがなくても広告が汚染されれば任意コード
実行が可能になる


<html>
<webview src="http://example.jp/" nodeintegration>
<html>
<iframe src="広告サイト">
<html>
悪意のある広告
<script>
require("child_process").exec( "calc.exe", null );
</script>
</html>
</iframe>
</html>
</webview>
</html>

SECURITY CAMP 2016

30.

WebViewでnode機能が有効 出来る限りwebviewタグでnode機能を有効に しない webview内でnode機能が使いたい場合は preload機能を使う <webview src="..." preload="./preload.js"></webview>  BrowserWindowのpreloadは動作しないが、 WebViewのpreloadは動作する SECURITY CAMP 2016

31.

演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている  Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている  SNS内にXSSが存在していると何でもできる  広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016

32.
[beta]
リンククリックで外部コマンドが起動
URLクリック時にOSのブラウザを起動させたい
// index.js
const {shell} = require('electron');
wv.addEventListener( "new-window", function( e ){
shell.openExternal( e.url );
}, false );

URLとしてfile://C:/windows/notepad.exeな
どが与えられるとそれが起動する

SECURITY CAMP 2016

33.
[beta]
リンククリックで外部コマンドが起動
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 );

SECURITY CAMP 2016

34.

演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている  Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている  SNS内にXSSが存在していると何でもできる  広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016

35.

node機能が無効なとき レンダラでnodeが無効なときはどこまで安全?  XSSがあればアプリ内の機能は自由に呼び出せる  画面に偽情報の表示は可能  偽ログイン画面など WebViewでnodeが無効なときはどこまで安全?  XSSがあればWebアプリとしては通常のXSSと同じ だけの脅威  XSSがなくても広告が悪意を持てば偽情報の表示 は可能  偽ログイン画面など SECURITY CAMP 2016

36.

Chrome Apps SECURITY CAMP 2016

37.

Chrome Apps Chromeを意識させることなくHTML+JSをアプ リのように実行 https://developer.chrome.com/apps/about_apps 使いたい機能を事前にmanifest.jsonで定義 { ..., "permission" : [ "clipboardRead", "fileSystem" ], ...} Content Security Policyがデフォルト有効  インラインのスクリプトやevalなどは使えない https://developer.chrome.com/apps/contentSecurityPolicy XSSが発生しても被害が限定的 SECURITY CAMP 2016

38.

Apache Cordova SECURITY CAMP 2016

39.

Apache Cordova …は西村さんにバトンタッチ SECURITY CAMP 2016

40.

質問? hasegawa@utf-8.jp hasegawa@securesky-tech.com @hasegawayosuke http://utf-8.jp/ SECURITY CAMP 2016