Reactã®experimental_taintUniqueValueãæ¢æ±ããŸããããããã¯ãããŒã¿ã®å®å šã§ãªã䜿çšãé²ããã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ã軜æžãã匷åãªã»ãã¥ãªãã£åŒ·åæ©èœã§ãã
React experimental_taintUniqueValue: å æ¬çãªã»ãã¥ãªãã£åŒ·åã¬ã€ã
仿¥ã®ãŸããŸãçžäºæ¥ç¶ãããããžã¿ã«ç°å¢ã«ãããŠãWebã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ã¯æéèŠäºé
ã§ããã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒããã®ä»ã®ã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ã¯ãããŒã¿æŒæŽ©ããŠãŒã¶ãŒã¢ã«ãŠã³ãã®äŸµå®³ãè©å€ã®äœäžã«ã€ãªããå¯èœæ§ã®ããé倧ãªè
åšããããããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®åºãæ¡çšãããŠããJavaScriptã©ã€ãã©ãªã§ããReactã¯ããããã®èª²é¡ã«å¯ŸåŠããããã«ç¶ç¶çã«é²åããŠããŸãããã®ææ°ã®é©æ°ã®1ã€ããexperimental_taintUniqueValue
æ©èœã§ããããã¯ãæ±æãããããŒã¿ãå®å
šã§ãªãã³ã³ããã¹ãã§äœ¿çšãããã®ãé²ãããšã«ãããã»ãã¥ãªãã£ã匷åããããã«èšèšãããŠããŸãã
ã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ã®çè§£
experimental_taintUniqueValue
ã®è©³çްã«å
¥ãåã«ãã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ã®æ§è³ªãçè§£ããããšãéèŠã§ãããããã®è匱æ§ã¯ãä¿¡é Œã§ããªãããŒã¿ãã³ãŒããŸãã¯ããŒã¯ã¢ãããšããŠåŸã§è§£éãããæååã«çµã¿èŸŒãŸããå Žåã«çºçããŸããäžè¬çãªäŸãšããŠã¯ã次ã®ãã®ãæããããŸãã
- ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒïŒæªæã®ããJavaScriptã³ãŒããWebãµã€ãã«æ³šå ¥ããæ»æè ããŠãŒã¶ãŒããŒã¿ãçã¿ããŠãŒã¶ãŒãæªæã®ãããµã€ãã«ãªãã€ã¬ã¯ãããããWebãµã€ããæ¹ãããããã§ããããã«ããŸãã
- SQLã€ã³ãžã§ã¯ã·ã§ã³ïŒæªæã®ããSQLã³ãŒããããŒã¿ããŒã¹ã¯ãšãªã«æ³šå ¥ããæ»æè ãæ©å¯ããŒã¿ã«ã¢ã¯ã»ã¹ã倿ŽããŸãã¯åé€ã§ããããã«ããŸãã
- ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ïŒæªæã®ããã³ãã³ããã·ã¹ãã ã®ã³ãã³ãã©ã€ã³ã«æ³šå ¥ããæ»æè ããµãŒããŒã§ä»»æã®ã³ãŒããå®è¡ã§ããããã«ããŸãã
Reactã¯ãããã©ã«ãã§ã¯ãDOMã§ããŒã¿ãã¬ã³ããªã³ã°ãããšãã«ãæœåšçã«æå®³ãªæåãèªåçã«ãšã¹ã±ãŒãããããšã«ãããXSSã«å¯ŸããããçšåºŠã®ä¿è·ãæäŸããŸãããã ããç¹ã«æ¬¡ã®ãããªå Žåã«è匱æ§ãçºçããå¯èœæ§ããããŸãã
- ãŠãŒã¶ãŒå
¥åããçŽæ¥HTMLãã¬ã³ããªã³ã°ããïŒ
dangerouslySetInnerHTML
ã®ãããªé¢æ°ã䜿çšãããšãReactã®çµã¿èŸŒã¿ä¿è·ããã€ãã¹ã§ããŸãã - ãŠãŒã¶ãŒå ¥åããURLãæ§ç¯ããïŒé©åã«ãµãã¿ã€ãºãããŠããªãå ŽåããŠãŒã¶ãŒãæäŸããããŒã¿ãURLã«æ³šå ¥ããããã£ãã·ã³ã°æ»æããã®ä»ã®æªæã®ããæŽ»åã«ã€ãªããå¯èœæ§ããããŸãã
- ãµãŒãããŒãã£ã©ã€ãã©ãªã«ããŒã¿ãæž¡ãïŒãããã®ã©ã€ãã©ãªãä¿¡é Œã§ããªãããŒã¿ãåŠçããããã«èšèšãããŠããªãå Žåãã€ã³ãžã§ã¯ã·ã§ã³æ»æã«å¯ŸããŠè匱ã«ãªãå¯èœæ§ããããŸãã
experimental_taintUniqueValue
ã®ç޹ä»
experimental_taintUniqueValue
ã¯ãéçºè
ãããŒã¿ããæ±æãããæœåšçã«å®å
šã§ãªããã®ãšããŠããŒã¯ã§ããããã«ããReactã®å®éšçãªAPIã§ãããã®ãæ±æãã¯ãã©ã°ãšããŠæ©èœããé©åãªãµãã¿ã€ãºãŸãã¯æ€èšŒãªãã«ãããŒã¿ãç¹å®ã®ã³ã³ããã¹ãã§äœ¿çšãããã¹ãã§ã¯ãªãããšã瀺ããŸããç®çã¯ãéçºè
ã誀ã£ãŠæœåšçã«æå®³ãªããŒã¿ãè匱æ§ãåŒãèµ·ããå¯èœæ§ã®ããæ¹æ³ã§äœ¿çšããããšãé²ãããšã§ãã
ä»çµã¿
åºæ¬çãªã¯ãŒã¯ãããŒã«ã¯ãæ¬¡ã®æé ãå«ãŸããŸãã
- ããŒã¿ã®æ±æïŒããŒã¿ãä¿¡é Œã§ããªããœãŒã¹ïŒäŸïŒãŠãŒã¶ãŒå
¥åãå€éšAPIïŒããã¢ããªã±ãŒã·ã§ã³ã«å
¥ããšã
experimental_taintUniqueValue
ã䜿çšããŠæ±æãããŸãã - æ±æã®äŒæïŒæ±æã¯ãæ±æãããããŒã¿ã«å¯ŸããŠå®è¡ãããæäœãéããŠäŒæããŸããããšãã°ãæ±æãããæååãå¥ã®æååãšé£çµãããšãæ°ããæååãæ±æãããŸãã
- å®å šã§ãªã䜿çšã®æ€åºïŒReactã®ã©ã³ã¿ã€ã ã¯ãæ±æãããããŒã¿ããXSSã«å¯ŸããŠè匱ã«ãªãå¯èœæ§ã®ãã屿§ã®èšå®ãªã©ãæœåšçã«å®å šã§ãªãã³ã³ããã¹ãã§äœ¿çšãããŠãããã©ãããæ€åºããŸãã
- 鲿¢ãŸãã¯èŠåïŒèšå®ãšæœåšçãªè匱æ§ã®æ·±å»åºŠã«å¿ããŠãReactã¯æäœã®çºçã黿¢ããããéçºè ã«èŠåãçºè¡ããŸãã
äŸïŒå±æ§å€ã§ã®XSSã®é²æ¢
ãŠãŒã¶ãŒãæäŸããããŒã¿ã䜿çšããŠã<a>
ã¿ã°ã®href
屿§ãèšå®ããŠããã·ããªãªãèããŠã¿ãŸãããã
function MyComponent({ url }) {
return <a href={url}>Click Here</a>;
}
url
ããããã«æªæã®ããJavaScriptã³ãŒãïŒäŸïŒjavascript:alert('XSS')
ïŒãå«ãŸããŠããå Žåãããã¯XSSè匱æ§ã«ã€ãªããå¯èœæ§ããããŸããexperimental_taintUniqueValue
ã䜿çšãããšãurl
ãããããæ±æã§ããŸãã
import { experimental_taintUniqueValue } from 'react';
function MyComponent({ url }) {
const taintedUrl = experimental_taintUniqueValue(url, 'URL', 'User-provided URL');
return <a href={taintedUrl}>Click Here</a>;
}
ããã§ãReactãæ±æãããtaintedUrl
ãhref
屿§ã®èšå®ã«äœ¿çšãããŠããããšãæ€åºããå Žåãèšå®ã«å¿ããŠãèŠåãçºè¡ããããæäœã黿¢ããããšãã§ããŸããããã¯ãXSSè匱æ§ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
experimental_taintUniqueValue
ã®ãã©ã¡ãŒã¿
experimental_taintUniqueValue
颿°ã¯ã3ã€ã®ãã©ã¡ãŒã¿ãåãå
¥ããŸãã
- valueïŒæ±æããå€ã
- sinkïŒå€ã䜿çšãããŠããã³ã³ããã¹ãã瀺ãæååïŒäŸïŒãURLãããHTMLãïŒãããã¯ãReactãæ±æãããããŒã¿ã«é¢é£ããæœåšçãªãªã¹ã¯ãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
- messageïŒããŒã¿ã®èµ·æºã𿱿ãããçç±ã«ã€ããŠèª¬æãã人éãèªããã¡ãã»ãŒãžãããã¯ããããã°ãšç£æ»ã«åœ¹ç«ã¡ãŸãã
experimental_taintUniqueValue
ã䜿çšããå©ç¹
- ã»ãã¥ãªãã£ã®åŒ·åïŒå®å šã§ãªãã³ã³ããã¹ãã§ã®æ±æãããããŒã¿ã®äœ¿çšãæ€åºãã鲿¢ããããšã«ãããã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- éçºè ã®èªèã®åäžïŒä¿¡é Œã§ããªãããŒã¿ã«é¢é£ããæœåšçãªãªã¹ã¯ã«ã€ããŠãéçºè ã®èªèãé«ããŸãã
- ç£æ»ã®ç°¡çŽ åïŒããŒã¿ã®æ±æå Žæã®æç¢ºãªç£æ»èšŒè·¡ãæäŸããæœåšçãªã»ãã¥ãªãã£åé¡ãç¹å®ããŠå¯ŸåŠããããããŸãã
- éäžã»ãã¥ãªãã£ããªã·ãŒïŒã¢ããªã±ãŒã·ã§ã³å šäœã§é©çšã§ããéäžã»ãã¥ãªãã£ããªã·ãŒã®å®çŸ©ãå¯èœã«ããŸãã
å¶éäºé ãšèæ ®äºé
experimental_taintUniqueValue
ã¯ãé倧ãªã»ãã¥ãªãã£äžã®å©ç¹ãæäŸããŸããããã®å¶éäºé
ãšèæ
®äºé
ãèªèããããšãéèŠã§ãã
- å®éšçAPIïŒå®éšçAPIãšããŠã
experimental_taintUniqueValue
ã¯ãReactã®å°æ¥ã®ããŒãžã§ã³ã§å€æŽãŸãã¯åé€ãããå¯èœæ§ããããŸãã - ããã©ãŒãã³ã¹ãªãŒããŒãããïŒæ±æè¿œè·¡ããã»ã¹ã§ã¯ãç¹ã«å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããçšåºŠã®ããã©ãŒãã³ã¹ãªãŒããŒããããçºçããå¯èœæ§ããããŸãã
- 誀æ€ç¥ïŒ
experimental_taintUniqueValue
ã¯ãå®éã«å®å šãªå Žåã§ããããŒã¿ãæ±æããããã®ãšããŠãã©ã°ãç«ãŠã誀æ€ç¥ãçæããå¯èœæ§ããããŸãã誀æ€ç¥ãæå°éã«æããã«ã¯ãæ éãªèšå®ãšãã¹ããå¿ èŠã§ãã - éçºè
ã®æ¡çšãå¿
èŠïŒ
experimental_taintUniqueValue
ã®å¹æã¯ãéçºè ãä¿¡é Œã§ããªããœãŒã¹ããã®ããŒã¿ãæ±æããããã«ç©æ¥µçã«äœ¿çšããããšã«äŸåããŸãã - äžèœè¬ã§ã¯ãªãïŒ
experimental_taintUniqueValue
ã¯ãå ¥åæ€èšŒãåºåãšã³ã³ãŒãã£ã³ã°ãã»ãã¥ãªãã£ç£æ»ãªã©ãä»ã®ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ã®ä»£æ¿ã§ã¯ãããŸããã
experimental_taintUniqueValue
ã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
experimental_taintUniqueValue
ã®å©ç¹ãæå€§åããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- ãœãŒã¹ã§ããŒã¿ãæ±æããïŒããŒã¿ã®ãããŒã®ã§ããã ãæ©ãæ®µéã§ãçæ³çã«ã¯ä¿¡é Œã§ããªããœãŒã¹ããã¢ããªã±ãŒã·ã§ã³ã«å ¥ã£ããšãã«ãããŒã¿ãæ±æããŸãã
- ç¹å®ã®ã·ã³ã¯å€ã䜿çšããïŒç¹å®ã®ã·ã³ã¯å€ïŒäŸïŒãURLãããHTMLãïŒã䜿çšããŠãããŒã¿ã䜿çšãããŠããã³ã³ããã¹ããæ£ç¢ºã«èª¬æããŸãã
- æå³ã®ããã¡ãã»ãŒãžãæäŸããïŒããŒã¿ãæ±æãããŠããçç±ã説æããæå³ã®ããã¡ãã»ãŒãžãæäŸããŸããããã¯ããããã°ãšç£æ»ã«åœ¹ç«ã¡ãŸãã
- Reactã®ãšã©ãŒåŠçãèšå®ããïŒæœåšçãªè匱æ§ã®æ·±å»åºŠã«å¿ããŠãå®å šã§ãªãæäœã鲿¢ããããèŠåãçºè¡ããããã«Reactã®ãšã©ãŒåŠçãèšå®ããŸãã
- 培åºçã«ãã¹ãããïŒã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããŠã
experimental_taintUniqueValue
ã«é¢é£ãã誀æ€ç¥ããã®ä»ã®åé¡ãç¹å®ããŠå¯ŸåŠããŸãã - ä»ã®ã»ãã¥ãªãã£å¯Ÿçãšçµã¿åãããïŒ
experimental_taintUniqueValue
ããå ¥åæ€èšŒãåºåãšã³ã³ãŒãã£ã³ã°ã宿çãªã»ãã¥ãªãã£ç£æ»ãªã©ãä»ã®ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ãšçµã¿åãããŠäœ¿çšããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®äŸ
ããŒã¿ã®æ±æãšã»ãã¥ãªãã£ã®ååã¯ãæ®éçã«é©çšå¯èœã§ããããŸããŸãªå°åãæåã«é¢é£ããäŸã次ã«ç€ºããŸãã
- Eã³ããŒã¹ãã©ãããã©ãŒã ïŒã°ããŒãã«ïŒïŒãŠãŒã¶ãŒãæäŸããæ€çŽ¢ã¯ãšãªãæ±æããŠã補åããŒã¿ã顧客æ å ±ãžã®äžæ£ã¢ã¯ã»ã¹ã«ã€ãªããå¯èœæ§ã®ããã€ã³ãžã§ã¯ã·ã§ã³æ»æãé²ããŸããããšãã°ãã°ããŒãã«ãªeã³ããŒã¹ãµã€ãã¯ãè±èªãã¹ãã€ã³èªãå京èªããŸãã¯ã¢ã©ãã¢èªã§å ¥åãããæ€çŽ¢èªãæ±æããŠãæ€çŽ¢çµæã衚瀺ããããšãã«æªæã®ããã³ãŒããå®è¡ãããªãããã«ããããšãã§ããŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ïŒã°ããŒãã«ïŒïŒãŠãŒã¶ãŒãçæããã³ã³ãã³ãïŒæçš¿ãã³ã¡ã³ãããããã¡ã€ã«ïŒãæ±æããŠããŠãŒã¶ãŒè³æ Œæ å ±ãçãã ããã«ãŠã§ã¢ãæ¡æ£ãããããå¯èœæ§ã®ããXSSæ»æãé²ããŸããããªã«æåãã®ãªã·ã£æåããŸãã¯ããŸããŸãªã¢ãžã¢ã®ã¹ã¯ãªããã䜿çšããŠå ¥åãããååãå®å šã«åŠçãããããã«ããŸãã
- ãªã³ã©ã€ã³ãã³ãã³ã°ã¢ããªã±ãŒã·ã§ã³ïŒã°ããŒãã«ïŒïŒãŠãŒã¶ãŒãå ¥åãã財åããŒã¿ãæ±æããŠãã¢ã«ãŠã³ãã®æ¹ãããäžæ£ã¢ã¯ã»ã¹ãé²ããŸããããšãã°ããã©ãŒã ã«å ¥åãããéè¡å£åº§çªå·ãšéé¡ãæ±æããŠãæªæã®ããã¹ã¯ãªããããã®ããŒã¿ã倿Žãããçãã ãããã®ãé²ããŸãã
- ã³ã³ãã³ã管çã·ã¹ãã ïŒCMSïŒïŒã°ããŒãã«ïŒïŒCMSã·ã¹ãã ã§ãŠãŒã¶ãŒãæäŸããã³ã³ãã³ããæ±æããŸããç¹ã«ã管çè ãŸãã¯ã³ã³ãã³ãã¯ãªãšãŒã¿ãŒããã®HTMLå ¥åãèš±å¯ããå Žåã§ããããšãã°ãè€æ°ã®èšèªïŒãã©ã³ã¹èªããã€ãèªãæ¥æ¬èªïŒã§ã³ã³ãã³ãã管çããããã«ã°ããŒãã«ã«äœ¿çšãããŠããCMSã¯ãã¬ã³ããªã³ã°ãããããŒãžã§XSSã®è匱æ§ãé²ãããã«ããŠãŒã¶ãŒãæäŸãããã¹ãŠã®ããŒã¿ãæ±æããå¿ èŠããããŸãã
- æ è¡äºçŽãã©ãããã©ãŒã ïŒã°ããŒãã«ïŒïŒã€ã³ãžã§ã¯ã·ã§ã³æ»æãé²ãããã«ãç®çå°ã®æ€çŽ¢èªãšæ è¡è ã®ååãæ±æããŸããååã®ç¹æ®æåãæ£ããåŠçãããããŸããŸãªåœéæåã»ããããµããŒãããŠããããšãæ€èšŒããŸãã
ãµãŒãããŒãã£ã©ã€ãã©ãªãšã®çµ±å
Reactã¢ããªã±ãŒã·ã§ã³ã§ãµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããå Žåã¯ãexperimental_taintUniqueValue
ãšäºææ§ããããæ±æãããããŒã¿ãå®å
šã«åŠçããããšã確èªããããšãäžå¯æ¬ ã§ããã©ã€ãã©ãªãæ±æè¿œè·¡ããµããŒãããŠããªãå Žåã¯ãã©ã€ãã©ãªã«æž¡ãåã«ããŒã¿ããµãã¿ã€ãºãŸãã¯æ€èšŒããå¿
èŠãããå ŽåããããŸããã©ãããŒã³ã³ããŒãã³ããŸãã¯ãŠãŒãã£ãªãã£é¢æ°ã䜿çšããŠããµãŒãããŒãã£ã©ã€ãã©ãªãšã®å¯Ÿè©±ãåŠçããæ±æãããããŒã¿ãé©åã«åŠçãããããã«ããŸãã
ä»åŸã®æ¹åæ§
experimental_taintUniqueValue
ã¯é²åããŠããæ©èœã§ãããReactããŒã ã¯ãã³ãã¥ããã£ããã®ãã£ãŒãããã¯ãšå®éã®äœ¿çšç¶æ³ã«åºã¥ããŠãåŒãç¶ãæŽç·Žãããæ¹åããŠããå¯èœæ§ããããŸããä»åŸã®æ¹åæ§ã«ã¯ã次ã®ãã®ãå«ãŸããå ŽåããããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒããã©ãŒãã³ã¹ãªãŒããŒããããæå°éã«æããããã«ãæ±æè¿œè·¡ããã»ã¹ãæé©åããŸãã
- ãããã现ããå¶åŸ¡ïŒæ±æãããããŒã¿ã®åŠçæ¹æ³ããããã现ããå¶åŸ¡ããéçºè ãç¹å®ã®ã³ã³ããã¹ãã«åºã¥ããŠåäœãã«ã¹ã¿ãã€ãºã§ããããã«ããŸãã
- éçåæããŒã«ãšã®çµ±åïŒæœåšçãªã»ãã¥ãªãã£è匱æ§ãèªåçã«æ€åºããããã«ã
experimental_taintUniqueValue
ãéçåæããŒã«ãšçµ±åããŸãã - ããŸããŸãªããŒã¿åã®ãµããŒãã®æ¡åŒµïŒæ°å€ãããŒã«å€ãªã©ãããŸããŸãªããŒã¿åã®æ±æã®ãµããŒããæ¡åŒµããŸãã
çµè«
experimental_taintUniqueValue
ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠææãªã»ãã¥ãªãã£åŒ·åæ©èœã§ããéçºè
ãä¿¡é Œã§ããªããœãŒã¹ããããŒã¿ãæ±æã§ããããã«ããããšã§ãã€ã³ãžã§ã¯ã·ã§ã³è匱æ§ãé²ããããå®å
šãªéçºããã»ã¹ãä¿é²ããŸãããã®å¶éäºé
ãšèæ
®äºé
ãèªèããããšãéèŠã§ãããexperimental_taintUniqueValue
ã¯ãå
ç¢ã§å®å
šãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®è²ŽéãªããŒã«ã«ãªãåŸãŸããç©æ¥µçãªã¢ãããŒããšããŠãç¹ã«å€æ§ãªããŒã¿å
¥åãåããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠexperimental_taintUniqueValue
ãçµ±åããããšã§ãå
šäœçãªã»ãã¥ãªãã£äœå¶ã匷åãããæªçšã®ãªã¹ã¯ã軜æžãããŸãã
ã»ãã¥ãªãã£ã¯ãäžåºŠéãã®ä¿®æ£ã§ã¯ãªããç¶ç¶çãªããã»ã¹ã§ããããšãå¿ããªãã§ãã ãããè匱æ§ãç¶ç¶çã«ç£èŠããææ°ã®ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ãåžžã«ææ¡ããä»ã®äººããåŠã³ãReactã®ã»ãã¥ãªãã£æ©èœã®æ¹åã«è²¢ç®ããããã«ãReactã³ãã¥ããã£ã«ç©æ¥µçã«åå ããŠãã ããã