¡¾Ô´´Â©¶´¡¿Î¢ÈíIE/Edge½Å±¾ÒýÇ橶´CVE-2020-0768·ÖÎö
Ðû²¼Ê±¼ä 2020-03-13΢ÈíÔÚ½üÈÕÐû²¼µÄ²¹¶¡Í¨¸æÖУ¬ÐÞ¸´ÁËÒ»¸öÓɶ«Éƽ̨ADLabÄþ¾²Ñо¿Ô±Ìá½»µÄ©¶´£¬Â©¶´±àºÅΪCVE-2020-0768¡£Â©¶´Î»ÓÚChakraCoreÒýÇæ´úÂë¿âÖУ¬¿ÉͬʱӰÏìInternet Explorer 11ºÍMicrosoft Edge (»ùÓÚEdgeHTML)ä¯ÀÀÆ÷¡£¸Ã©¶´ÊÇÒ»¸öÄÚ´æÆÆ»µÐÍ©¶´£¬ÓÐÔ¶³Ì´úÂëÖ´ÐеķçÏÕ£¬Òò´Ë΢Èí½«ÆäÆÀ¼¶Îª¡°ÑÏÖØ¡±£¬²¢ÖÂлADLab¡£
Ó¦¶Ô´ëÊ©
ʹÓÃWindows×Ô¶¯¸üлòÊÖ¶¯ÏÂÔز¹¶¡°üÐÞ¸´Â©¶´¡£
©¶´ºÍ²¹¶¡·ÖÎö
PART1
±¾Â©¶´ÊÇChakraCoreÒýÇæÔÚJIT±àÒë¹ý³ÌÖУ¬µ¥Ò»Ö¸ÁîµÄÊý¾ÝÁ÷·ÖÎö´íÎ󣬵¼ÖµıäÁ¿»îÔ¾ÐÔ·ÖÎöºÍ¼Ä´æÆ÷·ÖÅä¶éÂä¡£Ê×ÏÈ£¬´Ó©¶´Ñù±¾µÄ¿ØÖÆÁ÷ͼ¿ªÊ¼¡£
ÆäÖУ¬ÔÚBlock 4ÓÐÈçϵÄ×Ö½ÚÂ룺
·ûºÅs10´ú±í[1337]£¬s6´ú±íconstÐÞÊεÄarr¡£Æ¾¾Ý±àÒëÔÀíµÄÊõÓ±äÁ¿»ñÈ¡½ç˵ֵ³ÆΪdef£¬±äÁ¿Öµ±»Ê¹ÓóÆΪuse£¬ÔÚInitConstÖ¸ÁîÖÐs6±»def£¬s10±»use£¬ËæºóÔÚStElemCÕâÌõÖ¸ÁîÏ£¬s6±»use¡£¿ÉÒÔ¿´µ½s6Óës10¹ØϵÃÜÇУ¬s6¿ÉÒÔ¿´×÷s10ƾ¾ÝÁíÒ»ÖÖÒªÁì¶Ôͬһ±äÁ¿µÄÒýÓã¬ChakraCore³ÆΪcopy-prop·ûºÅ¶ÔÔʼ·ûºÅµÄÒýÓᣵ«µ÷ÊÔÏÔʾ£¬ÕâÀï·¢ÉúÁË´íÎó¡£
Èç´ËÒ»À´ÐγÉÁËÔʼ·ûºÅΪs10£¬copy-prop·ûºÅΪs6£¬¼´s6->s10µÄ¼üÖµ¶Ô¡£ÆäÕ»»ØËÝλÓÚ£º
´íÎó¼üÖµ¶ÔÊÇƾ¾ÝÊý¾ÝÁ÷·ÖÎöµÄ´íÎó½á¹ûµÃ³öµÄ¡£Ëæºó£¬Õâ¸ö¼üÖµ¶Ô±»¼ÓÈëÁËBlock 4ÖÐblockOptData->capturedValues->copyPropSyms£¬ÆäÕ»»ØËÝλÓÚ£º
Ëæºó£¬ÔÚJIT ForwardPassÕâÑù´ÓÇ°ÏòºóµÄÓÅ»¯¹ý³ÌÖУ¬Block 4µÄblockOptData->capturedValues±»ºÏ²¢¸øBlock 5£¬ÆäÖаüÂÞs6->s10ÕâÒ»¼üÖµ¶Ô£¬ÆäÕ»»ØËÝλÓÚ£º
ÔÙÖ®ºó£¬ÔÚJIT BackwardPassÕâÑù´ÓºóÏòÇ°µÄÓÅ»¯¹ý³ÌÖУ¬Block 5µÄupwardExposedUsesͨ¹ý·ÃÎÊblockOptData->capturedValues->copyPropSyms£¬°Ñs6->s10ÕâÒ»¼üÖµ¶Ô¼ÓÈë¡£ÆäÕ»»ØËÝλÓÚ£º
upwardExposedUsesÔÚ±àÒëÔÀíÖб»³ÆΪ¡°ÏòÉÏ̻¶µÄʹÓá±£¬ËüÊDZäÁ¿»îÔ¾ÐÔ·ÖÎöµÄ¶Ô³Æ¹ý³Ì¡£ËæºóÔÚ·´ÏòÁ÷´«µÄ¹ý³ÌÖУ¬º¬ÓÐÉÏÊö¼üÖµ¶ÔµÄupwardExposedUses±»Í¨±¨¸øBlock 4¡¢Block 3ºÍBlock 2¡£¶ø×÷ΪLoop HeaderµÄBlock 2½«ÆäupwardExposedUsesÓÃÓÚ»îÔ¾ÐÔ·ÖÎöºÍºóÐøµÄ¼Ä´æÆ÷·ÖÅä¹ý³Ì¡£
ÉÏÊö¹ý³Ì¿ÉÒÔͨ¹ýÏÂͼÀ´ÌåÏÖ¡£¿ÉÒÔ¿´µ½£¬´íÎóµÄÊý¾Ý¾¹ýÁËÕýÏòÁ÷´«ºÍ·´ÏòÁ÷´«£¬×îÖÕÔÚÑ»·ÌåµÄÈ«²¿·¶Î§¶¼±»ÎÛȾ¡£
Ëæºó£¬ÓÉÓÚÉÏÊö´íÎóÊý¾Ý£¬ÔÚJITµÄ¼Ä´æÆ÷·ÖÅä¹ý³ÌΪs10¼ÆËã³öÁË´íÎóµÄÉúÃüÖÜÆÚ£¬ÆäÉúÃüÖÜÆÚºá¿çÑ»·µÄ¿ªÊ¼µ½½áÊø¡£ÓÚÊÇÒõ²îÑô´í£¬JIT²åÈëÁËÒ»¸öMOVÖ¸ÁÐÎÈçMOV labelReg, mem£¬µ«²¢Ã»Óгõʼ»¯Æäinstr->src->m_offset£¬¸ÃֵʼÖÕΪ0¡£ÔÚ×îºóÉú³É»úÆ÷ÂëµÄʱºò£¬Éú³ÉÁËÒ»¸öÖ¸ÏòÕ»Ö¡Ö¸Õ롢ƫÒÆΪ0µÄ¶ÁÄÚ´æ²Ù×÷£¬ÌåÏÖΪ[EBP+0x0]»ò[RBP+0x0]¡£
ÕâÑù£¬Ò»¸ö·ÇÔ¤ÆÚµÄÄÚ´æ·ÃÎÊ°Ñ·Ç·¨µÄÊý¾Ý¶ÁÈëÁËJavaScriptÒýÇæÉÏÏÂÎÄ£¬ËæºóÔÚBailOut»òÆäËûÇé¿ö»áÒýÓõ½£¬ÕâÑùµÄ·Ç·¨Êý¾Ý½«»áÔì³ÉÀàÐÍ»ìÏý¡£
PART2
Ôì³ÉÉÏÊö´íÎóÊý¾ÝÁ÷´«µÄÔÒòÔÚÓÚInitConstÕâÒ»Ö¸ÁîÆäʵûÓÐÔÚChakraCoreµÄJIT´úÂëÖеõ½ÕýÈ·µÄÊý¾ÝÁ÷·ÖÎö£¬Òò´ËÔÚ΢ÈíµÄÐÞ¸´ÖУ¬ÔÚJIT¸Õ¿ªÊ¼½éÈëµÄʱºò£¬InitConstÖ¸Áî¾Í±»Ìæ»»³ÉLd_AÖ¸Áî¡£
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