å®è¡å¯èœãªããã°ã©ã ã³ãŒãã®æ å ±ã»ãã¥ãªãã£ã確ä¿ããæ¹æ³ãšæ¹æ³ã®ç 究ãéå§ããŸãããé ããæ©ããããã¹ãŠã®ãœãããŠã§ã¢éçºè ãšã·ã¹ãã ãšã³ãžãã¢ã¯ãAltiriks Systemsã®ãããžã§ã¯ãã®1ã€ã§çºçãããã®ãããªã¿ã¹ã¯ã«çŽé¢ããŸãããã®ã¿ã¹ã¯ã®ãã¬ãŒã ã¯ãŒã¯å ã§ãæ¡ä»¶ä»ãã§ä¿è·ãããŠããªãç°å¢ã§ããã°ã©ã ã³ãŒãã®ä¿è·ãããå®è¡ãå®è£ ããå¿ èŠããããŸããããã®ããã«ããã§ã«ããç¥ãããŠããããã説æãããŠããæ å ±ä¿è·ã®æ¹æ³ãšæ段ã«å ããŠããã·ã¢ã®ãããžã§ã¯ãã§ã¯ãã£ãã«äœ¿çšãããªãæè¡Trusted Execution EnvironmentïŒTEEïŒããŸãã¯ãã·ã¢èªã§èšãã°ãä¿¡é Œã§ããå®è¡ç°å¢ã®æè¡ãéžæãããŸãããå ·äœçã«ã¯ããã®èšäºã§ã¯ãä¿¡é Œã§ããã³ãŒãå®è¡ç°å¢ïŒIntel Software Guard ExtensionsãŸãã¯SGXïŒã«Intelããã»ããµãšã³ã¯ã¬ãŒãã䜿çšããå®éçãªäŸã説æããããšã«ããŸããã
ä¿¡é Œã§ããã©ã³ã¿ã€ã ã¯ãç¹å®ã®ã¡ãŒã«ãŒã®ããã»ããµã§ãµããŒããããŠããã ãã§ã¯ãããŸããããŸããTEEã¯ãå€ãã®AMDïŒSecure Execution EnvironmentãSecure TechnologyïŒããã»ããµãARMïŒTrustZoneïŒããã»ããµãããã³RISC-Vããã»ããµã§ãµããŒããããŠããŸããããã«ãTEEã¯ææ°ã®IBM Zã¡ã€ã³ãã¬ãŒã ã§ãµããŒããããŠããŸãããã®èšäºã®å·çæç¹ïŒ2020幎å€ïŒã§ã¯ãIntelããã»ããµãæã人æ°ãããããœããšãåŸã®åéã®åå¿è ãå©çšã§ãããšèããŠãããããäŸãšããŠIntelSGXãéžæããŸããã Intel SGXããµããŒãããIntelããã»ããµã¢ãã«ã®å®å šãªãªã¹ãã«ã€ããŠã¯ãæ€çŽ¢ããé©åãªãã¯ãããžãéžæããŠãIntel補åä»æ§ïŒARKïŒã®äžã«ããIntelWebãµã€ãã«ã¢ã¯ã»ã¹ããŠãã ããããã¡ãããæè²ãç 究ã®ç®çã§IntelSGXãšãã¥ã¬ãŒã·ã§ã³ãå©çšããããšãã§ããŸãããããã®ãšãã¥ã¬ãŒã·ã§ã³ã®ããã€ãã䜿çšãããšãããããèšå®ããéã«ããã€ãã®å°é£ãæããã«ãªããŸããããŸããå®éã®ãæŠéããããžã§ã¯ãã§ã¯ããã¡ãããè£ çœ®ã®æ©èœã«åºã¥ããã¯ãããžãŒã®ãšãã¥ã¬ãŒã·ã§ã³ã¯åãå ¥ããããªãããšãç解ããå¿ èŠããããŸãã
ç¹ã«ããããžã§ã¯ãã§TEEã䜿çšããçµéšã®ããã¹ãã·ã£ãªã¹ãããã®ã³ã¡ã³ããè¿œå ããŸãã¯ãã®ãã¯ãããžãŒã«é£ã³èŸŒã¿å§ããã°ããã®ã¹ãã·ã£ãªã¹ãããã®è³ªåã«å¯Ÿãããã£ãŒãããã¯ã¯ã次ã®èšäºã§ãã®ãããã¯ã®ãã詳现ãªé瀺ã«è²¢ç®ããŸããåãã£ãŠæè¬ããŸãïŒ
åæžã
ä¿¡é Œã§ããã©ã³ã¿ã€ã ç°å¢ãæ¢çŽ¢ããæ ã®æåã«ç§ãã¡ãå°ããäž»ãªè³ªåã¯ãã³ã³ãã¥ãŒã¿ãŒã·ã¹ãã ã®ã³ã³ããŒãã³ããä¿¡é Œã§ãããã©ããã§ãããããŠãå¯èœã§ããã°ãã©ã®ããã«ïŒéçºè ãç¹ã«Intelã®ãšã³ãžãã¢ã¯ããã®è³ªåã«æ確ãªçããåºããŸããIntelèªäœä»¥å€ã¯èª°ãããŸãããããã¯äœãæå³ããã®ã§ããããïŒããããã£ãšè©³ããç解ããããšãææ¡ããŸãã
ç¹æš©ãªã³ã°
ã»ãã¥ãªãã£äžã®çç±ãããã³ã³ãã¥ãŒã¿ã®ã·ã¹ãã ã³ã³ããŒãã³ãã¯ç¹æš©ã¬ãã«ã«åããããŸãã Intelããã»ããµã«åºã¥ããã¹ãŠã®ææ°ã·ã¹ãã ã¯ãç¹æš©ãªã³ã°ã·ã¹ãã ãåããŠããã ãã§ã¯ãããŸãããå€éšããå éšãžãçŸåšããã»ããµã«ãã£ãŠåŠçãããŠããã³ãŒãã®æš©éãæ¡åŒµãããŠããŸãã
ãªã³ã°çªå·3ãå€èŒªã«ã¯ãç§ãã¡ãæ¥åžžç掻ã§ã³ã³ãã¥ãŒã¿ãŒäžã§äœ¿çšãããã¹ãŠã®ãŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠãããã¢ã¯ã»ã¹ã¬ãã«ã¯æäœã§ãã
ãªã³ã°No.2ãšNo.1ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšããã€ã¹ãã©ã€ãã¯ããããã®ã¬ãã«ã«ãããŸãã
ãªã³ã°çªå·0ãã¹ãŒããŒãã€ã¶ãŒã¢ãŒããããã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãŒãã«ïŒããªãã§ã©ã«ç®¡çãããã»ã¹éã®ãªãœãŒã¹å²ãåœãŠïŒãããã³ã·ã¹ãã ãã©ã€ããé 眮ãããŠããå Žæã§ãã
ãªã³ã°çªå·-1ããã€ããŒãã€ã¶ãŒãè€æ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã³ã³ãã¥ãŒã¿ãŒäžã§åæã«å®è¡ãããŠããå Žåã®ãªãœãŒã¹ã®å²ãåœãŠãæ åœããããããåé¢ãã責任ããããŸãã
ãªã³ã°çªå·-2ãã·ã¹ãã 管çã¢ãŒãïŒSMM-ã·ã¹ãã 管çã¢ãŒãïŒãã·ã¹ãã ã®é»æºã管çããæ¡åŒµã«ãŒãã管çããŸãã
éå±€ã®ã³ã³ããŒãã³ãã®èœåãå¶éããããã«ããŸããŸãå€ãã®ãªã³ã°ã圢æããŠããŸããŸãè€éã§è² è·ã®é«ãã·ã¹ãã ãäœæããããšãã§ããŸãããã ããããã¯æ»æè ã®äœæ¥ã容æã«ããã ãã§ããã·ã¹ãã ãè€éã«ãªãã»ã©ãã·ã¹ãã å ã®è匱æ§ãèŠã€ãããããªããŸããããããå¿ èŠãªå Žæã«ã»ãã¥ãªãã£ã®è¿œå ã¬ã€ã€ãŒãã©ã®ããã«æäŸã§ããŸããïŒçãã¯äžèšã§ãã
ãšã³ã¯ã¬ãŒã
æ»æè ã®äž»ãªã¿ã¹ã¯ã¯ãå¿ èŠãªã·ã¹ãã ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãæ»æè ã«æäŸããç¹æš©ã¬ãã«ãååŸããããšã§ããããã被害è ã®ã¢ããªã±ãŒã·ã§ã³ã®ç§å¯ã§ããå Žåãæªæã®ããã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã·ã¹ãã ã«ç§å¯ãä¿åãã責任ãããã¢ã¯ã»ã¹ã¬ãã«ãæ£ç¢ºã«å¿ èŠã§ãããããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã·ãŒã¯ã¬ããã®ç®¡çã¯æãå åŽã®ãªã³ã°ã«ä»»ããã¹ãã§ãããšããçµè«ã¯ããããžã®ã¢ã¯ã»ã¹ããã¹ãŠã®äžã§æãé£ããããã§ãããã ãããã®ã¢ãããŒãã¯å€å°åèãããŠããŸããçŸåšããã¹ãŠã®ã·ãŒã¯ã¬ããã¯ããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ãšåãã¬ãã«ã§ä¿åããããããã®ã·ãŒã¯ã¬ããã1ã€ã®æ¡ä»¶ã§ç®¡çããã³ãŒããä¿åãããŸããã€ãŸããããã»ããµä»¥å€ã®èª°ããã·ãŒã¯ã¬ããã«ã¢ã¯ã»ã¹ã§ããŸãããããã°ã©ã ãšããŒã¿ã¯ãããã°ã¹ãã¬ãŒãžã«ããã¯ãããŸãããã®å Žåããã®ã¹ãã¬ãŒãžã¯ãšã³ã¯ã¬ãŒããšåŒã°ããŸãïŒãšã³ã¯ã¬ãŒã-éããããããã¯ãããŠããŸãïŒãããã»ããµã®ã¿ãæã€ããŒã
ä¿¡é Œã§ããç°å¢ã§åäœããã¢ããªã±ãŒã·ã§ã³
ã·ã¹ãã ãåçŽã§ããã»ã©ãå«ãŸããã³ãŒããå°ãªããªãã»ã©ãã»ãã¥ãªãã£ããŒã«ã«åºã¥ããŠã·ã¹ãã ãéãã®ãé£ãããªããŸãïŒåºæ¬çã«ä¿è·ãããŠããªãã·ã¹ãã ã«ã€ããŠã¯èª¬æããŸããïŒãã·ãŒã¯ã¬ããã§æ©èœããã³ãŒãã¯ãã§ããã ãåçŽã§çãããå¿ èŠããããŸããããã°ã©ã ã³ãŒãå šäœããšã³ã¯ã¬ãŒãã«ããã¯ããããšã¯å®çšçã§ã¯ãªãããããšã³ã¯ã¬ãŒãã䜿çšããã¢ããªã±ãŒã·ã§ã³ã¯ããä¿¡é Œã§ããããšãä¿¡é Œã§ããªããã®2ã€ã®éšåã«åå²ããå¿ èŠããããŸããä¿¡é Œã§ãããã®ã¯ãšã³ã¯ã¬ãŒããæ ŒçŽãïŒè€æ°ããå ŽåããããŸãïŒãä¿¡é Œã§ããªããã®ã¯ã¡ã€ã³ããã°ã©ã ã³ãŒããæ ŒçŽããŸãã
ä¿¡é Œã§ããéšåã¯ãECALLïŒEnclave CallïŒãšåŒã°ããäžé£ã®é¢æ°ãšããã·ãŒãžã£ã§ãããã®ãããªé¢æ°ã®çœ²åã¯ãç¹å¥ãªããããŒãã¡ã€ã«ã«èšè¿°ãããããã®å®è£ ããœãŒã¹ã³ãŒããã¡ã€ã«ã«èšè¿°ããå¿ èŠããããŸããäžè¬ã«ããã®ã¢ãããŒãã¯ãããããŒã®éåžžã®æžã蟌ã¿ã§äœ¿çšãããã®ãšäŒŒãŠããŸããããã®ã³ã³ããã¹ãã§ã¯ãç¹å¥ãªCã®ãããªèšèªEDLïŒãšã³ã¯ã¬ãŒãå®çŸ©èšèªïŒã䜿çšãããŸãããŸãããšã³ã¯ã¬ãŒãå ããåŒã³åºãããšãã§ããé¢æ°ã®ãããã¿ã€ããäœæããå¿ èŠããããŸãããã®ãããªé¢æ°ã¯OCALLïŒå€éšåŒã³åºãïŒãšåŒã°ããŸãããããã¿ã€ãã¯ECALLé¢æ°ãšåãããããŒã«æžã蟌ãŸããå®è£ ã¯ECALLãšã¯ç°ãªããã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œã§ããªãéšåã«ããã«å¿ããŠæžã蟌ãŸããŸãã
ä¿¡é Œã§ããã³ãŒããšä¿¡é Œã§ããªãã³ãŒãã¯ãDiffie-Hellmanãããã³ã«ã䜿çšããèªèšŒã«ãã£ãŠç·å¯ã«çµåãããŠããŸããããã»ããµã¯ãã·ã¹ãã ãåèµ·åããããã³ã«æŽæ°ãããæ å ±äº€æããŒãä¿åããã眲åæé ãæ åœããŸãããšã³ã¯ã¬ãŒãã®ã³ã³ãã³ãã¯ããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã䜿çšããå ±æã¡ã¢ãªã«ä¿åãããŸãããã¹ãã¬ãŒãžã¯æå·åãããŸããã³ã³ãã³ãã埩å·åã§ããã®ã¯ããã»ããµã ãã§ãããšã³ã¯ã¬ãŒãã³ãŒãããã°ãªãã§èšè¿°ããããã¹ãŠã®ããŒããŠã§ã¢ãã¡ãŒã«ãŒã®æå³ãããšããã«æ©èœããä»ã«äœãæ©èœããªãçæ³çãªäžçã§ã¯ããŠãããŒãµã«ã§å®å šã«å®å šãªã·ã¹ãã ãåŸãããŸãããã®ã·ã¹ãã ã®äž»ãªå©ç¹ã¯ããŠãŒã¶ãŒããã°ã©ã ãå«ãä»ã®ãã¹ãŠã®ããã°ã©ã ãå®è¡ãããã®ãšåãããã»ããµäžã§ã·ãŒã¯ã¬ããéšåãå®è¡ã§ããããšã§ãã
ãã ããéå»æ°å¹Žéã§ãææ°ã®ããã»ããµã®å€æ°ã®ãã€ã¯ãã¢ãŒããã¯ãã£ã®è匱æ§ãå¹ åºãèŽè¡ã®åã«çŸãããšã³ã¯ã¬ãŒãã®å éšãžã®ã¢ã¯ã»ã¹ãå¯èœã«ããŸããïŒForeshadowïŒSpectreã¯ã©ã¹ã®è匱æ§ïŒãSGAxeãZombieloadãCacheOutãªã©ããã®ãªã¹ãã«å¥ã®é倧ãªããŒããŠã§ã¢ã®è匱æ§ãè£å ãããªããšããä¿èšŒã¯ãããŸããããã®ãœãããŠã§ã¢ä¿®æ£ã¯ããœãããŠã§ã¢ã®ããããããšã¯åŒã°ããŸãããããããããŸã£ããæ°ããããã»ããµã¢ãŒããã¯ãã£ãäžçã«æ瀺ããããã¹ãŠã®æ¬ ç¹ãä¿®æ£ãããææãç®ã®åœããã«ããã§ãããããä»ã®ãšãããæå ã«ãããã®ã«ã€ããŠè©±ã䟡å€ããããŸãããããŠæå ã«ã¯ãä»æ¥ã®ã·ã¹ãã ã®ã»ãã¥ãªãã£ãåçã«åäžããããçšéãåºã匷åãªããŒã«ããããŸãããããªã«è²ãŠãã¹ããŒããŠã©ãããã¹ããŒããã©ã³ãã巚倧ãªã³ã³ãã¥ãŒãã£ã³ã°ã¯ã©ã¹ã¿ãŒãŸã§ãäžçäžã®äœååãã®ããã€ã¹ã«äœããã®åœ¢ã§å®è£ ãããŠããããšã
ããã«ã¡ã¯äžçïŒ
çè«ããå®è·µã«ç§»ããŸãããããã§ã«æšæºçãªã¿ã¹ã¯ãå®è£ ããå°ããªããã°ã©ã ãæžããŠã¿ãŸããããæååãHelloworldïŒããåºåããŸãããã®è§£éã§ã¯ãã¡ãã»ãŒãžã®éä¿¡å ã瀺ããŸãã
ãŸããå ¬åŒWebãµã€ãããSGXãæäœããããã«SDKãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããå¿ èŠããããŸããããŠã³ããŒãããã«ã¯ãç°¡åãªç»é²æé ãå®è¡ããå¿ èŠããããŸããã€ã³ã¹ããŒã«æ®µéã§ãéçºããã±ãŒãžãã³ã³ãã¥ãŒã¿ãŒã§äœ¿çšå¯èœãªããŒãžã§ã³ã®VSã«çµ±åããããã«æ±ããããŸãããããå®è¡ããŸããSGXã䜿çšããæåã®ãããžã§ã¯ãã®å®è£ ãæåãããããã®æºåã¯ãã¹ãŠæŽã£ãŠããŸãã
VSãèµ·åããIntelSGXãããžã§ã¯ããäœæããŸãã
ãããžã§ã¯ããšãœãªã¥ãŒã·ã§ã³ã®ååãéžæããã次ãžããåŸ ã¡ãŸãã
次ã«ããããžã§ã¯ãæ§æãéžæããããã«æ±ããããŸããäœãå€æŽãããæåã«ææ¡ãããå€ãæ®ããŸãã
次ã«ãäœæãããœãªã¥ãŒã·ã§ã³ã«å¥ã®ãããžã§ã¯ããè¿œå ããŸããéåžžã®C ++ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã§ãã
ãã®çµæã次ã®å³ããããžã§ã¯ããã€ã¢ãã°ããã¯ã¹ã«è¡šç€ºãããŸãã
次ã«ããšã³ã¯ã¬ãŒããä¿¡é Œã§ããªãéšåã«ãªã³ã¯ããå¿ èŠããããŸãããä¿¡é Œã§ããªãéšåããããžã§ã¯ããå³ã¯ãªãã¯ããŸãã
次ã«ããããžã§ã¯ãã®ããã€ãã®ããããã£ãå€æŽããå¿ èŠããããŸãã
ããã¯ãããã°ã©ã ãæ£ããæ©èœããããã«å®è¡ããå¿ èŠããããŸããäž¡æ¹ã®ãããžã§ã¯ãã«å¯ŸããŠæé ãç¹°ãè¿ããŸãã
ãŸãããœãªã¥ãŒã·ã§ã³ã®ããããã£ã§ã¡ã€ã³ãããžã§ã¯ãã瀺ãå¿ èŠããããŸãã
ããã§ãããã°ã©ã ãå®è£ ããæºåãæŽããŸããã
ãã®ããã°ã©ã ã«ã¯ã䜿çšãã3ã€ã®ãã¡ã€ã«ããããŸããEnclave.edlïŒåãããããŒïŒãEnclave.cppïŒECALLå®è£ ã詳ãã説æãããŠããŸãïŒãUntrusted Part.cppïŒã¡ã€ã³ãããžã§ã¯ããã¡ã€ã«ã¯untrustedéšåã§ãïŒã
次ã®ã³ãŒãããã¡ã€ã«ã«å ¥ããŸãããïŒ
Untusted Part.cppïŒ
#define ENCLAVE_FILE "Enclave.signed.dll" //,
#include "sgx_urts.h" // ,
#include "Enclave_u.h" //
#include "stdio.h"
void print_string(char* buf) //OCALL -
{
printf("ocall output: %s\n", buf);
}
int main()
{
sgx_enclave_id_t eid; // id , , id
sgx_status_t ret = SGX_SUCCESS; //
sgx_launch_token_t token = { 0 }; //
int updated = 0; //
const int BUF_LEN = 30; // ,
ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL); //
if (ret != SGX_SUCCESS)
{
printf("Failed to create enclave with error number: %#x\n", ret); //
return 0;
}
char buf[BUF_LEN]; // ,
enclaveChat(eid, buf, BUF_LEN); // ECALL
printf("\noutput form main(): %s\n", buf); //
}
Enclave.edlïŒ
enclave {
from "sgx_tstdc.edl" import *;
trusted {
/* define ECALLs here. */
public void enclaveChat([out, size=len] char* str, size_t len);
/* , . OUT - ,
, out .
, ,
.
*/
};
untrusted {
/* define OCALLs here. */
void print_string([in, string] char* buf); // ,
};
};
Enclave.cppïŒ
#include "Enclave_t.h"
#include "sgx_trts.h"
#include <cstring>
void enclaveChat(char* str, size_t len)
{
char* secret = "Hello from better place"; //
memcpy(str, secret, len); // ,
print_string(secret); // OCALL-
}
f7ãæŒããŸã-ãœãªã¥ãŒã·ã§ã³ããã«ãããŠãããctrl + f5ãæŒããŠå®è¡ããŸãã
次ã®ãããªãšã©ãŒãçºçããå ŽåïŒ
BIOSã§IntelSGXãæå¹ã«ãªã£ãŠããããšã確èªããŠãã ããïŒBiosïŒSecurity / IntelSGX / Enabledã
ãšã©ãŒããªããã³ã³ãœãŒã«ã®ç»é¢ã®åã«ã次ã®è¡ã衚瀺ãããå Žåã
...ããã§ãšãããããŸããIntelSGXãã¯ãããžãŒã䜿çšããæåã®ããã°ã©ã ã®æºåãæŽããŸãããã³ãŒãå ã®ã³ã¡ã³ããç解ã®ããã«å æ¬çã§ããããšãé¡ã£ãŠããŸããããã§ãªãå Žåã¯ãã³ã¡ã³ããŸãã¯ãã©ã€ããŒãã¡ãã»ãŒãžã§ãã€ã§ã質åã§ããŸãã