ã¯ããã«
ä¹ ãã¶ãã«æåã³ã¼ãã®XSSã®è©±ãçãä¸ãã£ã¦ãã®ã§ãä¹ ãã¶ã(3年以ä¸ã¶ãï¼)ã«ããã°ãæ¸ãã¾ãããããã¾ãã¦ããã§ã¨ããããã¾ããä»å¹´ã¨æ¥å¹´ã¨ãã®ããã3å¹´ããããããããé¡ããã¾ãã
HTTPã¬ã¹ãã³ã¹ãããã¼ãHTML metaã¿ã°ã§ã®æåã¨ã³ã³ã¼ãã£ã³ã°åã®æå®ããªãå ´åã«æ»æè ãISO-2022-JPç¹æã®ãã¤ãåãHTMLå ã«åãè¾¼ããã¨ã§ãã©ã¦ã¶ã¼ããã®ã³ã³ãã³ããISO-2022-JPã§ããã¨èª¤èªããããã®ã¨ãã«åçã«JavaScriptå ã®æååãçæãã¦ããã¨ããã¨US-ASCIIã§ããããã¯ã¹ã©ãã·ã¥ã§ã¯ãªãJIS X0201ã®åè¨å·ãæ¿å ¥ãããã¨ã§ã¨ã¹ã±ã¼ããç¡å¹ã«ãªããçµæã¨ãã¦JavaScriptã®æååå¤ã«æ»æè ã¯ã³ã¼ããç½®ããã¨ãã§ããã¨ããã®ã徳丸ããã®æ¸ããã¦ããè¨äºã«ãªãã¾ãã
対çã¨ãã¦ã¯ã徳丸ããã®è¨äºã«ããã¨ããHTTPã¬ã¹ãã³ã¹ãããã¼ãHTML metaã¿ã°ã§æåã¨ã³ã³ã¼ãã£ã³ã°åãæè¨ããããã«ããã¨ãã以å¤ã«ãããããããã¨æ³å®ãããæåã¨ã³ã³ã¼ãã£ã³ã°ã«ç¹æã®ãã¾ããªãæååãHTMLã®å é ä»è¿ã«åãè¾¼ãã§ããã¨ããå¹æãããããããã¾ããï¼æªç¢ºèªï¼ã
ãã®è¨äºã§ã¯ãJavaScriptæååã«ãããåè¨å·ã®ã¨ã¹ã±ã¼ã以å¤ã®æ»æãã¿ã¼ã³ãå°ãæ¤è¨ãã¦ã¿ããã¨æãã¾ãã
ãªãæ¤è¨¼ã«ã¯Windowsçã®Google Chrome 131.0.6778.205ã使ç¨ãã¦ãã¾ããã³ã³ãã³ããISO-2022-JPã¨èª¤èªãããã«ã¯ä»ã®ãã©ã¦ã¶ã¼ã§ã¯è¥å¹²ã®èª¿æ´ãå¿ è¦ã¨ãªãã¾ãããæ¬ç¨¿ã§ã¯çç¥ãã¾ãã
1. metaã¿ã°ã«ããContent Security Policyæå®ã®ãã¤ãã¹
以ä¸ã®ãããªHTMLããã£ãã¨ãã¾ãã å è¿°ã®éããHTTPã¬ã¹ãã³ã¹ãããã¼ãHTML metaã¿ã°ã«ããæåã¨ã³ã³ã¼ãã£ã³ã°åã®æå®ã¯ãªããã®ã¨ãã¾ãã
<!doctype html>
<html>
<head>
<title>[ããã«ã¿ã¤ãã«ãå
¥ãã¾ã]</title>
<meta http-equiv="content-security-policy" content="default-src 'none'">
</head>
<body>
<div>
[ããã«ã¡ãã»ã¼ã¸ãå
¥ãã¾ã]
</div>
</body>
</html>
metaã¿ã°ã«ã¦CSPã¨ãã¦`default-src 'none'`ãæå®ããã¦ãã¾ãã ã¾ããã¿ã¤ãã«é¨åã«ã¯HTMLã¨ãã¦ã¨ã¹ã±ã¼ãæ¸ã¿ã®ä»»æã®æååããã¡ãã»ã¼ã¸é¨åã«ã¯ã¨ã¹ã±ã¼ãããã¦ããªãä»»æã®æååãããããæ¿å ¥ã§ãããã®ã¨ãã¾ãã ã¡ãã»ã¼ã¸é¨åã¯ã¨ã¹ã±ã¼ãããã¦ããªãã®ã§XSSå¯è½ã§ãããmetaã¿ã°ã§ã®CSPãå¹ãã¦ããããã¹ã¯ãªããã®å®è¡ã¯ã§ãã¾ããã
æ»æè ã¯ãã®ã¨ããã¿ã¤ãã«é¨åã«ã(0x1B)(0x24)(0x42)(0x24)(0x24)ãã¨ãããã¤ãåããã¡ãã»ã¼ã¸é¨åã«ã¯ã(0x1B)(0x28)(0x42)</title><script>...ãã¨ããæååãä¸ãã¾ãã
<!doctype html>
<html>
<head>
<title>(0x1B)(0x24)(0x42)(0x24)(0x24)</title>
<meta http-equiv="content-security-policy" content="default-src 'none'">
</head>
<body>
<div>
(0x1B)(0x28)(0x42)</title><script>...
</div>
</body>
</html>
ã¿ã¤ãã«é¨åã®å é 3ãã¤ã 0x1B 0x24 0x42 ã¯ãã以éã®æååãJIS X0208-1983ã¤ã¾ãæ¥æ¬èªå ¨è§æååã¸ã¨åãæ¿ããããã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã§ãISO-2022-JPã¨ãã©ã¦ã¶ã¼ã«å¤å®ãããããããããã«ç¶ã2ãã¤ã0x24 0x24ãæ¥æ¬èªæåã®ããããä¸ãã¦ãã¾ãã
ããã«ãããISO-2022-JPã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãæ¹ãã¦è¦ã¤ãããªãéãã¯JIS X0208-1983ã¨ãã¦titleã¿ã°å ãã解éããã</title> ããã®å¾ç¶ã® <meta> ã¯ã¿ã°ã¨ãã¦è§£éãããªããªãã¾ãã
æ»æè ãã¡ãã»ã¼ã¸é¨åã¨ãã¦æå®ããæååã®å é 3ãã¤ã㯠0x1B 0x28 0x42 ã§ãããã¯å¾ç¶ã®æååãUS-ASCIIã«åãæ¿ããããã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã§ããã§ãã®ã§ãã¡ãã»ã¼ã¸é¨åã¨ãã¦åãè¾¼ã¾ãã以éã®æååã¯ãã©ã¦ã¶ã¼ã«ã¯US-ASCIIã¨ãã¦è§£éããã¾ãããã®ã¡ãã»ã¼ã¸é¨åã¯XSSå¯è½ã§ãã®ã§ãæ»æè ã¯ããã§titleã¿ã°ãéããããã® </title> ãã¹ã¯ãªããã¨ãã¦å®è¡ããããã® <script> ãåãè¾¼ã¿ãç¡äºã«CSPããã¤ãã¹ãã¦ä»»æã®ã¹ã¯ãªããå®è¡ã«ã¤ãªãããã¨ãã§ãã¾ããã
2. å±æ§å¤ãããã¹ããã¼ãã®ã¨ã¹ã±ã¼ãã®ãã¤ãã¹
以ä¸ã®ãããªHTMLããã£ãã¨ãã¾ãã
<!doctype html>
<html>
<body>
<input type="text" value="[ããã«å±æ§å¤ãå
¥ãã¾ã]">
[ããã«ã¡ãã»ã¼ã¸ãå
¥ãã¾ã]
</body>
</html>
å±æ§å¤ã¯ããã«ã¯ã©ã¼ã `"` ã®ã¿ãã¨ã¹ã±ã¼ãããã¦æ¿å ¥ãããã¡ãã»ã¼ã¸é¨å㯠`>` `<` `&` ã®3æåã®ã¿ãã¨ã¹ã±ã¼ãããããã®ã¨ãã¾ããã¨ã¹ã±ã¼ãããããã®é¢æ°ãJavaScriptã§æ¸ãã¨ããã以ä¸ã®ãããªãã®ã§ãã
const escapeAttributeValue = (value) => {
return value.replace(/"/g, """);
};
const escapeMessage = (text) => {
return text
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
};
å±æ§å¤å ã® `"` ãããã¹ããã¼ãå ã® `>` `<` ã¯ã¨ã¹ã±ã¼ãããã¾ãã®ã§ãé常ã§ããã°XSSã¯ä¸å¯è½ã§ãã
ããã§ãæ»æè ã¯å±æ§å¤ã«ã¯ã(0x1B)(0x24)(0x42)ãããã¡ãã»ã¼ã¸ã«ã¯ã(0x1B)(0x28)(0x42)"onmouseover=alert(1)ãã¨ããæååãä¸ãã¾ãã
<!doctype html>
<html>
<body>
<input type="text" value="(0x1B)(0x24)(0x42)">
(0x1B)(0x28)(0x42)"onmouseover=alert(1)
</body>
</html>
å±æ§å¤ã®3ãã¤ã 0x1B 0x24 0x42 ã¯å¾ç¶ã®æååãJIS X0208-1983ã¤ã¾ãæ¥æ¬èªå ¨è§æååã¸ã¨åãæ¿ããããã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã§ããã§ãã®ã§ãinputã¿ã°å ã®å±æ§å¤ãéãã `"` ãinputã¿ã°èªèº«ãéãã `>` ã¯è§£éãããªããã¨ã«ãªãã¾ãã ããã«ç¶ããã¡ãã»ã¼ã¸é¨åã®3ãã¤ã 0x1B 0x28 0x42 ã¯å¾ç¶ã®æååãUS-ASCIIã«åãæ¿ããã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ã§ãããã«ç¶ã `"` ã«ãã£ã¦valueå±æ§ãéããããonmouseoverå±æ§ãæå¹ã¨ãªããã¨ã§æ»æè ã®æ¿å ¥ããJavaScriptãåããã¨ã«ãªãã¾ãã
ã¾ã¨ã
ä¸ã«æããä¾ã¯ãäºã¤ã¨ãç¾å®ã«ã¯ãªããªãééãã«ããã±ã¼ã¹ã ã¨ã¯æãã¾ããã¨ã¯ãããISO-2022-JPã¨è§£éããããã¨ã«ããXSSããJavaScriptå ã®æååãçæãã¦ãããã¨ããå ´åã«éå®ãããã®ãã¨ããã¨ããããããã§ã¯ãªãã¨ãããã¨ã§ãã¡ãã£ã¨ã¾ã¨ãã¦ã¿ã¾ããã
ãããã¨ããæ»æè ã®æ¿å ¥ã§ããæååã2ãæã»2種é¡å¿ è¦ã§ããããããããã¨å·¥å¤«ããã°2ãæã«åãæååãåºåãããã¨ãã«ãXSSå¯è½ã¨ããã±ã¼ã¹ãããããããã¾ããï¼è¦èª¿æ»ï¼ãæåã³ã¼ãå¨è¾ºã®è¤éãã¯ãããããã§ããã