iframe sandbox ã¯ä¸è½ã§ã¯ãªã
HTML5ã§å°å ¥ãããiframeè¦ç´ ã®sandbox屿§ã¯ããã®iframeå ã®ã³ã³ãã³ãã«å¯¾ãJavaScriptã®å®è¡ãå§ãæ§ã ãªå¶ç´ã課ããã¨ã§ã»ãã¥ãªãã£ã®åä¸ã«å½¹ç«ã¤æ©è½ã§ãããä¾ãã°ã以ä¸ã®ããã«æå®ãããiframeã§ã¯ãiframeå ããformã®submitãªã©ã¯ã§ããããiframeå ã§ã®JavaScriptã®å®è¡ãtarget=_blankãªã©ã«ãã£ã¦ã¦ã£ã³ãã¦ãéããã¨ãªã©ã¯ç¦æ¢ãããã
<iframe sandbox="allow-forms" src="..."></iframe>
sandbox屿§ã«æç¤ºçã« allow-scripts ã¨ããå¤ãæå®ããªãéãã¯iframeå
ã§ã¯ç´æ¥çã«ã¯JavaScriptã¯å®è¡ã§ããªããããã¨ãã£ã¦iframeå
ãã鿥çã«JavaScriptãå¿
ãããå®è¡ããããã¨ãä¸å¯è½ãã¨ããã¨ããã§ããªãã
sandbox屿§ã«allow-top-navigationãã¤ãã¦ããå ´åãèããã
<iframe sandbox="allow-top-navigation" src="sandboxed.html"></iframe>
sandboxed.htmlå ã«è¨è¿°ããJavaScriptã¯iframeå ã§ã®å®è¡ã¯é»æ¢ããããããããã¬ãã«ã®windowã¸ã®å¹²æ¸ã¯å¯è½ã§ããããã®ãããsandboxed.htmlã«ä»¥ä¸ã®ãããªè¨è¿°ãè¡ãã¦ã¼ã¶ã¼ã«ã¯ãªãã¯ãä¿ãã
<a target="_top" href="data:text/html,<script>alert(1);</script>">click me</a>
iframeå ã«ã¯ "click me" ã®æååã表示ãããã¯ãªãã¯ãããã¨ã§ãããã¬ãã«ã®ã³ã³ãã³ããdata:ã¹ãã¼ã ã§æå®ãããHTMLã«ç½®ãæããããã®data:ã¹ãã¼ã ã¯iframeå ã§ã¯ãªããããã¬ãã«ã¦ã£ã³ãã¦å ã§è¡¨ç¤ºãããã®ã§ãããã«å«ã¾ããJavaScriptã¯å½ç¶ãªããsandbox屿§ã®å½±é¿ãåããã«å®è¡ãããã
ãã£ã¨ããä¸è¬çãªWebãã©ã¦ã¶ã§ããã°data:ã¹ãã¼ã ã¯ãã¨ã®Webãµã¤ãã®ãªãªã¸ã³(iframeã®è¦ªãiframeå
ã®ãªãªã¸ã³)ã§ã¯ãªãnullãªãªã¸ã³ã§å®è¡ãããããã«ãç´æ¥çã«Webãµã¤ãã¸å½±é¿ãä¸ãããã¨ã¯é常ã¯ãªãã
åé¡ã¯Electronã§ãã®ãããªè¨è¿°ããã¦ããå ´åã§ããã
Electronãã¬ã³ãã©å
ã«<iframe sandbox>å
¥ãã¦ãã¬ã³ãã©å
JSã§iframeå
ãæä½ããã¨ããããã¡ã«ããã°ãiframeå
ã§XSSããã£ãã¨ãã¦ãå®è³ªçãªè
å¨ãæãããã¨ãã§ãããiframeå
ã§ããã°<webview>ã¿ã°ãçæã§ããªãã
— Yosuke HASEGAWA (@hasegawayosuke) 2015, 12æ 25
ãã®ãããªæ¹æ³ã§Electronã¢ããªã«ããXSSã®è¢«å®³ã使¸ããã¦ããã¨ãã¦ããsandbox屿§ã«allow-top-navigationãæå®ããã¦ããå ´åã«ã¯æ»æè
ã«ãã£ã¦ä½æãããJavaScriptã®å®è¡ã¸ã¨ã¤ãªããå¯è½æ§ãããããã®å ´åã«ã¯ãªãªã¸ã³ãç°ãªã£ã¦ããã¨ãã¦ãnode.jsã¨åçã®ãã¼ã«ã«ãã¹ãä¸ã§ã®ä»»æã®ã³ã¼ãå®è¡ã«ãªãå¾ããå®éã«ãæ»æè
ãiframeå
ã®sandboxed.htmlã¨ãã¦ä»¥ä¸ã®ãããªHTMLãçæã§ããå ´åã«ã¯æ»æè
ã¯ä»»æã³ã¼ãã®å®è¡ãã§ããã
<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',function(){})</script>"></webview>">click me</a>
ãªããsandbox屿§ã®å¤ã¨ãã¦allow-top-navigationã ãã§ãªããallow-poopupsãåæ§ã§ããã
ã¾ã¨ãï¼Electronã¢ããªã§XSSã®è å¨ã使¸ããããã«iframe sandboxãç¨ããå ´åã¯ãallow-top-navigationããã³allow-popupsã¯é¿ããã