ææ©å®è¡(Speculative Execution)
ããã»ãµã¯ãã¡ã¢ãªäžã«äžŠãã§ããåœä»€ã1åãã€é çªã«å®è¡ããŠãããšããã®ãåºæ¬çãªèãæ¹ã§ãããããããããæ§èœãé«ãããããæ¡ä»¶åå²ã®åå²å ãã©ã¡ããæ±ºãŸããªããã¡ã«ãã©ã¡ãã«è¡ãããäºæž¬ããŠãã®å ã®åœä»€ãå®è¡ããŠããŸããšããææ©å®è¡ãè¡ãããã
äºæž¬ãåœãã£ãŠããã°ããã®ãŸãŸå®è¡ãç¶ããã°ãåå²å ãæ±ºãŸããŸã§ã®åŸ ã¡æéã®åãæ©ãå®è¡ã§ããæ§èœãäžãããäžæ¹ãäºæž¬ãå€ããå Žåã¯ãäºæž¬ã§å®è¡ããŠããŸã£ãåœä»€ã§æžãå€ããŠããŸã£ãã¬ãžã¹ã¿ãå ã«æ»ããæ¡ä»¶åå²åœä»€ã«æ»ã£ãŠå®è¡ãããçŽããããäœèšã«æéãæãã£ãŠããŸãããäºæž¬ãåœãã確çãé«ããã°ãç·åçã«å®è¡æéãçãããæ§èœãäžããããšãã§ããã
ééã£ãäºæž¬ã§å®è¡ãããåœä»€ã§æžãå€ããã¬ãžã¹ã¿ãå ã«æ»ããŠããã®ã§ãäºæž¬ã§å®è¡ããŠããŸã£ãåœä»€ã®åœ±é¿ã¯åãæ¶ããããããã®åœä»€ãå®è¡ãã圱é¿ã¯æ®ããªããšèããããŠãããããããä»åãGoogleã®Project Zeroãšããããšã¯ç¬ç«ã«Paul Kocheræ°ã®ã°ã«ãŒããšMoritz Lippæ°ã®ã°ã«ãŒããææ©å®è¡ã«ããã»ãã¥ãªãã£ããŒã«ãååšãããšããè«æãçºè¡šããããªããPaul Kocheræ°ãMoritz Lippæ°ãäž¡æ¹ã®è«æã®èè ã«ãªã£ãŠããã2ã€ã®ã°ã«ãŒãã®ã¡ã³ããŒã¯ããªãéè€ããŠããã
ãããã®ã»ãã¥ãªãã£ããŒã«ã¯ãSpectreãšMeltdownãšåŒã°ããŠãããSpectreã¯ãåããšãåŠæªãšããæå³ã§ããããSpec-lative Execution(ææ©å®è¡)ãšæããåœåãšãªã£ãŠããããŸããMeltdownã¯ãã¡ã¢ãªé åãåé¢ããå£ãçãããŠé€å»ããŠããŸãããšããåä»ããããŠããã
SpectreãšMeltdownã¯ãç°¡åã«èšããšãæ¬æ¥ã¯å®è¡ãããªãã¯ãã®åœä»€ãææ©å®è¡ããããã®åœä»€ã§æ¬æ¥ã¯ã¢ã¯ã»ã¹ã§ããªãã¡ã¢ãªãèªã¿åºããŠããŸãããã®åœä»€ã¯ææ©å®è¡ã誀ãã§ããããšã倿ãããšå®è¡ãåãæ¶ãããŠããŸãã®ã§ãããããã£ãã·ã¥ãå©çšããç§å¯ã®æãéã䜿ã£ãŠãåãæ¶ãããåã«æ¬æ¥ã¯ã¢ã¯ã»ã¹ã§ããªãåœä»€ã®ããŒã¿ãéã³åºããŠããŸãã
æ¡ä»¶åå²ã«äœ¿ããã倿°ããã£ãã·ã¥ã«å ¥ã£ãŠãããã¡ã¢ãªããèªãå Žåãªã©ã§ã¯ã100ãµã€ã¯ã«çšåºŠã®åŸ ã¡ãå¿ èŠãšãªããåå²äºæž¬ãã¹ã§ããããšã倿ããåã«ãå€ãã®åœä»€ãææ©çã«å®è¡ãããŠããŸããSpectreã®è«æã§ã¯180åœä»€ä»¥äžã®åœä»€ãææ©çã«å®è¡ãããã±ãŒã¹ããããšæžãããŠããã
ãªããããã¯Intel CPUã§ã®èŠ³æž¬ã§ãIntel CPUã¯äºæž¬ãšææ©å®è¡ãé 匵ã£ãŠæ§èœãåŒãäžããããšã匷åã«è¡ã£ãŠããã®ã§ãSpectreãMeltdownã®æ»æãåãããããšããé¢ããããšæãããã
ãã®åå²äºæž¬ãã¹ãèµ·ããããéšåã¯ã
if(x < array1_size)
y = array2[array1[x] * 256];
ã®ãããªãææšxãarray1ã®ãµã€ãºãè¶ ããŠãããã©ããããã§ãã¯ããŠãç¯å²å ã§ããã°ãarray1ãšarray2ãèªããšããããã°ã©ã ã®å°çã§ããããã®ãããªããã°ã©ã ã®å°çã¯ã被害è ããã°ã©ã ãã¹ãã£ã³ããã°å®¹æã«èŠã€ããã æ»æããã°ã©ã ã¯ããã®å°çã«é£ã³èŸŒãã§æ»æã仿ããã
ãŸããæ»æããã°ã©ã ã¯array1_sizeããå°ããxãäžããŠããã®æ¡ä»¶åå²ãåå²ããã«ã次ã®y=ã®æãå®è¡ããããã«ãã¬ãŒãã³ã°ããããããŠãxã«array1_sizeãè¶ ãã倧ããªæ°ãå ¥ããŠæ»æãéå§ããããã®æãxã®å€ã¯ãå€ãèªã¿åºãããæ»æå¯Ÿè±¡ã®ã¡ã¢ãªã¢ãã¬ã¹ã«ãªãããã«éžãã§çœ®ãã
æ¬æ¥ã¯ãxã®å€ãarray1ã®ãµã€ãºãè¶ ããŠããã®ã§ãæ¡ä»¶ã¯äžæç«ã§ã次ã®y=ã®æã¯å®è¡ãããªãã®ã§ããããæ»æéå§ã®çŽåã«array1_sizeããã£ãã·ã¥ãã远ãåºããŠããã°ãã¢ã¯ã»ã¹ã«é·ãæéãæãã£ãŠããŸãã®ã§ãæ¡ä»¶ã®å€å®ãåŸ ããã«ææ©çã«y=ã®æãå®è¡ãããŠããŸãããããŠãarray1[x]ã®ã¢ãã¬ã¹ã®ã¡ã¢ãªãèªãã§ãã£ãã·ã¥ã«å ¥ããããããããã®ãªãŒãã¯ææ©çã«å®è¡ãããã®ã§ããããããã®åŸã«åãæ¶ãããŠããŸããarray1[x]ã®å€ãèªã¿åºãããšã¯ã§ããªãã
ãªããy=array1[x];ã®ãããªæãå ¥ãããšãarray1[x]ã®å€ã倿°yã«æ ŒçŽããããšããããææ©çã«ã¡ã¢ãªãžã®æžã蟌ã¿ãè¡ã£ãŠããŸããšããã®å€ã¯ããã£ãã·ã¥ã³ããŒã¬ã³ã¹æ©æ§ãåããŠä»ã®CPUãããèªããç¶æ ã«ãªã£ãŠããŸãåãæ¶ããã§ããªãããã®ãããææ©çãªãªãŒãã¯èš±ãããããææ©çãªã©ã€ãã¯åºæ¥ãªããšããäœããæ®éã§ããããããã£ãŠãarray1[x]ã®å€ãçŽæ¥èªãããšã¯åºæ¥ãªãããã«ãªã£ãŠããã
ãã£ãã·ã¥ã䜿ãç§å¯ã®æãé
ãã®åé¡ãåé¿ããããããã®æ»æã®åã«ããã£ãã·ã¥ã®å 容ã¯ãã©ãã·ã¥ããŠç©ºã«ããŠããããããããšãæ»æã®çŽåŸã«ã¯ãarray1[x]ã®å€ãèªãã®ã§ããã£ãã·ã¥ã®array1[x]ã«å¯Ÿå¿ãããã£ãã·ã¥ã©ã€ã³ã ãã«ããŒã¿ããããä»ã®ãšã³ããªã¯ãã©ãã·ã¥ãããŠç©ºã®ç¶æ ã«ãªã£ãŠããã
ããã§256ãæããŠããã®ã¯ãarray2[array1[x] *256]ãç°ãªããã£ãã·ã¥ã©ã€ã³ã«å ¥ããããã§ããã
ãããŠãarray2[k*256]ãk=0~255ãšããŠé çªã«èªã¿åºããŠãããšãk=Mod256(array1[x])ã®å Žåã¯ããã£ãã·ã¥ããããããã®ã§èªã¿åºãæéãçããkããã®ä»ã®å€ã®èªã¿åºãã¯ãã£ãã·ã¥ãã¹ãšãªããèªã¿åºãæéãé·ããªãããããã£ãŠããã®èªã¿åºãæéãæž¬å®ããŠããã°array[x]ã®å€ãæšå®ããæããããåŸãããã
-
Meltdownã®è«æã«èŒã£ãŠãããã£ãã·ã¥ã®ã¢ã¯ã»ã¹æéã®æž¬å®ããŒã¿ãPage=84ã®æã ã200ãµã€ã¯ã«çšåºŠã§ã¢ã¯ã»ã¹ã§ããŠãããããã以å€ã®ããŒãžã®ã¢ã¯ã»ã¹ã¯400ãµã€ã¯ã«ããã以äžããã£ãŠãã
ãã®ãã£ãã·ã¥ãäœ¿ãæ»æã¯Spectreãã以åããç¥ãããŠãããFLUSH+RELOADæ»æãšåŒã°ããŠããã
ããã§èª¬æããæ»æã¯ãé åã®ã¢ã¯ã»ã¹ãè¡ããšãã«ãé åã®ç¯å²ãã§ãã¯ãããããã£ãŠæ¬æ¥ã®ã¢ã¯ã»ã¹ã®ç¯å²å€ã®ã¡ã¢ãªãã¢ã¯ã»ã¹ãããã®ã§ããããSpectreã«ã¯ã鿥åå²åœä»€ã®è·³ã³å ãå€ããŠããŸããšããæ»æã¢ãŒããããããããããã¡ãã®æé ã¯ããã«è€éã§ããã®ã§ã説æã¯å²æããã
Spectreã¯ææ©å®è¡ã®éãçªããã®ã§ãIntel CPUã ãã§ãªããAMDãArmã§ãæ»æã§ããã®ã§ãããã被害è ããã°ã©ã ã®äžã®ã³ãŒãã®å°çã®ææ©å®è¡ã§ç¯å²å€ã®ã¡ã¢ãªãã¢ã¯ã»ã¹ããã®ã§ã被害è ããã°ã©ã ã®ã¡ã¢ãªã®ããŒãžäžèŠ§è¡šã«å ¥ã£ãŠããªãã¡ã¢ãªã®ããŒã¿ãèªã¿åºãããšã¯ã§ããªããšããå¶çŽãããã
(次åã¯1æ18æ¥ã«æ²èŒããŸã)
