ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ã¼å ¥é
Chromeã®æ¡å¼µæ©è½ã¯manifest v2ããCSP対å¿ã¨ãã§ããããã¨å¶éãå³ãããªã£ãããã§ããããããããã®CSPãããåãããªãã£ãã®ã§ãHTML5Rocksã®å ¥éè¨äºã訳ãã¦ã¿ã¾ããã
ã¨ããã©ããããåãããªãã¦é©å½ã«è¨³ãã¦ããããã®ã§ãããã£ï¼ã¨æã£ããåæåç §ã®ãã¨ã
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ã¼å ¥é
注: ãã®è¨äºã¯ã¾ã å®å ¨ã«æ¨æºåãçµãã¦ãããä¸å®å®ãªAPIã«ã¤ãã¦è¿°ã¹ã¦ãã¾ããèªèº«ã®ããã¸ã§ã¯ãã§å®é¨çãªAPIã使ãå ´åã«ã¯æ³¨æãå¿ è¦ã§ãã
ã¦ã§ãã®ã»ãã¥ãªãã£ã¢ãã«ã¯同一生成元ポリシーã«ãã®æ ¹æ ãæã¡ã¾ãã https://mybank.com ã®ã³ã¼ã㯠https://mybank.com ã®ãã¼ã¿ã«ã ãã¢ã¯ã»ã¹ãã¹ãã§ãããhttps://evil.example.com ãã¢ã¯ã»ã¹ãèªãããããã¨ã¯ãã£ã¦ã¯ããã¾ãããããããã®çæå ã¯ã¦ã§ãã®ä»ã®é¨åããç¬ç«ãä¿ãããéçºè ãéçºãããéãã ãã§ããå®å ¨ãªãµã³ãããã¯ã¹ãä¸ãã¦ããã¾ããçè«çã«ã¯ããã¯å®ç§ã§ãããããå®éã«ã¯ãæ»æè ã¯ã·ã¹ãã ãç ´å£ããå·§å¦ãªæ段ãè¦ã¤ãåºãã¾ãã
ä¾ãã°ãクロスサイトスクリプティング(XSS)æ»æã¯æå³ããã³ã³ãã³ãã¨ä¸ç·ã«æªæã®ããã³ã¼ããéãè¾¼ããã¨ã§ãµã¤ããé¨ããåä¸çæå ããªã·ã¼ããã¤ãã¹ãã¾ãããã©ã¦ã¶ã¯ãããã¼ã¸å ã®ãã¹ã¦ã®ã³ã¼ããåæ³çã«ãã®ãã¼ã¸ã®ã»ãã¥ãªãã£ããªã·ã¼ã®ä¸é¨ã«å«ã¾ããã¨ä¿¡ç¨ããã®ã§ãããã¯é常ã«å¤§ããªåé¡ã§ããXSSチートシートã¯æ»æè ãæªæã®ããã³ã¼ããéãè¾¼ããã¨ã§ãã®ä¿¡é ¼ãç ´ãããã«ä½¿ç¨ãããããããªãæ段ã®ãå¤ãããã©ä»£è¡¨çãªä¾ãããã¾ãããããã«ãã¦ãæ»æè ãä½ãããã®ã³ã¼ããéãè¾¼ããã¨ã«æåããã¨ãã»ã¼ã²ã¼ã ãªã¼ãã¼ã§ããã¦ã¼ã¶ã¼ã»ãã·ã§ã³ã®ãã¼ã¿ã¯å±éºã«æãããç§å¯ã§ããã¹ãæ å ±ã¯The Bad Guys(tm)ã«èªã¿åããã¦ãã¾ãã¾ããæã ã¯ãããå¯è½ãªéãç¦æ¢ãããã¨æã£ã¦ããã®ã§ãã
ãã®ãã¥ã¼ããªã¢ã«ã¯ãã¢ãã³ãã©ã¦ã¶ã§ã®XSSæ»æã®ãªã¹ã¯ã¨ã¤ã³ãã¯ããå¤§å¹ ã«æ¸ããã¨æå¾ ãããæ°ããé²å¾¡æ¹æ³ã«ç¦ç¹ãå½ã¦ã¾ãããããã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ã¼ï¼CSPï¼ã§ãã
ã½ã¼ã¹ãã¯ã¤ããªã¹ã
XSSæ»æè ã«ãã£ã¦æªç¨ããã主ãªåé¡ç¹ã¯ããã©ã¦ã¶ãã¢ããªã±ã¼ã·ã§ã³ã®ä¸é¨ã¨ã¿ãªãããã¹ã¯ãªããã¨ãæªæãæã£ã¦ãµã¼ããã¼ãã£ããéãè¾¼ã¾ããã³ã¼ããåºå¥ãããã¨ãã§ããªãã¨ãããã¨ã§ããä¾ãã°ããã®è¨äºã®ä¸çªä¸ã«ããGoogle +1ãã¿ã³ã¯ãã®ãã¼ã¸çæå ã¨åãã³ã³ããã¹ã㧠https://apis.google.com/js/plusone.js ããã³ã¼ããèªã¿è¾¼ãã§å®è¡ãã¾ããæã ã¯ãã®ã³ã¼ããä¿¡ç¨ãã¾ããããã©ã¦ã¶èªèº«ãapis.google.comã®ã³ã¼ãã¯ãã°ãããããã©apis.evil.example.comã®ã³ã¼ãã¯ããããããã§ã¯ãªãã¨å¤æããã¨æå¾ ãããã¨ã¯ã§ãã¾ããããã©ã¦ã¶ã¯è³å¤©æ°ã«ãã©ãããåã£ã¦ãããã«é¢ããããªã¯ã¨ã¹ãããããã¼ã¸ã®ããããã³ã¼ãããã¦ã³ãã¼ããã¦å®è¡ãã¾ãã
ãµã¼ãã¼ããåãåã£ãå ¨ã¦ã®ãã®ãç²ç®çã«ä¿¡ç¨ãã代ããã«ãCSPã¯Content-Security-Policy HTTPããããå®ç¾©ããããã§ä¿¡ç¨ã§ããã³ã³ãã³ãã®ã½ã¼ã¹ã®ãã¯ã¤ããªã¹ããä½æãã¦ããã©ã¦ã¶ã«ãããã®ã½ã¼ã¹ããå¾ããªã½ã¼ã¹ã ããå®è¡ããã表示ãããããããæ示ã§ããããã«ãã¾ããæ»æè ãã¹ã¯ãªãããæ³¨å ¥ã§ããç©´ãè¦ã¤ããã¨ãã¦ãããã®ã¹ã¯ãªããããã¯ã¤ããªã¹ãã«å«ã¾ãã¦ããªããã°ãå®è¡ããã¾ããã
ããã§ã¯apis.google.comãæ£å½ãªã³ã¼ããé å¸ãã¦ããã¨ä¿¡ç¨ããã¾ãæã èªèº«ã®ãã¨ãåæ§ã«ä¿¡ç¨ãã¦ããã®ã§ããããäºã¤ã®ã½ã¼ã¹ã®ããããããåå¾ãããã¹ã¯ãªããã ããå®è¡ããããã«ããªã·ã¼ãå®ç¾©ãã¦ã¿ã¾ããã:
Content-Security-Policy: script-src 'self' https://apis.google.com
ç°¡åã§ãããï¼ããããäºæ³éããscript-srcã¯ç¹å®ã®ãã¼ã¸ã®ã¹ã¯ãªããã«é¢é£ããç¹æ¨©ã®ã»ãããå¶å¾¡ããããã®ãã£ã¬ã¯ãã£ãã§ããä»åã¯ã¹ã¯ãªããã®æ£å½ãªã½ã¼ã¹ã¨ãã¦'self'ã¨https://apis.google.comãæå®ãã¦ãã¾ãããã©ã¦ã¶ã¯ãã¡ãã¨apis.google.comããHTTPSãç¨ãã¦JavaScriptããã¦ã³ãã¼ããã¦å®è¡ãã¾ããç¾å¨ã®ãã¼ã¸ã®ãªãªã¸ã³ã®å ´åãåæ§ã§ãã
ãã®ããªã·ã¼ãå®ç¾©ããã¦ããã¨ããã®ä»ã®ã½ã¼ã¹ããã¹ã¯ãªããããã¼ã使ç¨ã¨ãã¦ãåç´ã«ã¨ã©ã¼ãæãããã¦çµãã¾ããé ã®ããæ»æè ãããªãã®ãµã¤ãã«ã©ãã«ãã³ã¼ããæ³¨å ¥ããã¨ãã¦ããæå¾ ããæåã§ã¯ãªããã®æ£å対ã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ãè¦ããã¨ã«ãªãã§ãããã
æ§ã ãªç¨®é¡ã®ãªã½ã¼ã¹ã«é©ç¨ã§ããããªã·ã¼
ã¹ã¯ãªããã®ãªã½ã¼ã¹ã¯æããã«æ大ã®ã»ãã¥ãªãã£ãªã¹ã¯ã§ãããCSPã¯ãã¼ã¸ããã¼ãã許ããããªã½ã¼ã¹ãé©æ£ãªç²åº¦ã§å¶å¾¡ã§ããè±å¯ãªããªã·ã¼ãã£ã¬ã¯ãã£ãã®ã»ãããæä¾ãã¦ãã¾ãããã§ã«script-srcãç®ã«ãã¦ããã®ã§ãã³ã³ã»ããã¯ç解ãã¦ããã§ããããæ®ãã®ãªã½ã¼ã¹ãã£ã¬ã¯ãã£ãããã£ã¨è¦ã¦ã¿ã¾ãããã
- connect-srcã¯ï¼XHRãWebSocketsãEventSourceãéãã¦ï¼æ¥ç¶ã§ãããªãªã¸ã³ãå¶éãã¾ãã
- font-srcã¯ã¦ã§ããã©ã³ããé å¸ã§ãããªãªã¸ã³ãæå®ãã¾ããGoogleã®ã¦ã§ããã©ã³ãã¯æ¬¡ã®æå®ã§æå¹åã§ãã¾ããfont-src https://themes.googleusercontent.com
- frame-srcã¯ãã¬ã¼ã ã¨ãã¦çµã¿è¾¼ãããªãªã¸ã³ã®ä¸è¦§ãæå®ãã¾ããä¾ãã°æ¬¡ã®ããã«æå®ããã°YouTubeã¯çµã¿è¾¼ãã¾ããããã以å¤ã®ãªãªã¸ã³ã¯çµã¿è¾¼ãã¾ãããframe-src https://youtube.com
- img-srcã¯ç»åãåå¾ã§ãããªãªã¸ã³ãå®ç¾©ãã¾ãã
- media-srcã¯åç»ãé³æ¥½ãé å¸ã§ãããªãªã¸ã³ãéå®ãã¾ãã
- object-srcã¯Flashããã®ä»ã®ãã©ã°ã¤ã³çµç±ã§ã®ã³ã³ããã¼ã«ã許å¯ãã¾ãã
- style-srcã¯ã¹ã¿ã¤ã«ã·ã¼ãã®ããã®script-srcã®ã«ã¦ã³ã¿ã¼ãã¼ãã§ãã
ããã©ã«ãã§ã¯ããã£ã¬ã¯ãã£ãã¯åºãéããã¦ãã¾ãããã£ã¬ã¯ãã£ãã«ç¹å®ã®ããªã·ã¼ãæå®ããªããã°ãä¾ãã°font-srcã®ããã«æå®ããã°ãæå¹ãªã½ã¼ã¹ã¨ãã¦*ãæå®ãããã®ã¨ãã¦åä½ãã¾ããï¼ã¤ã¾ããããããå ´æããå¶éç¡ããã©ã³ãããã¼ãã§ãã¾ãï¼
ããã©ã«ãã®åä½ã¯default-srcãã£ã¬ã¯ãã£ããæå®ãããã¨ã§ä¸æ¸ãã§ãã¾ãããã®ãã£ã¬ã¯ãã£ãã¯ãæ³åéãããªã«ãæå®ããªãã£ããã£ã¬ã¯ãã£ãã®ããã©ã«ãå¤ãå®ç¾©ãã¾ããdefault-srcãhttps://example.comã«è¨å®ããã¦ãã¦ãfont-srcãã£ã¬ã¯ãã£ãã®æå®ã«å¤±æãã¦ããã°ããã©ã³ãã¯https://example.comããã¯ãã¼ãã§ãã¾ããããã以å¤ã¯ã©ãããããã¼ãã§ãã¾ãããå ã®ä¾ã§ã¯script-srcã ããæå®ããã®ã§ãç»åããã©ã³ããªã©ã¯ãããããªãªã¸ã³ã®ãã®ããã¼ãã§ãã¾ãã
HTTPãããã®ä¸ã§ãã»ãã³ãã³ã§åãã£ã¬ã¯ãã£ããåå²ãã¦ä¸¦ã¹ãã ãã§ãç¹å®ã®ã¢ããªã±ã¼ã·ã§ã³ã«å¿ è¦ãªã ããã£ã¬ã¯ãã£ããå©ç¨ã§ãã¾ããä¸ã¤ã®ãã£ã¬ã¯ãã£ãå ã§ç¹å®ã®ã¿ã¤ãã®å¿ è¦ãªãªã½ã¼ã¹ãå ¨ã¦ä¸¦ã¹ã¦ããã確èªããããªãã§ããããscript-src https://host1.com; script-src https://host2.comã®ããã«æ¸ãã¨ãäºã¤ç®ã®ãã£ã¬ã¯ãã£ãã¯ãã®ã¾ã¾ç¡è¦ããã¾ããscript-src https://host1.com https://host2.comãäºã¤ã®ãªãªã¸ã³ãæ£å½ãªãã®ã§ããã¨æå®ããæ£ããæ¹æ³ã§ãã
ä¾ãã°ãããå ¨ã¦ã®ãªã½ã¼ã¹ãã³ã³ãã³ãããªããªãããã¯ã¼ã¯ï¼https://cdn.example.netã¨ãã¾ãï¼ãããã¼ãããã¢ããªã±ã¼ã·ã§ã³ãããã¨ãã¦ããã¬ã¼ã ããã©ã°ã¤ã³ãä¸åä¸è¦ã ã¨åãã£ã¦ããã°ãããªã·ã¼ã¯æ¬¡ã®ããã«ãªãã§ãããã
Content-Security-Policy: default-src https://cdn.example.net; frame-src 'none'; object-src 'none'
å®è£ ã®è©³ç´°
å ã«é²ãåã«ãä¾ã§ä½¿ç¨ãã¦ããæ¨æºçãªãããContent-Security-Policyã«ã¤ãã¦ã®éè¦ãªæ³¨æãããã¾ããç¾å¨ã®ãã©ã¦ã¶ã¯ãã¬ãã£ã¯ã¹ä»ãã§æ©è½ãå®è£ ãã¦ãã¾ããFirefoxã¯X-Content-Security-Policyã§ãWebkitãã¼ã¹ã®ãã©ã¦ã¶ï¼Safariã¨Chromeï¼ã¯X-Webkit-CSPã使ç¨ãã¾ããå®è£ ã¯ã»ã¼åãã§ãããè¿ããã¡ã«æ¨æºã¨ç½®ãæããããã§ããããæ¬è¨äºã§ã¯Content-Security-Policyãç¶ç¶ãã¦ä½¿ç¨ãã¾ããç¾æç¹ã§ã¯ãã¬ãã£ã¯ã¹ã¯å¿ é ã§ãããããããã©ã¦ã¶ããã®ããããç½®ãæããã§ãããã
使ç¨ãããããã«é¢ãããããªã·ã¼ã¯ãã¼ã¸ãã¨ã«å®ç¾©ããããããããªãã確å®ã«å®ããã¨æãå ¨ã¦ã®ã¬ã¹ãã³ã¹ã«HTTPããããã¤ãã¦éä¿¡ããå¿ è¦ãããã¾ããããã«ãã大ããªæè»æ§ãå¾ãããç¹å®ã®ãã¼ã¸ã®ããã«ç¹å¥ãªå¿ è¦æ§ã«å¿ãã¦èª¿ç¯ãããããªã·ã¼ãè¨å®ã§ãã¾ããä¾ãã°ãµã¤ãå ã«+1ãã¿ã³ãæã¤ãã¼ã¸ç¾¤ã¨ããã§ã¯ãªããã¼ã¸ç¾¤ãããã¨ãã«ãå¿ è¦ãªå ´æã§ã ããã¿ã³ã®ã³ã¼ãã許å¯ã§ãã¾ãã
ããããã«ãã£ã¬ã¯ãã£ãã«å«ãããã¨ã®ã§ããã½ã¼ã¹ãªã¹ãã¯ååãªé å西ãæã¡ã¾ããã½ã¼ã¹ãã¹ãã¼ã ï¼data:, https:ï¼ã§æå®ãããã¨ãã§ããã°ããã¹ãåã®ã¿æå®ï¼example.comããã®ãã¹ãä¸ã®ä»»æã®ãªãªã¸ã³ã»ã¹ãã¼ã ã»ãã¼ãã許å¯ï¼ããå®å ¨ä¿®é£¾URIã§ã®æå®ï¼https://example.com:443ãHTTPSã§example.comã§ãã¼ãçªå·ã¯443ã®ã¿è¨±å¯ï¼ã¾ã§ã®ç¯å²ã§æå®ãããã¨ãã§ãã¾ããã¯ã¤ã«ãã«ã¼ããå©ç¨ã§ãã¾ãããã¹ãã¼ã ããã¼ãããã¹ãåã®æå¾ã ãã§ããå©ç¨ã§ãã¾ããã*://*.example.com:*ã¯example.comã®å ¨ã¦ã®ãµããã¡ã¤ã³ï¼ãã ãexample.comèªèº«ã¯ä¸å¯ï¼ã§ãä»»æã®ã¹ãã¼ã ãä»»æã®ãã¼ãã«ããããã¾ãã
以ä¸ã®4ã¤ã®ãã¼ã¯ã¼ããã½ã¼ã¹ãªã¹ãå ã§å©ç¨ã§ãã¾ã:
- 'none' ã¯ãæå¾ éããä½ã¨ãããããã¾ããã
- 'self' ã¯ç¾å¨ã®ãªãªã¸ã³ã«ããããã¾ããããµããã¡ã¤ã³ã¨ã¯ããããã¾ããã
- 'unsafe-inline' ã¯ã¤ã³ã©ã¤ã³ã®JavaScriptã¨CSSã許å¯ãã¾ããï¼è©³ç´°ã«ã¤ãã¦ã¯å¾ã»ã©è§¦ãã¾ãï¼
- 'unsafe-eval' ã¯evalã®ãããªæååãJavaScriptã¨ãã¦è©ä¾¡ããæ©æ§ã許å¯ãã¾ããï¼ãããå¾ã»ã©ï¼
ãããã®ãã¼ã¯ã¼ãã¯ã·ã³ã°ã«ã¯ã©ã¼ãã¼ã·ã§ã³ãå¿ é ã§ããscript-src 'self' ã¯ç¾å¨ã®ãã¹ãããåå¾ããJavaScriptã®å®è¡ã許å¯ãã¾ããä¸æ¹ãscript-src self ã¯"self"ã¨ããååã®ãµã¼ãã¼ããåå¾ããJavaScriptã許å¯ãã¾ãï¼ããã¦ç¾å¨ã®ãã¹ãããã®ãã®ã¯è¨±å¯ãã¾ããï¼ãããã¯ããããæå¾ ããåä½ã§ã¯ãªãã§ãããã
触ãã¦ãã価å¤ã®ãããã£ã¬ã¯ãã£ããããä¸ã¤æãã¾ãããããsandboxã§ããããã¯ããã¾ã§è¦ã¦ãããã®ã¨ã¯å°ãç°ãªãããã¼ã¸ããã¼ãåºæ¥ããªã½ã¼ã¹ã«å¯¾ãã¦ã¨ããããã¯ãã¼ã¸ã§å®è¡åºæ¥ãã¢ã¯ã·ã§ã³ãå¶éããå ´æã«ãªãã¾ããããsandboxãã£ã¬ã¯ãã£ããåå¨ãããããã®ãã¼ã¸ã¯sandboxå±æ§ãæã¤iframeã®ä¸ã«ãã¼ãããããã®ã¨ãã¦æ±ããã¾ããããã¯ãã¼ã¸ã«å¯¾ãã¦é常ã«åºç¯ãªå½±é¿ãä¸ãã¾ãããã®ãã¼ã¸ã¯ç¬èªã®ãªãªã¸ã³ãæã¤ããã«ãªãããã©ã¼ã ããµããããåºæ¥ãªãããªã©ã妥å½ãªsandboxingå±æ§ã®è©³ç´°ã«ã¤ãã¦ã¯ãã®è¨äºã®ã¹ã³ã¼ããå°ãå¤ãã¾ãã®ã§ãHTML5仕様書の"sandboxing flag set"セクションãã¿ãã¨ããã§ãããã
ã¤ã³ã©ã¤ã³ã³ã¼ãã¯æ害ã
CSPã¯ããã©ã¦ã¶ã«ãªã½ã¼ã¹ã®ç¹å®ã®çµãã¢ã¯ã»ã¹å¯è½ã«ãããã以å¤ãç¦æ¢ãããæ確ãªæ示ã®æ¹æ³ã¨ãã¦ããªãªã¸ã³ã®ãã¯ã¤ããªã¹ãã«åºç¤ãããã¦ããã¨ãããã¨ãã¯ã£ããã¨ããã¦ããã¹ãã§ãããããããããªãªã¸ã³ã«åºã¥ãããã¯ã¤ããªã¹ãã¯XSSæ»æã«å¯ã£ã¦å¼ãèµ·ããããæã大ããªè å¨ãinline script injectionãã®è§£æ±ºçã«ã¯ãªãã¾ãããæ»æè ãä¸æ£ãªãã¤ãã¼ããå«ãã¹ã¯ãªããã¿ã°ï¼<script>sendMyDataToEvilDotCom()</script>ï¼ãæ³¨å ¥ã§ããã¨ãããããã©ã¦ã¶ã¯åæ³çãªã¤ã³ã©ã¤ã³ã¹ã¯ãªããã¿ã°ã¨ããããåºå¥ããæ段ãæã¡ã¾ãããCSPã¯ãã®åé¡ãã¤ã³ã©ã¤ã³ã¹ã¯ãªãããå®å ¨ã«ç¦æ¢ãããã¨ã§è§£æ±ºãã¾ããã明らかにこれが唯一の手段です。
ããã¯ã¹ã¯ãªããã¿ã°ã¨ãã¦ç´æ¥çµã¿è¾¼ã¾ããã¹ã¯ãªããã ãã§ãªããã¤ã³ã©ã¤ã³ã®ã¤ãã³ããã³ãã©ã¨javascript: URLãåããã¦ç¦æ¢ãã¾ããã¹ã¯ãªããã¿ã°ã®å 容ã¯å¤é¨ãã¡ã¤ã«ã«ç§»ããjavascript: URLã¨<a ... onclick="[JAVASCRIPT]"> ã¯é©åãªaddEventListenerå¼åºãã§ç½®ãæããå¿ è¦ãããã¾ããä¾ãã°ã次ã®ãããªã³ã¼ãã¯
<script> function doAmazingThings() { alert('YOU AM AMAZING!'); } </script> <button onclick='doAmazingThings();'>Am I amazing?</button>
次ã®ããã«æ¸ãæãããã¨ã«ãªãã§ãããã
<!-- amazing.html --> <script src='amazing.js'></script> <button id='amazing'>Am I amazing?</button>
// amazing.js function doAmazingThings() { alert('YOU AM AMAZING!'); } document.addEventListener('DOMContentReady', function () { document.getElementById('amazing') .addEventListener('click', doAmazingThings); });
æ¸ãæããããã³ã¼ãã«ã¯CSPã«æ²¿ã£ã¦ãããã¨ä»¥ä¸ã«ããããã®å©ç¹ãããã¾ããCSPã使ã£ã¦ãããã©ããã«é¢ãããããã§ã«ããã¯ãã¹ããã©ã¯ãã£ã¹ã§ããã¤ã³ã©ã¤ã³JavaScriptã¯æ§é ãæ¯ãèããå ããæ¹æ³ã¨ãã¦æ±ºãã¦æ¡ç¨ããã¹ãã§ã¯ããã¾ãããå¤é¨ãªã½ã¼ã¹ã®æ¹ããã©ã¦ã¶ã«åã£ã¦ã¯ãã£ãã·ã¥ã容æã§ãéçºè ã«ã¨ã£ã¦ãããç解ãããããã³ã³ãã¤ã«ããããã¡ã¤ãæå¹ã«åãã¾ããã³ã¼ããå¤é¨ãªã½ã¼ã¹ã«ç§»ãã°ãããã ãã§ããããã³ã¼ãã«ãªãã§ãããã
ã¤ã³ã©ã¤ã³ã¹ã¿ã¤ã«ãåæ§ã®æ±ãã§ããCSSãå¯è½ã«ãããã¾ãã¾ãª非常に巧妙なãã¼ã¿ã®æãåºããé²ãããã«ãstyleå±æ§ãstyleã¿ã°ãå¤é¨ã¹ã¿ã¤ã«ã·ã¼ãã«ç§»ãã¹ãã§ãã
ããæ¬å½ã«ã©ããã¦ãã¤ã³ã©ã¤ã³ã¹ã¯ãªãããã¹ã¿ã¤ã«ãå¿ è¦ãªã®ã§ããã°ãscript-srcãstyle-srcãã£ã¬ã¯ãã£ãã®è¨±å¯ãããã½ã¼ã¹ã¨ãã¦'unsafe-inline'ã追å ããã°å®ç¾ã§ãã¾ããããããªãã¹ãé¿ãã¾ããããã¤ã³ã©ã¤ã³ã¹ã¯ãªãããç¦æ¢ãããã¨ã¯CSPãæä¾ããã»ãã¥ãªãã£ä¸æã大ããªåå©ãªã®ã§ããã¤ã³ã©ã¤ã³ã¹ã¿ã¤ã«ãç¦æ¢ãããã¨ãåæ§ã«ããªãã®ã¢ããªã±ã¼ã·ã§ã³ãå¼·åºã«ããã§ããããå ¨ã¦ã®ã³ã¼ããã¤ã³ã©ã¤ã³ã§ã¯ãªããã¦æ£ããåãã¨ç¢ºèªãããã¨ã¯å°ãæéããããã¾ãããããããã¯å®è¡ãã価å¤ã®ãããã¬ã¼ããªãã§ãã
EVALã
æ»æè ãã¹ã¯ãªãããç´æ¥åãè¾¼ããªãã¨ãã¦ããããªãã®ã¢ããªã±ã¼ã·ã§ã³ããªãã¨ãé¨ãã¦ãã ã®æååãå®è¡å¯è½ãªJavaScriptã«å¤æãããæãããã«åä½ããããã¨ã¯å¯è½ããããã¾ãããeval()ãnew Function()ãsetTimeout([string], ...)ãsetInterval([string], ...)ãªã©ã¯å ¨ã¦æªæã®ããä½ããå®è¡ãããã¨ã«ãªããããããªãæååãæµãè¾¼ã¾ããåªä»ã«å©ç¨ãããå¯è½æ§ãããã¾ãããã®ãªã¹ã¯ã«å¯¾ããCSPã®ããã©ã«ãã®åå¿ã¯ãé©ãã¾ã§ããªãããããã®åªä»ç©ãå ¨ã¦å®å ¨ã«ãããã¯ãã¾ãã
ããã¯ããªããã¢ããªã±ã¼ã·ã§ã³ãä½ãä¸ã§ã¡ãã£ã¨ããã¤ã³ãã¯ããããã§ãããã
JSONã¯ãevalã«é ¼ãã®ã§ã¯ãªããçµã¿è¾¼ã¿ã®JSON.parseã使ã£ã¦ãã¼ã¹ãã¦ãã ããããã£ãã£ãã®JSONæä½ã¯IE8以降の全てのブラウザã§å©ç¨å¯è½ã§ãå®å ¨ã«å®å ¨ã§ãã
ç¾å¨ä½¿ç¨ãã¦ããå ¨ã¦ã®setTimeoutãsetIntervalã¯æååã§ã¯ãªãã¤ã³ã©ã¤ã³é¢æ°ãå©ç¨ããããã«å¤æ´ãã¦ãã ãããä¾ãã°
setTimeout("document.querySelector('a').style.display = 'none';", 10);
ã¯æ¬¡ã®ããã«æ¸ãç´ãã¨ããã§ãããã
setTimeout(function () { document.querySelector('a').style.display = 'none'; }, 10);
å®è¡æã®ã¤ã³ã©ã¤ã³ãã³ãã¬ã¼ãã¯é¿ãã¦ãã ãããå¤ãã®ãã³ãã¬ã¼ãã©ã¤ãã©ãªã¯å®è¡æã«ãã³ãã¬ã¼ããé«éã«çæããããã«new Function()ã大éã«ä½¿ç¨ãã¦ãã¾ããåçããã°ã©ãã³ã°ãå©ç¨ããæ´è½ãã¢ããªã±ã¼ã·ã§ã³ããããã¾ããããæªæã®ããæååãè©ä¾¡ãããã¨ãããªã¹ã¯ãæãã¾ããããã¤ãã®ãã¬ã¼ã ã¯ã¼ã¯ã¯CSPãããã©ã«ãã§ãµãã¼ããã¦ãã¦ãevalã使ç¨ããªãé å¼·ãªãã¼ãµã¼ã代ããã«å©ç¨ã§ãã¾ããAngularJSのng-cspディレクティブã¯ãã®ããä¾ã®ä¸ã¤ã§ãã
ãããé¸æãããã³ãã¬ã¼ãè¨èªã§ï¼ä¾ãã°Handlebarsのようにï¼ããªã³ã³ãã¤ã«ãå©ç¨å¯è½ãªãããããå©ç¨ããã»ãããããããã¾ãããå®è¡æå¤æãã©ããªã«é«éåããã¨ãã¦ãã¦ã¼ã¶ã¼ä½é¨ã¨ãã観ç¹ã§ã¯ããªã³ã³ãã¤ã«ãããã³ãã¬ã¼ãã«ã¯ããªããªãã§ããããããã¦å®å ¨æ§ãããé«ã¾ãã¾ããå®ç§ã§ãããããevalã¾ãã¯ãã®ä»ã®æåå-JavaScriptå¤æã®åé¡ãããªãã®ã¢ããªã±ã¼ã·ã§ã³ã«åã£ã¦ã©ããããããªãæ¬è³ªçãªé¨åãå ãã¦ããã®ã§ããã°ãscript-srcãã£ã¬ã¯ãã£ãã®è¨±å¯ãããã½ã¼ã¹ã¨ãã¦'unsafe-eval'ã追å ãã¦å©ç¨ã許å¯ãããã¨ãã§ãã¾ããããããå ç¨ãæ¸ããããã«ãããã¯ããªãã§ãã ãããæååã®å®è¡ãç¦æ¢ãããã¨ããæ»æè ãããªãã®ãµã¤ãã§è¨±å¯ããã¦ããªãã³ã¼ããå®è¡ãããã¨ãå°é£ã«ããä¸çªã®æ¹æ³ã§ãã
ã¬ãã¼ã
ä¿¡ç¨ã§ããªããªã½ã¼ã¹ãã¯ã©ã¤ã¢ã³ããµã¤ãã§ãããã¯ããã¨ããCSPã®æ©è½ã¯ã¦ã¼ã¶ã¼ã«ã¨ã£ã¦å¤§åå©ã§ãããå ãã¦ãµã¼ãã¼ã«ãªãããã®éç¥ãããã°ãæªæã®ããã³ã¼ããåãè¾¼ã¾ãããããªãã°ãè¦ã¤ãã¦éæ²»ã§ãé常ã«æçã§ãããããã®ãããªç®çã§ãJSONå½¢å¼ã®éåã¬ãã¼ããreport-uriãã£ã¬ã¯ãã£ãã§æå®ããå ´æã«POSTããããã«ãã©ã¦ã¶ã«æ¯æã§ãã¾ãã
Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
ãã®ã¬ãã¼ãã¯æ¬¡ã®ãããªå½¢å¼ã«ãªãã¾ãã
{ "csp-report": { "document-uri": "http://example.org/page.html", "referrer": "http://evil.example.com/", "blocked-uri": "http://evil.example.com/evil.js", "violated-directive": "script-src 'self' https://apis.google.com", "original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser" } }
ããã«ã¯éåãçºçãããã¼ã¸ï¼document-uriï¼ããã¼ã¸ã®ãªãã¡ã©ï¼æ³¨: referrerã¯ãã¹ã¹ãã«ã§ã¯ããã¾ããï¼ããã¼ã¸ã®ããªã·ã¼ã«éåãããªã½ã¼ã¹ï¼blocked-uriï¼ãéåããããã£ã¬ã¯ãã£ãï¼violated-directiveï¼ããã¼ã¸ã®ããªã·ã¼å ¨ä½ï¼original-policyï¼ã¨ãã£ããéåã®åå ã追跡ããã®ã«ååãªæ å ±ãå«ã¾ãã¦ãã¾ãã
ã¬ãã¼ãã®ã¿
CSPãå§ããã«å½ãã£ã¦ãã¦ã¼ã¶ã¼ã«å³æ ¼ãªããªã·ã¼ãé©ç¨ããåã«ç¾å¨ã®ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ããã¡ãã¨ææ¡ãã¦ããããã¨æããã®ã¯å½ç¶ã§ããé©ç¨ã®è¶³ãããã¨ãã¦ããã©ã¦ã¶ã«ããªã·ã¼ãã¢ãã¿ãã¦éåãã¬ãã¼ãã¯ããããã©ãå¶éã¯èª²ããªãããã«æ示ãããã¨ãã§ãã¾ããContent-Security-Policyããããéã代ããã«Content-Security-Policy-Report-Onlyããããéã£ã¦ãã ããã
Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
report-onlyã¢ã¼ãã§æå®ãããããªã·ã¼ã¯å¶éãã¦ããªã½ã¼ã¹ãä¸åãããã¯ãã¾ããããéåãããã°æå®ããå ´æã«ã¬ãã¼ããéãã¾ãã両æ¹ã®ããããéããããããªã·ã¼ã¯å®éã«é©ç¨ããããä¸æ¹ã¯ã¢ãã¿ããã ãã¨ãããã¨ãå¯è½ã§ããããã¯ã¢ããªã±ã¼ã·ã§ã³ã®CSPãå¤æ´ããå ´åã®å¹æã測å®ããããæ¹æ³ã§ããæ°ããããªã·ã¼ã®ã¬ãã¼ããæå¹ã«ãã¦éåã¬ãã¼ããåèã«ãã°ãä¿®æ£ããå¹æã«ç´å¾ã§ãããæ°ããããªã·ã¼ã®é©ç¨ãéå§ããã°ããã®ã§ãã
å®éã®å©ç¨ä¾
CSPã¯Chrome 16以ä¸ã¨Firefox 4以ä¸ã§å©ç¨å¯è½ã§ãIE 10ã§å°ãªãã¨ãéå®çã«ã¯ãµãã¼ããããã¨æå¾ ããã¾ããSafariã¯ç¾å¨ã®å®è£ ã«ã¯å«ã¾ãã¦ãã¾ããããWebKit nightliesã§ã¯Chromeã¨åæ§ã«åä½ãã¦ãã¦ãSafariã®æ¬¡ã®ã¤ãã¬ã¼ã·ã§ã³ã«å«ã¾ããã¨æå¾ ã§ãã¾ããTwitterãªã©ã®ãããªå¤ãã®ãµã¤ãããã®ãããããã§ã«çºè¡ãã¦ãã¦ï¼Twitterのケーススタディã¯èªã価å¤ãããã¾ãï¼ããã®æ¨æºãããªãã®ãµã¤ãã§æ¡ç¨ããæºåã¯ååã«æ´ã£ã¦ããã¨è¨ãã¾ãã
èªèº«ã®ã¢ããªã±ã¼ã·ã§ã³ã®ããã®ããªã·ã¼ãä½æããããã®æåã®ã¹ãããã¯ãå®éã«ãã¼ãããã¦ãããªã½ã¼ã¹ãæ´ãåºããã¨ã§ããã¢ããªã®ãªã½ã¼ã¹ãã©ã®ããã«é¢é£ãã¦ãããææ¡ã§ããã¨æããããè¦æ±ã«å¾ã£ã¦ããªã·ã¼ãçå®ãã¾ããCSPã®ä¿è·å¶ç´ãæãæå¹ã«åãããæ¹æ³ãè¦ã¤ããããã«ã¾ãã¯æ¨æºçãªã¦ã¼ã¹ã±ã¼ã¹ãçºãã¦ã¿ã¾ãããã
ã¦ã¼ã¹ã±ã¼ã¹ #1: ã½ã¼ã·ã£ã«ã¡ãã£ã¢ã¦ã£ã¸ã§ãã
- Googleã®+1ボタンã¯https://apis.google.comã®ã¹ã¯ãªãããå«ã¿ãhttps://plusone.google.comã®iframeãåãè¾¼ã¿ã¾ãããã¿ã³ãåãè¾¼ãã«ã¯ãããäºã¤ã®ãªãªã¸ã³ãããªã·ã¼ã«å«ããå¿ è¦ãããã¾ããæå°éã®ããªã·ã¼ã¯æ¬¡ã®ããã«ãªãã§ããããscript-src https://apis.google.com; frame-src https://plusone.google.comãããã«Googleãæä¾ããJavaScriptã®ã¹ããããã¯å¤é¨JavaScriptãã¡ã¤ã«ã«æ¸ããªããã°ããã¾ããã
- Facebookã®Likeボタンã¯ããããã®å®è£ ãªãã·ã§ã³ãããã¾ããããããã¯ãããªãã®ãµã¤ãã®ä»ã®é¨åãå®å ¨ã«ä¿ã¤ããã«iframeãã¼ã¸ã§ã³ã使ãç¶ãããã¨ã§ãããããé©åã«æ©è½ãããããã«ã¯frame-src https://facebook.comãã£ã¬ã¯ãã£ããå¿ è¦ã§ããããã©ã«ãã§ã¯Facebookãæä¾ããiframeã®ã³ã¼ãã¯//facebook.comããã®ç¸å¯¾URLã§ãã¼ãããããã¨ã«æ³¨æãå¿ è¦ã§ããæ示çã«HTTP:ã¤ã¾ãhttps://facebook.comãæå®ããããå¤æ´ãã¦ãã ãããå¿ è¦ã®ãªãã¨ããã§HTTPã使ç¨ããçç±ã¯ããã¾ããã
- Twitterã®Tweetボタンã¯å ±ã«https://platform.twitter.comï¼å ã»ã©ã¨åæ§ã«Tiwtterãããã©ã«ãã§ç¸å¯¾URLã表示ããã®ã§ããã¼ã«ã«ã«ã³ãã¼ï¼ãã¼ã¹ããããã¨HTTPSãæå®ããããæ¸ãæãã¦ãã ããï¼ã§ãã¹ããããã¹ã¯ãªããã¨ãã¬ã¼ã ã®ã¢ã¯ã»ã¹ã«ä¾åãã¾ããscript-src https://platform.twitter.com; frame-src https://platform.twitter.comã¨æå®ããTwitterãæä¾ããJavaScriptã¹ãããããå¤é¨JavaScriptãã¡ã¤ã«ã«è¨è¿°ãã¾ãã
- ãã®ä»ã®ãã©ãããã©ã¼ã ãåæ§ãªè¦æ±ããããåæ§ã«æå®ããã°ããã§ããããã¾ãdefault-srcã¯'none'ã«è¨å®ããã³ã³ã½ã¼ã«ãè¦ãªããã¦ã£ã¸ã§ãããåä½ãããã®ã«å¿ è¦ãªãªã½ã¼ã¹ã決å®ããã°ããã§ãããã
è¤æ°ã®ã¦ã£ã¸ã§ããã使ç¨ããã®ãç°¡åã§ããåã«ããªã·ã¼ãã£ã¬ã¯ãã£ããä¸ã¤ã«ã¾ã¨ãã¦ãã ããããã®éä¸ã¤ã®ã¿ã¤ãã®ãªã½ã¼ã¹ã¯ä¸ã¤ã®ãã£ã¬ã¯ãã£ãã«çµ±åãããã¨ãå¿ããªãããã«ãã¾ããããããä¸è¨ã®3ã¤ããã¹ã¦ä½¿ç¨ããã®ã§ããã°ããªã·ã¼ã¯æ¬¡ã®ããã«ãªãã¾ãã
script-src https://apis.google.com https://platform.twitter.com; frame-src https://plusone.google.com https://facebook.com https://platform.twitter.com
ã¦ã¼ã¹ã±ã¼ã¹ #2: å°é
ä»åº¦ã¯éè¡ã®ãµã¤ããéå¶ãã¦ããã¨ãã¦ãèªåã§è¨±å¯ãããªã½ã¼ã¹ã ãããã¼ãã§ãããã¨ãä¿è¨¼ãããã¨èããã¨ãã¾ãããã®ã·ããªãªã§ã¯ããã©ã«ãã®ããªã·ã¼ã¨ãã¦å ¨ã¦ãå®ç§ã«ãããã¯ããï¼default-src 'none'ï¼ã¨ããããéå§ãã¾ãã
éè¡ã¯å ¨ã¦ã®ç»åãã¹ã¿ã¤ã«ãã¹ã¯ãªãããhttps://cdn.mybank.netã«ããCDNãããã¼ãããæ§ã ãªãã¼ã¿ãåå¾ããããã«https://api.mybank.com/ã«XHRã§æ¥ç¶ãããã®ã¨ãã¾ãããã¬ã¼ã ã¯ä½¿ç¨ããã¾ããããã¼ã«ã«ã«ãããã¼ã¸ï¼no third-party originsï¼ã ãã表示ãã¾ããFlashãã¦ã§ããã©ã³ãããªã«ãå©ç¨ãã¾ããããã®ã·ããªãªã§éä¿¡ãããã¨ã«ãªããã£ã¨ãå³æ ¼ãªãããã¯æ¬¡ã®ãããªãã®ã§ãã
Content-Security-Policy: default-src 'none'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; frame-src 'self'
ã¦ã¼ã¹ã±ã¼ã¹ #3: SSLã®ã¿
çµå©æ輪ã®ãã£ã¹ã«ãã·ã§ã³ãã©ã¼ã©ã ã®ç®¡çè ãå ¨ã¦ã®ãªã½ã¼ã¹ã¯ã»ãã¥ã¢ãã£ãã«çµç±ã§ã®ã¿ãã¼ãããããã¨ãä¿è¨¼ãããããã³ã¼ãã¯ã»ã¨ãã©æ¸ããããªãã¨èãã¦ããã¨ãã¾ããã¤ã³ã©ã¤ã³ã®ã¹ã¯ãªããã¨ã¹ã¿ã¤ã«ã§æº¢ãã¦ãããµã¼ããã¼ãã£è£½ã®ãã©ã¼ã©ã ã½ããã¦ã§ã¢ã®å¤§é¨åãæ¸ãæããã¨ããã®ã¯å½¼ã®è½åãè¶ ãã¦ããã®ã§ããããããå ´åã次ã®ããªã·ã¼ãå¹æçã§ãããã
Content-Security-Policy: default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'
default-srcã§https:ãæå®ããã¨ãã¦ããã¹ã¯ãªããã¨ã¹ã¿ã¤ã«ã®ãã£ã¬ã¯ãã£ãã§èªåçã«ãã®ã½ã¼ã¹ãç¶æ¿ãããããã§ã¯ããã¾ãããç¹å®ã®ãªã½ã¼ã¹ã¿ã¤ãã®ããã®ãã£ã¬ã¯ãã£ãã¯ããã©ã«ããå®å ¨ã«ä¸æ¸ããã¾ãã
å°æ¥
W3Cã®Web Application Security Working Groupã¯Content Security Policyã®ä½¿ç¨ã®è©³ç´°ã«ã¤ãã¦ä½æ¥ãç¶ãã¦ãã¦ããã®è¨äºã§æ¦è¦ã説æããæ©è½ãå«ã¾ãããã¼ã¸ã§ã³1.0ã¯最終勧告寸前ã§ãããããã°ã«ã¼ãã¯ãã®ææã«å®ä½ãã¦ããããã§ã¯ãªãCSP 1.1ã«ã¤ãã¦ä»ãpublic-webappsec@メーリングリストã§æ´»çºã«è°è«ããã¦ãã¦ããã©ã¦ã¶ãã³ãã¼ãå®è£ ãåä¸ãããããã«懸命に作業していますã
CSP 1.1ã¯æ§æ³æ®µéã§ããããã¤ãã®é¢ç½ãææ¡ãããããã®ãã¡ããã¤ãã¯ããã§åãä¸ãã価å¤ãããã§ããã:
- metaã¿ã°ãå©ç¨ããããªã·ã¼æ³¨å
¥: CSPã¯HTTPãããã§é
å¸ããããã«æ³å®ããã¦ãã¾ãããããªã·ã¼ããã¼ã¸ã«ç´æ¥ããããã¯ã¹ã¯ãªããã«ãã£ã¦ãã¼ã¯ã¢ããã¨ãã¦è¨å®ã§ããã°å¸¸ã«æç¨ã§ããããããªã·ã¼ãé©ç¨ãããããã¥ã¡ã³ãã¨åãããã¥ã¡ã³ãã«ããªã·ã¼ãæ¸ãã¹ããã©ããã«ã¤ãã¦å¥å
¨ãªè°è«ãè¡ããã¦ãã¾ãããåå確ããªã¦ã¼ã¹ã±ã¼ã¹ããã次ã®ã¤ãã¬ã¼ã·ã§ã³ã«çµã¿è¾¼ãã§ããããã§ãã仕様のmeta要素に関する部分ã¯WebKitã§æ¢ã«æ©è½ãå®è£
ããã¦ããã®ã§ãChromeã§å®éã«è©¦ããã¨ãåºæ¥ã¾ãã<meta http-equiv="X-WebKit-CSP" content="[POLICY GOES HERE]">ãããã¥ã¡ã³ãã®ãããã«æ¸ãã°ãã¾ãåãã§ãããã
ã¹ã¯ãªããã§metaã¿ã°ã追å ããã°å®è¡æã«ããªã·ã¼ã追å ãããã¨ãã§ãã¾ããå¿ è¦ãªå ¨ã¦ã®ãªã½ã¼ã¹ããã¼ããçµãã£ã¦ããé©åãªããªã·ã¼ãè¨å®ããããã¼ãã¢ãããããã®ãå®å ¨ã«å¶éãããã¢ããªã±ã¼ã·ã§ã³ãå®ç¾ããããæ段ã§ããããããã«ããå®å ¨ã«ã»ãã¥ã¢ãªãµã¤ãï¼ä¸æçã«é大ãªæ»æãåããå¯è½æ§ãããï¼ãæä¾ã§ãã¾ããããHTTPããããé©ç¨ããåã«CSPã®æ©æµãããããããããã¨ãã§ãã¾ãã - DOM API: ãããã®æ©è½ã次ã®ã¤ãã¬ã¼ã·ã§ã³ã«å ¥ãã°ããã¼ã¸ã®ç¾å¨ã®ããªã·ã¼ãJavaScriptã§åå¾ã§ããããã«ãªãã¾ããããã«ãã£ã¦å®è¡æã«å®è£ ã決å®ããããã³ã¼ãã®ç°å¢ã«å¿ãã¦æ£ããä½ããè¨å®ãããã¨ãã§ãã¾ããä¾ãã°eval()ãå®è¡å¯è½ãªãä½ããã®æ©è½ãç°ãªãæ¹æ³ã§å®è£ ã§ããããç¥ãã¾ãããããã¯ç¹ã«ãã¬ã¼ã ã¯ã¼ã¯ã®ä½è ã«ã¨ã£ã¦æç¨ã§ãããã ããAPIã®ä»æ§ã¯ã¾ã é常ã«ä¸å®å®ãªã®ã§ãææ°ã®ã¤ãã¬ã¼ã·ã§ã³ã«ã¤ãã¦ç¥ãã«ã¯ドラフト仕様の「Script Interfaces」の節ãåç §ãã¦ãã ããã
- æ°ãããã£ã¬ã¯ãã£ã: æ§ã ãªæ°ãããã£ã¬ã¯ãã£ããè°è«ããã¦ãã¾ããscript-nonceã¯æ示çã«æå®ãããè¦ç´ ã«ã¤ãã¦ã ãã¤ã³ã©ã¤ã³ã¹ã¯ãªãããå®è¡ã§ãã¾ããplugin-typesã¯ãã©ã°ã¤ã³ããã¼ãã§ããã³ã³ãã³ãã®MIMEã¿ã¤ããå¶éãã¾ããform-actionã¯ç¹å®ã®ãªãªã¸ã³ã«ã ãformããµããããã§ãã¾ãããã以å¤ã«ãããã¾ããã現在のところ仕様があいまいですã
ãããã®æ°ããæ©è½ã«é¢ããè°è«ã«èå³ãããã°ãメーリングリストを眺めるかãå®éã«åå ãã¦ãã ããã