616 Views
August 12, 16
スライド概要
セキュリティキャンプ2016 講義資料
次世代プラットフォームの セキュリティモデル考察 (前編) (株)セキュアスカイ・テクノロジー (株)リクルートテクノロジーズ 長谷川陽介 西村 宗晃 SECURITY CAMP 2016
講義紹介 HTML5やJavaScriptを利用したアプリケーション開発 技術、HTTPによる機器間の通信技術はWebという枠を 超え様々な分野で応用されつつあります。この講義では、 ElectronやCordova、Chromeアプリを題材に、これら 新世代のプラットフォームに備わっているセキュリティ上 の保護機構や、プラットフォームの使用により発生が予見 される問題点などについて考察し、アプリケーション開発 者がどういった点に気を付けなければいけないかの指標 を示せるような技術を身につけることを目的とします。 SECURITY CAMP 2016
はせがわようすけ @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他講演多数
WebアプリケーションのJSへのシフト ブラウザの高機能化 HTML5による表現力の向上 JavaScriptの実行速度の向上 JavaScriptプログラミング効率の向上 言語仕様の充実化 プログラミング環境の改善 実行コードのブラウザ上へのシフト ネイティブアプリからWebアプリへ 従来サーバ側で行っていた処理がクライアントの JavaScript上へ 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 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を意識させずに利用することで動作するデスクトップアプリ環境 SECURITY CAMP 2016
Webを超えてのHTML+JavaScript 本講義では以下の3種類を対象として取り扱いま す Electron Chrome Apps Apache Cordova SECURITY CAMP 2016
Electronアプリ SECURITY CAMP 2016
Electronアプリ node.jsとChromiumを内包 メインプロセス アプリケーション全体を統括。node.jsそのもの。 レンダラプロセス ブラウザ+node.js Electronアプリ メインプロセス IPC レンダラプロセス SECURITY CAMP 2016
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
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
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
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
演習 Electronアプリの調査 SECURITY CAMP 2016
演習 : Electronアプリの調査 Electronアプリを調査し、脆弱性や潜在的な脅 威を調べる Webアプリとして動作しているSNSをパッケージ化し たもの Electronアプリ、SNSアプリ(WebView内)それぞれ を調べる 具体的な脆弱性でなくてもOK 「こういう条件のときに危険かも知れない」というレベ ルでOK SECURITY CAMP 2016
演習 : 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
演習 - 答え合わせ Electronアプリの調査 SECURITY CAMP 2016
演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016
演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? 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` ); SECURITY CAMP 2016
レンダラで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
レンダラで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
レンダリングで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
演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016
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
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
WebViewでnode機能が有効 WebView内のWebアプリにXSSがあれば攻撃 者は任意コード実行が可能になる 演習用のSNSにも実際にXSSがある デモ:XSSを使って攻撃者が任意コード実行 SECURITY CAMP 2016
WebViewでnode機能が有効 WebView内からnode機能が呼び出せる Webアプリ部分にXSSがなくても、広告提供者に悪 意がある or 広告が汚染されればPC上で任意コー ドの実行が可能 SECURITY CAMP 2016
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
WebViewでnode機能が有効 出来る限りwebviewタグでnode機能を有効に しない webview内でnode機能が使いたい場合は preload機能を使う <webview src="..." preload="./preload.js"></webview> BrowserWindowのpreloadは動作しないが、 WebViewのpreloadは動作する SECURITY CAMP 2016
演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016
リンククリックで外部コマンドが起動
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
リンククリックで外部コマンドが起動
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
演習 : Electronアプリの調査 レンダラ(WebView外)でnode機能が有効に なっている Electronアプリ部分にXSSが存在すると、攻撃者は 何でもできる WebViewでnode機能が有効になっている SNS内にXSSが存在していると何でもできる 広告が悪意を持つと何でもできる リンククリックで外部コマンドが起動 node-integrationが無効なときにどこまででき る? SECURITY CAMP 2016
node機能が無効なとき レンダラでnodeが無効なときはどこまで安全? XSSがあればアプリ内の機能は自由に呼び出せる 画面に偽情報の表示は可能 偽ログイン画面など WebViewでnodeが無効なときはどこまで安全? XSSがあればWebアプリとしては通常のXSSと同じ だけの脅威 XSSがなくても広告が悪意を持てば偽情報の表示 は可能 偽ログイン画面など SECURITY CAMP 2016
Chrome Apps SECURITY CAMP 2016
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
Apache Cordova SECURITY CAMP 2016
Apache Cordova …は西村さんにバトンタッチ SECURITY CAMP 2016
質問? [email protected] [email protected] @hasegawayosuke http://utf-8.jp/ SECURITY CAMP 2016