SlideShare a Scribd company logo
SECURITY CAMP 2016
次世代プラットフォームの
セキュリティモデル考察
(株)セキュアスカイ・テクノロジー 長谷川陽介
(株)リクルートテクノロジーズ 西村 宗晃
(前編)
SECURITY CAMP 2016
講義紹介
HTML5やJavaScriptを利用したアプリケーション開発
技術、HTTPによる機器間の通信技術はWebという枠を
超え様々な分野で応用されつつあります。この講義では、
ElectronやCordova、Chromeアプリを題材に、これら
新世代のプラットフォームに備わっているセキュリティ上
の保護機構や、プラットフォームの使用により発生が予見
される問題点などについて考察し、アプリケーション開発
者がどういった点に気を付けなければいけないかの指標
を示せるような技術を身につけることを目的とします。
はせがわようすけ @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他講演多数
SECURITY CAMP 2016
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アプリ
メインプロセス内でレンダラプロセスを生成
{
"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
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
他のサイトをレンダラ内に埋め込む
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
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をインストール
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
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>
<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

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 );
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機能が有効になっている
明示的に指定しない場合は無効
※レンダラのnode機能が無効の場合は、レンダラ内
のWebViewのnodeは有効にはできない
// index.html
<webview src="..." id="wv" nodeintegration></webview>
// index.html
<webview src="..." id="wv"></webview>
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

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>
</webview>
</html>
<html>
<iframe src="広告サイト">
</iframe>
</html>
<html>
<script>
require("child_process").exec( "calc.exe", null );
</script>
</html>
悪意のある広告

SECURITY CAMP 2016
WebViewでnode機能が有効
出来る限りwebviewタグでnode機能を有効に
しない
webview内でnode機能が使いたい場合は
preload機能を使う
BrowserWindowのpreloadは動作しないが、
WebViewのpreloadは動作する
<webview src="..." preload="./preload.js"></webview>
SECURITY CAMP 2016
演習 : Electronアプリの調査
レンダラ(WebView外)でnode機能が有効に
なっている
Electronアプリ部分にXSSが存在すると、攻撃者は
何でもできる
WebViewでnode機能が有効になっている
SNS内にXSSが存在していると何でもできる
広告が悪意を持つと何でもできる
リンククリックで外部コマンドが起動
node-integrationが無効なときにどこまででき
る?
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 );
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で定義
Content Security Policyがデフォルト有効
インラインのスクリプトやevalなどは使えない
https://developer.chrome.com/apps/contentSecurityPolicy
XSSが発生しても被害が限定的
{ ..., "permission" : [ "clipboardRead", "fileSystem" ], ...}
SECURITY CAMP 2016
Apache Cordova
SECURITY CAMP 2016
Apache Cordova
…は西村さんにバトンタッチ
SECURITY CAMP 2016
質問?
hasegawa@utf-8.jp
hasegawa@securesky-tech.com
@hasegawayosuke
http://utf-8.jp/

More Related Content

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