¡¾Ô­´´·ì϶¡¿Î¢ÈíIE/Edge¾ç±¾ÒýÇæ·ì϶CVE-2020-0768·ÖÎö

°ä²¼¹¦·ò 2020-03-13

΢ÈíÔÚ½üÈÕ°ä²¼µÄ²¹¶¡²¼¸æÖÐ £¬½¨¸´ÁËÒ»¸öÓÉ888¼¯ÍÅADLab°²È«×êÑÐÔ±Ìá½»µÄ·ì϶ £¬·ì϶±àºÅΪCVE-2020-0768¡£·ì϶λÓÚChakraCoreÒýÇæ´úÂë¿âÖÐ £¬¿ÉͬʱӰÏìInternet Explorer 11ºÍMicrosoft Edge (»ùÓÚEdgeHTML)ä¯ÀÀÆ÷¡£¸Ã·ì϶ÊÇÒ»¸öÄÚ´æ·ÛËéÐÍ·ì϶ £¬ÓÐÔ¶³Ì´úÂëÖ´ÐеķçÏÕ £¬Òò¶øÎ¢Èí½«ÆäÆÀ¼¶Îª¡°ÑϳÁ¡± £¬²¢³ÆÐ»ADLab¡£


Ó¦¶Ô´ëÊ©


ʹÓÃWindows×Ô¶¯¸üлòÊÖ¶¯ÏÂÔØ²¹¶¡°ü½¨¸´·ì϶¡£


·ì϶ºÍ²¹¶¡·ÖÎö


PART1


±¾·ì϶ÊÇChakraCoreÒýÇæÔÚJIT±àÒë¹ý³ÌÖÐ £¬µ¥Ò»Ö¸ÁîµÄÊý¾ÝÁ÷·ÖÎöÃýÎó £¬µ¼ÖµıäÁ¿»îÔ¾ÐÔ·ÖÎöºÍ¼Ä·ÅÆ÷·ÖÅä·¸´í¡£Ê×ÏÈ £¬´Ó·ì϶Ñù±¾µÄ½ÚÔìÁ÷ͼÆðÍ·¡£


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


ÆäÖÐ £¬ÔÚBlock 4ÓÐÈçϵÄ×Ö½ÚÂ룺


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


·ûºÅs10´ú±í[1337] £¬s6´ú±íconst½¨ÊεÄarr¡£ÒÀÕÕ±àÒëµÀÀíµÄÊõÓï £¬±äÁ¿»ñÈ¡½ç˵ֵ³ÆÎªdef £¬±äÁ¿Öµ±»Ê¹ÓóÆÎªuse £¬ÔÚInitConstÖ¸ÁîÖÐs6±»def £¬s10±»use £¬ËæºóÔÚStElemCÕâÌõÖ¸ÁîÏ £¬s6±»use¡£Äܹ»¿´µ½s6Óës10¹ØÏµÇ×êÇ £¬s6Äܹ»¿´×÷s10ÒÀÕÕÁíÒ»ÖÖ²½Öè¶Ôͳһ±äÁ¿µÄÒýÓà £¬ChakraCore³ÆÎªcopy-prop·ûºÅ¶Ôԭʼ·ûºÅµÄÒýÓᣵ«µ÷ÊÔÏÔʾ £¬ÕâÀï²úÉúÁËÃýÎó¡£


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


Èç´ËÒ»À´ÐγÉÁËԭʼ·ûºÅΪs10 £¬copy-prop·ûºÅΪs6 £¬¼´s6->s10µÄ¼üÖµ¶Ô¡£ÆäÕ»»ØËÝλÓÚ£º


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


ÃýÎó¼üÖµ¶ÔÊÇÆ¾¾ÝÊý¾ÝÁ÷·ÖÎöµÄÃýÎóÁ˾ֵóöµÄ¡£Ëæºó £¬Õâ¸ö¼üÖµ¶Ô±»²ÎÓëÁËBlock 4ÖÐblockOptData->capturedValues->copyPropSyms £¬ÆäÕ»»ØËÝλÓÚ£º


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


Ëæºó £¬ÔÚJIT ForwardPassÕâÑùÔçÄêÏòºóµÄÓÅ»¯¹ý³ÌÖÐ £¬Block 4µÄblockOptData->capturedValues±»¹é²¢¸øBlock 5 £¬ÆäÖÐÔ̺¬s6->s10ÕâÒ»¼üÖµ¶Ô £¬ÆäÕ»»ØËÝλÓÚ£º


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


ÔÙÖ®ºó £¬ÔÚJIT BackwardPassÕâÑù´ÓºóÏòǰµÄÓÅ»¯¹ý³ÌÖÐ £¬Block 5µÄupwardExposedUsesͨ¹ý½Ó¼ûblockOptData->capturedValues->copyPropSyms £¬°Ñs6->s10ÕâÒ»¼üÖµ¶Ô²ÎÓë¡£ÆäÕ»»ØËÝλÓÚ£º


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


upwardExposedUsesÔÚ±àÒëµÀÀíÖб»³ÆÎª¡°ÏòÉ϶³öµÄʹÓá± £¬ËüÊDZäÁ¿»îÔ¾ÐÔ·ÖÎöµÄ¶Ô³Æ¹ý³Ì¡£ËæºóÔÚ·´Ïò´«²¼µÄ¹ý³ÌÖÐ £¬º¬ÓÐÉÏÊö¼üÖµ¶ÔµÄupwardExposedUses±»´«µÝ¸øBlock 4¡¢Block 3ºÍBlock 2¡£¶ø×÷ΪLoop HeaderµÄBlock 2½«ÆäupwardExposedUsesÓÃÓÚ»îÔ¾ÐÔ·ÖÎöºÍºóÐøµÄ¼Ä·ÅÆ÷·ÖÅä¹ý³Ì¡£


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


ÉÏÊö¹ý³ÌÄܹ»Í¨¹ýÏÂͼÀ´°µÊ¾¡£Äܹ»¿´µ½ £¬ÃýÎóµÄÊý¾Ý¾­¹ýÁËÕýÏò´«²¼ºÍ·´Ïò´«²¼ £¬×îÖÕÔÚÑ­»·ÌåµÄÈ«ÊýÁìÓò¶¼±»´«È¾¡£


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


Ëæºó £¬ÓÉÓÚÉÏÊöÃýÎóÊý¾Ý £¬ÔÚJITµÄ¼Ä·ÅÆ÷·ÖÅä¹ý³ÌΪs10ÍÆËã³öÁËÃýÎóµÄÐÔÃüÖÜÆÚ £¬ÆäÐÔÃüÖÜÆÚºá¿çÑ­»·µÄÆðÍ·µ½ÊµÏÖ¡£Òò¶øÒõ²îÑô´í £¬JIT²åÈëÁËÒ»¸öMOVÖ¸Áî £¬ÐÎÈçMOV labelReg, mem £¬µ«²¢Ã»Óгõʼ»¯Æäinstr->src->m_offset £¬¸ÃֵʼÖÕΪ0¡£ÔÚ×îºóÌì»îÁ¦ÐµÂëµÄʱ³½ £¬ÌìÉúÁËÒ»¸öÖ¸ÏòÕ»Ö¡Ö¸Õë¡¢Æ«ÒÆÎª0µÄ¶ÁÄÚ´æ²Ù×÷ £¬°µÊ¾Îª[EBP+0x0]»ò[RBP+0x0]¡£


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


ÕâÑù £¬Ò»¸ö·ÇÔ¤ÆÚµÄÄÚ´æ½Ó¼û°Ñ·¸·¨µÄÊý¾Ý¶ÁÈëÁËJavaScriptÒýÇæ¸ßµÍÎÄ £¬ËæºóÔÚBailOut»òÆäËûÇé¿ö»áÒýÓõ½ £¬ÕâÑùµÄ·¸·¨Êý¾Ý½«»áÔì³ÉÀàÐÍ»ìºÏ¡£


PART2


Ôì³ÉÉÏÊöÃýÎóÊý¾Ý´«²¼µÄÔ­ÒòÔÚÓÚInitConstÕâÒ»Ö¸ÁîÆäʵûÓÐÔÚChakraCoreµÄJIT´úÂëÖеõ½ÕýÈ·µÄÊý¾ÝÁ÷·ÖÎö £¬Òò¶øÔÚ΢ÈíµÄ½¨¸´ÖÐ £¬ÔÚJIT¸ÕÆðͷȾָµÄʱ³½ £¬InitConstÖ¸Áî¾Í±»´úÌæ³ÉLd_AÖ¸Áî¡£


Ê×Ò³| 888¼¯Íŵç×ÓÓÎÏ·¹Ù·½ÍøÕ¾


ChakraCoreÆëȫʵÏÖÁ˶ÔLd_AÖ¸ÁîµÄÊý¾ÝÁ÷·ÖÎö¡£´Ëʱ £¬ÔÚ·ÖÎöForward PassÖÐ £¬·¢ÏÖBlock 4ÖеļüÖµ¶Ô²»ÔÙÊÇs6->s10 £¬¶øÊÇs10->s6 £¬Ò²¾ÍÊÇ˵s10ÊÇԭʼ·ûºÅ £¬s6ÊÇÒýÓÃs10µÄcopy-prop·ûºÅ¡£Èç´ËÒ»À´ £¬ÌìÈ»²»»áÔì³ÉÃýÎóÊý¾ÝµÄ´«²¼¡£Î¢ÈíÔÚIE11ä¯ÀÀÆ÷ÖÐʹÓÃÁËÒ»ÑùµÄ´úÂëÀ´½¨²¹Õâ¸ö·ì϶¡£


ÊÂʵÉÏ £¬ÔÚECMAScript 6³ß¶ÈÖÐ £¬const½¨ÊηûÓÃÀ´°µÊ¾Ò»¸ö±äÁ¿ÔÚ½ç˵֮ºó²»³ÉÔÙ±»¸³Öµ £¬ÊÇÓï·¨µµ´ÎµÄÔ¼Êø£»¶øJavaScriptÒýÇæÖеÄJIT¹ý³ÌʼÖÕ²úÉúÔÚÚ¹ÊÍÖ´ÐÐÖ®ºó £¬ÈôÊÇconst½¨ÊηûµÄÔ¼ÊøÔÚÚ¹ÊÍÖ´Ðн׶α»Î¥·´ £¬½«»áÁ¢¼´Í˳ö £¬²»»áÓÅ»¯Ö´ÐÐJIT¹ý³Ì¡£Òò¶ø £¬JIT¹ý³ÌÖ»±ØÒªË¼¿¼Êý¾ÝÁ÷ÎÊÌâ £¬¶ø²»ÓÃ˼¿¼const½¨ÊηûµÄÔ¼Êø¡£ÓÉÓÚChakraCoreÔÚJITµÄÓÅ»¯½×¶ÎÓëÚ¹ÊÍÖ´Ðн׶ÎʹÓÃͳһÌ×ÖÐÑë˵»° £¬²»ÂÛÊÇLd_A»¹ÊÇInitConst¶¼¼æÈÝJITµÄÈ«¹ý³Ì £¬±¾·ì϶Äܹ»Ã÷È·ÒÔΪÊÇÒ»¸öÒµÎñÂß¼­·ì϶¡£


²Î¿¼Á´½Ó£º

1.https://portal.msrc.microsoft.com/en-us/security-guidance/acknowledgments

2.https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0768