ChakraÒýÇæÖÐJIT±àÒëÓÅ»¯¹ý³ÌÖеÄÊý×éÀàÐÍ»ìºÏ·ì϶·ÖÎö

°ä²¼¹¦·ò 2018-12-18
1¡¢¡¢×êÑв¼¾°

ChakraÊÇÒ»¸öÓÉ΢ÈíΪMicrosoft Edgeä¯ÀÀÆ÷¿ª·¢µÄJavaScriptÒýÇæ¡£ËüÔÚÒ»¸ö¶ÀÁ¢µÄCPUÖ÷ÌâÉϼ´Ê±±àÒë¾ç±¾£¬£¬£¬Óëä¯ÀÀÆ÷²¢ÐС£±¾ÎÄÖØÒª¶ÔChakraÒýÇæÖÐJIT±àÒëÓÅ»¯¹ý³ÌÖеÄÊý×éÀàÐÍ»ìºÏ·ì϶½øÐзÖÎö¡£


JavaScriptÒýÇæµÄ»úÄܶÔÕû¸öä¯ÀÀÆ÷µÄÓ°ÏìÖÁ¹ØÖØÒª£¬£¬£¬ JIT±àÒëÓÅ»¯ÊÇΪÁËÌá¸ßChakraÒýÇæ»úÄÜ¡£µ±ÔÚÑ­»·Óï¾äÖз´¸´Ö´ÐÐͳһ¶Î¾ç±¾´úÂëʱ£¬£¬£¬ÈôÊÇÚ¹ÊÍÆ÷·´¸´Ö´ÐÐÓйصÄ×Ö½ÚÂ룬£¬£¬Ð§ÄÜ»áºÜµÍ¡£JITÄܹ»½«Ô´´úÂëÖ±½ÓÌì»îÁ¦ÐµÖ¸Á£¬£¬±ÉÈËÒ»´ÎÖ´ÐÐʱֱ½ÓÖ´ÐлúеָÁî¡£ÔÚChakraÖÐÖ»Óе±Ö¸±êº¯Êý»òÕßÑ­»·Óï¾ä±»ÆµÈÔŲÓÃʱ²Å»áÆôÓÃJIT±àÒ룬£¬£¬JIT±àÒëºóÌìÉúÁËÏàÓ¦µÄ»úеָÁ£¬£¬ÏÂÒ»´ÎŲÓõ½Õâ¸öÓï¾ä»òÊǺ¯Êýʱ¾Í»áÖ±½ÓÖ´ÐлúеָÁî¡£


Ò»µ©JITÌìÉúʵÏÖ£¬£¬£¬·¨Ê½¾ÍÄܹ»Ö±½ÓŲÓÃJITÌìÉúµÄ»úеָÁî¡£ÓÉÓÚJITÊÇÖ±½Ó±àÒëΪ»úеָÁîµÄ£¬£¬£¬ËùÒÔ±ØÒªÔ¤Ïȼٶ¨²Ù×÷Ö¸±êµÄÀàÐÍ¡£ÈôÊDz»Âú×ãJITµÄÈç¹ûµÄ»°£¬£¬£¬´ËJIT´úÂë¾Í²»ÄÜÖ´ÐУ¬£¬£¬²»È»¾Í»á²úÉúÀàÐÍ»ìºÏµÄÃýÎó¡£Òò¶øJIT´úÂëÖÐÉè¼ÆÁËbailoutÖ°ÄÜ£¬£¬£¬Ò»µ©·¢ÏÖ²»Âú×ãÈç¹û¾Í½øÐÐbailout£¬£¬£¬bailout»áÉÕ»ÙÖ´ÐÐJIT´úÂëת»ØÊ¹ÓÃÚ¹ÊÍÆ÷³ÖÐøÖ´ÐÐ×Ö½ÚÂë¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


2¡¢¡¢Êý×éÀàÐÍ»ìºÏ˼·

ChakraÊý×éÄܹ»·ÖΪÈýÀ࣬£¬£¬±ðÀëÊÇNativeIntArray¡¢¡¢NativeFloatArrayºÍVarArray¡£NativeIntArrayºÍNativeFloatArrayÊý×éת»¯³ÉVarArrayÊý×é¹ý³ÌÖлὫÊý×éÖеÄÔ­Êý¾Ýͨ¹ýÒì»ò0xfffc000000000000ת»¯ÎªVarArrayÖеÄÊý¾Ý¡£Ò²¾ÍÊÇ˵VarArray»áͨ¹ýÊý×éÖÐÔªËØµÄ¸ßλÀ´ÅжÏÊý×éÖеÄÔªËØÊÇÊý¾Ý»¹ÊǶÔÏó¡£


NativeIntArrayºÍNativeFloatArrayÖ®¼ä»ìºÏͨ³£²»ÄÜ´øÀ´°²È«ÎÊÌ⣬£¬£¬µ«Êǵ±Õâ¶þÕߺÍVarArray»ìºÏÖ®ºó¾Í»á³öÏÖÊý¾ÝºÍ¶ÔÏóÎÞ·¨·Ö±æµÄÎÊÌâ¡£


ÏÈ¿´Ò»¶Îµ¥Ò»´úÂë¡£


OG¶«·½Ìü¡¤(Öйú´ó½)

Õâ¶Î´úÂëÔÚJITÓÅ»¯ºóµÄ²û·¢´ó¾ÖÊÇÕâÑùµÄ¡£

OG¶«·½Ìü¡¤(Öйú´ó½)


ÈôÊÇÔÚxxx²Ù×÷¹ý³ÌÖн«NativeArrayµÄÀàÐÍŤת³ÉÁËVarArray£¬£¬£¬²¢ÇÒJITµÄÓÅ»¯¹ý³Ì²¢Ã»Óмì²âµ½ÕâÖֱ䶯µÄ»°£¬£¬£¬2.3023e-320¾Í»á±»µ±×÷floatÊý¾Ý´æ·Å½øÈëVarArrayµÄÔªËØÖУ¬£¬£¬ÓÉÓÚÕâ¸ö¹ý³ÌÖÐÊý×éµÄ±ä¶¯ÊÇʼÁÏδ¼°µÄ£¬£¬£¬ËùÒÔ2.3023e-320²¢Ã»ÓÐͨ¹ýÓë0xfffc000000000000Òì»ò¶øÔì³ÉÒ»¸öÄܹ»±»VarArrayʶ´ËÍâfloat£¬£¬£¬ËùÒÔVarArray¶ÔÏóÔÚ¶ÁÈ¡¸ÃÔªËØÊ±»á½«Æäµ±³ÉÒ»¸ö¶ÔÏóÀ´´¦Öá£


ΪÁËʵÏÖÊý×éµÄÀàÐÍ»ìºÏ£¬£¬£¬xxx²Ù×÷Ö÷Á÷µÄ˼·ÓÐÁ½ÖÖ£¬£¬£¬Ò»ÖÖÊÇͨ¹ýûÓмì²âµÄ»Øµ÷À´Åú¸ÄÊý×éµÄÀàÐÍ£¬£¬£¬µÚ¶þÖÖÊÇͨ¹ýºÏÀíµÄº¯ÊýÀ´Åú¸ÄÊý×éµÄÀàÐÍ¡£ÏÂÃæÍ¨¹ýһЩʵÀý½øÐмòÒª·ÖÎö¡£


2.1 ˼·һ£ºÍ¨¹ý»Øµ÷Åú¸ÄÊý×éÀàÐÍ


ÏÈÀ´¿´Ò»¸öµ¥Ò»µÄÀý×Ó£¬£¬£¬Í¨¹ý»Øµ÷Åú¸ÄÊý×éÀàÐÍ¡£

OG¶«·½Ìü¡¤(Öйú´ó½)


funcµÄJITÖØÒªÆ¬¶ÎÈçÏ£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ƾ¾ÝÉÏÊö´úÂ룬£¬£¬Äܹ»¿´µ½call raxÖ®ºó²¢Ã»ÓÐÑéÖ¤Êý×éaÊÇ·ñºÏ·¨¾ÍÖ±½Ó½øÐÐÁ˸³Öµ¡£ÄÇôÈôºÎŤתÊý×éaµÄÀàÐÍÄØ£¿£¿£¿ÎÒÃÇÀ´¿´×îºóÒ»´Î¶ÔfuncµÄŲÓá£


OG¶«·½Ìü¡¤(Öйú´ó½)


·ì϶¾ç±¾½«Ò»¸ö¶ÔÏóÖ±½Ó¸³Öµ¸øÁ˲ÎÊýc£¬£¬£¬²¢ÇÒÔÚÕâ¸ö¶ÔÏóÉϹÒÁËÒ»¸övalueOf»Øµ÷£¬£¬£¬cÒª¸³Öµ¸øtypedÊý×éb£¬£¬£¬¶øbÖеÄÔªËØÖ»ÄÜÊÇUint32ÀàÐÍ£¬£¬£¬ËùÒÔJIT»á¶Ô²ÎÊýc½øÐÐÒ»¸öת»»£¨Óõ½ToInt32£©£¬£¬£¬Õâ»á´¥·¢cµÄvalueOf»Øµ÷£¬£¬£¬Ôڻص÷º¯ÊýÖÐͨ¹ýa[0]={}¸øÊý×éa¸³Öµ£¬£¬£¬Õâ»á½«aÓÉNativeFloatArrayÔì³ÉVarArray£¬£¬£¬¶øºóÐø´úÂëÓÉÓÚûÓв鳭aÊý×éŤתËùÒÔ³ÖÐø½«Æäµ±×÷NativeFloatArray¸³ÖµÔì³ÉÁËÀàÐÍ»ìºÏ¡£


²¹¶¡ºóÊÀÂëÈçÏ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ͨ³£À´Ëµ£¬£¬£¬ChakraÒýÇæÔÚ¶ÔJITÖеĻص÷½øÐÐÓÅ»¯Ê±»á˼¿¼Ò»¸ö½Ð×öImplicitCallFlagsµÄ±ê־룬£¬£¬Í¨¹ýÕâ¸ö±ê־룬£¬£¬¾ÍÄܹ»¼ì²âÓû§º¯ÊýÊÇ·ñ¿ÉÄܱ»Å²Ó㬣¬£¬ÈôÊÇÊǵϰ¾Í»áÆô¶¯bailout»ò½øÐÐÓйؼì²â¡£µ«ÊÇÕâÖÖ»úÖÆ´æÔÚһЩÎÊÌ⣬£¬£¬ºÃ±ÈImplicitCallFlags±ê־λµ½µ×ÔÚʲôµØÎ»»á±»ÖÃ룬£¬£¬ËüÊÇ·ñÄܱ£»¤ËùÓдæÔڻص÷º¯ÊýµÄµØÎ»£¿£¿£¿


Ò»¸öµäÐ͵ÄÀý×Ó£ºCVE-2017-11802


OG¶«·½Ìü¡¤(Öйú´ó½)


Õâ¸ö·ì϶±ÈÁ¦µ¥Ò»£¬£¬£¬´æÔÚÓÚRegexHelper::StringReplaceº¯ÊýÖУ¬£¬£¬regexpµÄreplace²½Ö裬£¬£¬Äܹ»½ç˵һ¸ö»Øµ÷º¯Êý£¬£¬£¬µ«ÊÇÔÚÆäʵÏÖÖв¢Ã»ÓжԻص÷º¯Êý½øÐб£»¤£¬£¬£¬Ò²¾ÍÊÇ˵Äܹ»Ö±½ÓÔÚregexpµÄreplace²½ÖèÖÐÅú¸ÄÊý×éÀàÐͶø²»±»JIT¼ì²âµ½¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


¸Ã·ì϶µÄ²¹¶¡Ò²±ÈÁ¦µ¥Ò»£¬£¬£¬Í¨¹ý¶ÔÁ½´¦Å²Óûص÷µÄµØÎ»Ôö³¤ExecuteImplicitCallÑéÖ¤£¬£¬£¬¾ÍÄܹ»ÐÞ²¹¸Ã·ì϶¡£Õâ¸ö²¹¶¡Í¬Ê±ÐÞ²¹ÁËÒ»´¦Î»ÓÚJavascriptArray::ArraySpeciesCreateÖеÄÓÉÓÚ´´½¨Ð¶ÔÏó¶øµ¼ÖµĻص÷¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÕâÖÖ»úÖÆÔÚʵÏÖºÍÓÅ»¯¹ý³ÌÖÐÓÐûÓÐ覴ÃÄØ£¿£¿£¿ÏÂÃæÀ´¿´ÁíÒ»¸öÀý×ÓCVE-2018-0840¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÕâÊÇÒ»¸öÖ±½Ó¶ÔExecuteImplicitCallº¯Êý½øÐÐÆ¥µÐµÄ·ì϶£¬£¬£¬ÆäÎÊÌâ×ÔÉíÔÚÓÚExecuteImplicitCallº¯ÊýµÄʵÏÖ£¬£¬£¬Æä´úÂëÆ¬¶ÎÈçÏ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


º¯ÊýÊ×ÏÈ»áÖ´ÐÐimplicitCall¶øºó²Å»á¸üÐÂImplicitCallFlags£¬£¬£¬µ¥´¿´Óº¯Êý×ÔÉíÀ´Ë¼¿¼ÈçͬûʲôÎÊÌ⣬£¬£¬µ«ÊÇÕâÀïÃæºöÂÔÁËÒ»¸ö¿ÉÄܾÍÊǻص÷ÔÚÖ´Ðйý³ÌÖÐÈôÊdzöÏÖÁËÒ»¸öÒì³£¸ÃÔõô´¦Ö㬣¬£¬POCÖеÄtypeofʵÏÖλÓÚJavascriptOperators::TypeofElemº¯ÊýÖУ¬£¬£¬ºÍ·ì϶ÓйصĴúÂëÈçÏ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


»Øµ÷»áͨ¹ýExecuteImplicitCallº¯Êý½øÐÐŲÓ㬣¬£¬µ«Êǻص÷º¯Êý»á´¥·¢Ò»¸öÒì³££¬£¬£¬¸ÃÒì³£»á±»TypeofElem²¶»ñ£¬£¬£¬Ò²¾ÍÊÇ˵ExecuteImplicitCallº¯ÊýÖиüÐÂImplicitCallFlagsµÄ²Ù×÷±»Ìø¹ýÁË£¬£¬£¬ÓÉÓÚ±ê־λûÓб»¸üУ¬£¬£¬ËùÒÔÓÅ»¯¹ý³ÌÖеÄÏàÓ¦ÅÅ´í»úÖÆÒ²¾ÍûÓб»ÌìÉú£¬£¬£¬×îÖÕµ¼ÖÂÁË·ì϶µÄ²úÉú¡£


±ðµÄÒ»¸öÎÊÌâÊÇCVE-2018-8556£¬£¬£¬Í¨¹ý²¹¶¡ÐÅÏ¢Äܹ»ÖªÏþ·ì϶´æÔÚÓÚGlobOptBailOut.cppµÄMayNeedBailOnImplicitCallº¯ÊýÖУ¬£¬£¬´ÓÃû×ÖÄܹ»´§Ä¦£¬£¬£¬Õâ¸öº¯ÊýÖØÒªÕÆ¹ÜÅжÏJITÓÅ»¯¹ý³ÌÖÐÊÇ·ñ¶ÔImplicitCallÌìÉúbailout´úÂë¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


Ôڸú¯Êý¶Ô¶ÔÏóµÄlengthÊôÐÔ½øÐлñÈ¡µÄ²Ù×÷ÖУ¬£¬£¬ÅжϷµ»ØÖµµÄÂß¼­³öÏÖÁËÎÊÌâ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


´ÓÂß¼­ÉÏ¿´£¬£¬£¬stringºÍÂú×ãIsAnyArray²¢ÇÒ²»µÈÓÚObjectWithArrayµÄ¶ÔÏó¶¼ÊÇÄܹ»Í¨¹ýÑéÖ¤µÄ£¬£¬£¬Ò²¾ÍÊÇ˵typedarrayÒ²ÊÇÂú×ãǰÌáµÄ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)

OG¶«·½Ìü¡¤(Öйú´ó½)


ÈôÊÇÒª¸ø¶ÔÏó»ñÈ¡lengthµÄ²Ù×÷¼Ó»Øµ÷»òÕß¹ýÂ˲Ù×÷£¬£¬£¬¶ÔÏóµÄlengthÊôÐÔµÄconfigurable¸öÐÔ±ØÐëΪtrue£¬£¬£¬stringºÍarrayµÄlength¶¼ÇкÏÕâ¸ö¼Ù¶¨£¬£¬£¬µ«ÊÇtypedarrayÈ´ÊǸöÀýÍ⣬£¬£¬ËùÒÔÄܹ»Í¨¹ý¸øtypedarrayµÄlengthÊôÐԼӻص÷µÄ²Ù×÷£¬£¬£¬È¥Ö´ÐÐÓû§½ç˵µÄ´úÂëÀ´´¥·¢ÀàÐÍ»ìºÏ·ì϶¡£


2.2 ˼·¶þ£ºÍ¨¹ýºÏÀíµÄº¯ÊýŲÓÃÅú¸ÄÊý×éÀàÐÍ


½ÓÏÂÀ´¿´µÚ¶þÖÖ˼·£¬£¬£¬Í¨¹ýºÏÀíº¯ÊýŲÓÃÀ´´¥·¢Êý×éÀàÐÍŤת¡£ÔÚһЩº¯Êý´¦ÖÃÖУ¬£¬£¬ÓÉÓÚÖ°ÄÜÔ­Òò»áŲÓÃToVarArrayº¯Êý¶ÔÊý×éÀàÐͽøÐÐŤת¡£


ÏÂÃæ¾ÙÀý×¢Ã÷¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


optº¯ÊýµÄJITÓÅ»¯´úÂëÈçÏ£º


OG¶«·½Ìü¡¤(Öйú´ó½)


Äܹ»¿´µ½£¬£¬£¬ÔÚcall raxÖ®ºó²¢Ã»ÓнøÐÐÊý×éÀàÐ͵ļì²â¾ÍÖ±½Ó¸³ÖµÁË£¬£¬£¬ÄÇôÕâ¸öcallÖе½µ×²úÉúÁËÊ²Ã´ÄØ£¿£¿£¿Õâ¸öcallŲÓÃÁËJavascriptOperators::OP_InitProtoº¯ÊýÀ´³õʼ»¯proto£¬£¬£¬ÔÚ×îºóÒ»´ÎoptŲÓÃʱ£¬£¬£¬½«arrayµ±×÷proto¸øÁËÊôÐÔÁ´£¬£¬£¬ÔÚ¶ÔÊôÐÔÁ´¸³ÖµÊ±£¬£¬£¬ÈôÊǸ³Öµ²ÎÊýÊÇÒ»¸öNativeÊý×éµÄ»°»á½«Æäת»»ÎªVarArray£¨Å²ÓÃÁËToVarArrayº¯Êý£©¡£ÆäŲÓú¯ÊýÕ»ÈçÏ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


´ËʱÊý×éµÄÀàÐÍÒѾ­²úÉúÁËŤת¶øJIT²¢Ã»Óв鳭µ½ÕâÒ»µãËùÒÔ²úÉúÁË·ì϶¡£


ÔÙÀ´¿´Ò»¸ö½ÏΪ¸´ÔÓµãµÄÀý×ÓCVE-2018-0835¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


¸Ã·ì϶´æÔÚÓÚJavascriptArray::ReverseHelperº¯ÊýÖУ¬£¬£¬º¯Êý»áŲÓÃJavascriptArray::FillFromPrototypes£¬£¬£¬¸Ãº¯Êýͨ¹ý±éÀúprototypeÀ´Ìî³äarray¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÔÚ·¨Ê½ÖУ¬£¬£¬º¯ÊýÈ·±£prototypeÖеÄarray²»ÄÜÊÇNativeArray¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


Ò²¾ÍÊÇ˵£¬£¬£¬ÈôÊÇprototypeÊÇNativeArrayÊý×éÔò»á±»·¨Ê½×ª»»ÎªVarArray£¬£¬£¬ÈôÊÇ¿ÉÄÜʹһ¸öÊý×éµÄprototypeΪNativeArray£¬£¬£¬¾ÍÄܹ»Í¨¹ýÊý×éµÄReverse²½Ö轫ÆäprototypeµÄNativeArrayת»»ÎªVarArray¡£²»ÍâÕâÀﻹÓÐÒ»¸öÎÊÌâ¾ÍÊÇÈôºÎÈ·±£prototypeÊÇNativeArray£¬£¬£¬Í¨³£Çé¿öÏÂÈôÊÇÒ»¸öÊý×é±»µ±×÷prototype£¬£¬£¬ÔòËü»á±»×ª»¯ÎªVarArray¡£


ÔÚJavascriptArray::EntrySortÖдæÔÚÈçÏ´úÂë¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÈôÊÇarrÊÇÒ»¸öNativeArray£¬£¬£¬ËüÊ×ÏÈ»áÔì³ÉÒ»¸öVarArrayÖ´ÐÐsort»Øµ÷£¬£¬£¬ÔÙ±ä»ØNativeArray£¬£¬£¬ÈôÊÇ¿ÉÄÜÔڻص÷Öн«Õâ¸öarr¸³¸øprototype£¬£¬£¬Ö®ºóËüµÄÀàÐÍÓÖ»á±ä»ØÀ´£¬£¬£¬ÕâÑù¾ÍÄܹ»µÃµ½Ò»¸öÀàÐÍ»ìºÏ·ì϶¡£


2.3 ˼·Èý£ºMissingItem


CVE-2018-0953ͬÑùÒ²ÊÇͨ¹ýº¯ÊýŲÓÃÅú¸ÄÊý×éÀàÐÍ£¬£¬£¬Õâ¸ö·ì϶³ö¸ñÖ®´¦ÔÚÓÚÒý³öÁËÁíÒ»¸ö¹Ø×¢µã£¬£¬£¬¼´Êý×éµÄMissingItem¡£MissingItemÊÇÒ»¸öÊýÖµ£¬£¬£¬ÔÚ64λ·¨Ê½¸ßµÈÓÚ0x8000000280000002¡£ChakraÒýÇæÔÚÊý×é´´½¨µÄʱ³½»áʹÓÃÕâ¸öÖµ¶ÔÊý×éÔªËØ½øÐгõʼ»¯£¬£¬£¬°µÊ¾Êý×éÖиÃÔªËØ»¹Î´½øÐи³Öµ£¬£¬£¬±ðµÄÊý×黹»á±£ÁôÒ»¸ö±ê־루NoMissingValues£©À´±êÖ¾´ËÊý×éÊÇ·ñÓÐδ±»¸³ÖµµÄÔªËØ¡£


ÏÈ¿´¿´ÏÂÃæÕâ¶Î´úÂë¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


µ±Ö´ÐÐÊý×éµÄ¸³Öµ²Ù×÷£¬£¬£¬Å²ÓÃÁËNativeArrayµÄSetItemº¯Êý£¬£¬£¬SetItemº¯ÊýʵÏÖÈçÏ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


µ±¸øNativeArray¸³ÖµÊ±£¬£¬£¬ÈôÊÇÕâ¸öÖµµÈÓÚMissingItem£¬£¬£¬Äܹ»½«NativeArrayת»¯ÎªVarArray¡£ÓÅ»¯Âß¼­Èç¹û¶ÔÊý×é½øÐи³ÖµÊÇÒ»¸öºÜ°²È«µÄ²Ù×÷£¬£¬£¬Ö»Óд«Èë²ÎÊý²»ÊÇÒ»¸ö¶ÔÏóÄÇô¾Í²»»áŤתÊý×éÀàÐÍ£¬£¬£¬µ«ÊDz¢Ã»ÓÐ˼¿¼µ½ÈôÊǸ³ÖµµÄÖµµÈÓÚMissingItemµÄ»°»áÒýÆðÊý×éÀàÐ͵ı䶯£¬£¬£¬ÕýÊÇÕâÖÖºöÂÔµ¼ÖÂÁË·ì϶µÄ²úÉú¡£


Õâ¸ö·ì϶×ÔÉí·Ç³£ºÃÀí½â£¬£¬£¬µ«ÊÇMissingItem×ÔÉíÓÖÒý³öÁËÒ»Á¬´®µÄÎÊÌâ¡£¸Ã·ì϶µÄ²¹¶¡·¨Ê½ÐÞ²¹ÁËͨ¹ýOP_SetElementIÀ´Å²ÓÃSetItemµÄÇé¿ö£¬£¬£¬µ«ÊÇÕâÑùÐÞ²¹Ô¶Ô¶²»¹»£¬£¬£¬ÓÉÓڶԸú¯ÊýŲÓõĵØÎ»Æäʵ¼«¶È¶à£¬£¬£¬Òò¶øÕÒ·ì϶µÄ˼·Ôì³ÉÁËѰÕÒΪNativeArray¸³ÖµµÄ¸÷Ààõè¾¶µÄÎÊÌâ¡£


CVE-2018-0953µÄ·ì϶·¢ÏÖÕßlokihardtÔÚ²¹¶¡ÐÞ²¹ºóÓÖÌá³öÁ½ÖÖ˼·À´Èƹý²¹¶¡£¬£¬£¬µÚÒ»¸öÊÇͨ¹ýarraypushÀ´Å²ÓÃSetItem¡£


´¥·¢·ì϶´úÂëÈçÏ£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÓÉÓÚͨ¹ýpush¶ÔÊý×é½øÐвåÈëµÄ²Ù×÷»áŲÓÃSetItem£¬£¬£¬ËùÒÔÊý×éŤתµÄÇé¿öÈÔ¾É»á´æÔÚ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


µÚ¶þ¸ö˼·ÊÇÏÈÖ±½ÓÅú¸ÄÊý×éµÄÔªËØ£¬£¬£¬ÔÙͨ¹ýcancatÀ´Åú¸ÄÊý×éÀàÐÍ¡£·ì϶´¥·¢´úÂëÈçÏ£º


OG¶«·½Ìü¡¤(Öйú´ó½)


POCÊ×ÏÈͨ¹ýsetÅú¸ÄÁËÊý×éÖÐÔªËØµÄÖµ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


¶ÔÓ¦µÄJIT´úÂëÊÇÕâÑùµÄ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÔÚÅú¸ÄÁËÊý×éÔªËØºó£¬£¬£¬´´ÖÆÁËÒ»¸öÓÐMissingItemµ«ÊÇHasNoMissingValuesµÄarray¡£


½Óמ籾ŲÓÃÁËtriggerº¯Êý£¬£¬£¬ÓÉÓÚÊý×éµÄHasNoMissingValues±êÖ¾Î»ÎªÕæ£¬£¬£¬ÏÂͼ´úÂëÖеÄǰÌáÊÇÂú×ãµÄ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÓÉÓÚÊý×éÓÐÁËMissingItem£¬£¬£¬ËùÒÔÄܹ»½øÐе½ÈçÏ·ÖÖ§¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


InternalFillFromPrototypeº¯Êý»á¶ÔbuggyÊý×éprototypeÁ´ÉÏËùÓжÔÏóŲÓÃEnsureNonNativeArray£¬£¬£¬Ò²¾ÍÊÇ˵»á¶ÔarrŲÓÃEnsureNonNativeArray£¬£¬£¬ÕâÑù¾ÍÄܹ»Åú¸ÄÆäÊý×éÀàÐÍ£¬£¬£¬µ«ÊÇJITÒýÇæ²¢²»ÖªÏþarrÀàÐÍÒѾ­Å¤×ª£¬£¬£¬ËùÒԻᵼÖÂÀàÐÍ»ìºÏ¡£

Õë¶Ô´ËÎÊÌ⣬£¬£¬ChakraµÄ¹¤×÷ÈËÔ±ÆðÍ·´ó¹æÄ£µÄ²é³­NativeArrayµÄinput£¬£¬£¬ÔÚLowerStElemC¡¢¡¢


GenerateProfiledNewScObjArrayFastPath¡¢¡¢GenerateHelperToArrayPopFastPathµÈÖî¶àº¯ÊýÉÏÔö³¤ÁËMissItemµÄ¼ì²â£¨ÓÉÓÚÐÞ²¹º¯Êý½Ï¶à£¬£¬£¬ÕâÀï¾Í²»ÖðÒ»ÁоÙÁË£¬£¬£¬ÏêÇéÇë²Î¿¼µØÖ·https://github.com/Microsoft/ChakraCore/commit/91bb6d68bfe0455cde08aaa5fbc3f2e4f6cc9d04£©¡£


µ«ÊÇ£¬£¬£¬Í¨¹ýÈçÏ´úÂëŲÓõÄOP_Memsetº¯Êý²¢Ã»ÓжÔvalue½øÐв鳭£¬£¬£¬ÈÔ¾ÉÄܹ»ÓÃÀ´»ú¹ØÕ¼ÓÐMissingItemµ«ÊÇHasNoMissingValuesµÄarray£¬£¬£¬²¢Í¨¹ýconcatÀ´µÃµ½Ò»¸öÀàÐÍ»ìºÏ·ì϶¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÖµµÃÒ»ÌáµÄÊÇ£¬£¬£¬ÔÚ11ÔµIJ¹¶¡ÖÐChakraÖ±½Ó¶Ôconcat²½Öè×öÁËÑϸñµÄ´¦Ö㬣¬£¬´ÓÇé¿öÉÏ´§Ä¦Ó¦¸ÃÊÇÕÒµ½ÁËеIJ½ÖèÀ´½«MissingItemдÈëarray£¬£¬£¬µ«ÓÉÓÚÍøÉÏûÕÒµ½ÏàÓ¦µÄÐÅÏ¢£¬£¬£¬ÔÙ¼ÓÉϲ¹¶¡²¢Ã»ÓжԽ«ÖµÐ´ÈëarrayµÄ´úÂë½øÐÐÐÞ²¹£¬£¬£¬·´¶øÏÞ¶ÈÁËconcat£¬£¬£¬ËùÒÔÒ²ÎÞ·¨ÅжϾßÌåÇé¿ö¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


2.4 ˼·ËÄ£º½«Êý×é¼Ù×°³É¶ÔÏó


×îºóÒ»ÖÖ˼·£¬£¬£¬Í¨¹ý¹Æ»óChakraÒýÇæ£¬£¬£¬Ê¹ÆäÔÚÌìÉúJIT´úÂë¹ý³ÌÖÐÃýÎóµÄ½«NativeArrayµ±×÷ÆäËû¶ÔÏ󣬣¬£¬ÒÔÖÁÓÚûÓÐÔÚÊʵ±µÄµØÎ»Ôö³¤²é³­´úÂë¡£


¹«¿ªµÄÀý×ÓÊÇCVE-2018-8466¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ChakraʹÓÃJavascriptArray::GetArrayForArrayOrObjectWithArrayÀ´Åж϶ÔÏóÊÇ·ñÊÇarray£¬£¬£¬ÆäÂß¼­ÈçÏÂËùʾ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ͨ¹ýCrossSite classÀ´wrapÒ»¸ö¶ÔÏóµÄʱ³½»á´úÌæ¸Ã¶ÔÏóµÄÐé±í£¬£¬£¬ËùÒÔ±»wrappingµÄÊý×齫²»»á±»¼ø±ðΪÊý×飬£¬£¬Õ⽫µ¼ÖÂÎÞ·¨ÔÚÕýÈ·µÄ´¦ËùÌìÉú¶ÔÊý×éÀàÐ͵IJ鳭²¢²úÉúÀàÐÍ»ìºÏ·ì϶¡£


²¹¶¡³ýÁËÑéÖ¤Ðé±íÊÇ·ñÊÇarray¶ÔÏóÖ®Í⣬£¬£¬»¹²é³­Á˶ÔÏóÊÇ·ñÊDZ»CrossSite wrapµÄÊý×é¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÁíÒ»¸öÀý×ÓÊÇCVE-2018-8542£¬£¬£¬Æä²¹¶¡ÔÚValueType::MergeWithObjectÖС£


OG¶«·½Ìü¡¤(Öйú´ó½)


¸Ãº¯ÊýÖØÒªÓÃÓڹ鲢Á½¸ö¶ÔÏ󣬣¬£¬Äܹ»¿´µ½²¹¶¡Ôö³¤ÁËÑéÖ¤£¬£¬£¬ÓÃÓÚÈ·¶¨Á½¸ö¶ÔÏóÖÐÊÇ·ñº±¼û×飬£¬£¬ÔÙ¹Û²ìÒ»ÏÂû´ò¹ý²¹¶¡µÄÎÊÌâ´úÂ룬£¬£¬ÈôÊÇÁ½¸ö¶ÔÏó¶¼²»ÊÇUninitializedObject£¬£¬£¬Ôò¹é²¢ÎªObject¶ÔÏ󣬣¬£¬´óÌåÄܹ»»ñÖª·ì϶²úÉúµÄÔ­Òò£¬£¬£¬ÔÚÖ´Ðе½Õâ¾äµÄʱ³½ÈôÊÇÁ½¸ö¶ÔÏóÖÐÓÐÒ»¸öÊÇÊý×飬£¬£¬Ôڹ鲢ʱÊý×é»á±»µ±×÷¶ÔÏóÀ´´¦Ö㬣¬£¬ÓÅ»¯¹ý³ÌÖÐÒýÇæ°Ñ¹é²¢µÄÊý×éµ±×÷Á˶ÔÏ󣬣¬£¬ÄÇô¶ÔÊý×éÀàÐÍÊÇ·ñŤתµÄ¼ì²âµ±È»¾Í²»±»±ØÒª£¬£¬£¬Òò¶ø×îÖÕµ¼ÖÂÁËÀàÐÍ»ìºÏ¡£


OG¶«·½Ìü¡¤(Öйú´ó½)

3¡¢¡¢×Ü ½á

ÔÚ´ÓǰһÄê×óÓÒ£¬£¬£¬JIT±àÒëÓÅ»¯¹ý³ÌÖеÄÀàÐÍ»ìºÏÊÇChakra·ì϶ÍÚ¾ò·½ÃæµÄÒ»¸öÖØÒª¹Ø×¢µã¡£´ÓÔçÆÚµÄÀûÓÃδ±»±£»¤µÄ»ØºÍгÕý³£º¯ÊýÀ´Åú¸ÄÊý×éÀàÐÍ£¬£¬£¬ÔÙµ½Ñ°ÕÒÑéÖ¤¹ý³ÌÖеÄÂß¼­ÎÊÌ⣬£¬£¬ÀûÓÃÊý×éµÄMissingItem¸öÐÔ£¬£¬£¬½«Êý×é¼Ù×°³ÉÆäËûÀàÐͶÔÏó˼·£¬£¬£¬ÎÒÃÇÄܹ»¿´µ½Ëæ×Å×êÑÐÕß¶ÔChakraÒýÇæµÄÉî¿Ì×êÑУ¬£¬£¬·ì϶²úÉúµÄµØÎ»ÒѾ­´Óµ¥Ò»µÄ¶ÔÏó²½ÖèÂýÂýÏòJITÓÅ»¯´úÂëÌìÉú¹ý³ÌÖвúÉúµÄ¸÷ÀàÂß¼­ºÍÅжÏÎÊÌâ°¤½ü£¬£¬£¬·ì϶ÍÚ¾òµÄÃż÷Ò²ÓÐÁËÏÔÖøµÄÌáÉý¡£

OG¶«·½Ìü»ý¼«·ÀÓù³¢ÊÔÊÒ£¨ADLab£©

ADLab³ÉÁ¢ÓÚ1999Ä꣬£¬£¬ÊÇÖйú°²È«ÐÐÒµ×îÔç³ÉÁ¢µÄ¹¥·À¼¼Êõ×êÑг¢ÊÔÊÒÖ®Ò»£¬£¬£¬Î¢ÈíMAPP´òËãÖ÷Ìâ³ÉÔ±£¬£¬£¬¡°ºÚȸ¹¥»÷¡±¸ÅÄîÊ×ÍÆÕß¡£½ØÖ¹Ä¿Ç°£¬£¬£¬ADLabÒÑͨ¹ýCVEÀۼư䲼°²È«·ì϶½ü1000¸ö£¬£¬£¬Í¨¹ý CNVD/CNNVDÀۼư䲼°²È«·ì϶½ü500¸ö£¬£¬£¬³ÖÐøÎ¬³Ö¹ú¼ÊÍøÂ簲ȫÁìÓòÒ»Á÷Ë®×¼¡£³¢ÊÔÊÒ×êÑз½Ïòº­¸Ç²Ù×÷ϵͳÓëÀûÓÃϵͳ°²È«×êÑС¢¡¢Òƶ¯ÖÇÄÜÖն˰²È«×êÑС¢¡¢ÎïÁªÍøÖÇÄÜÉ豸°²È«×êÑС¢¡¢Web°²È«×êÑС¢¡¢¹¤¿ØÏµÍ³°²È«×êÑС¢¡¢Ôư²È«×êÑС£×êÑгɾÍÀûÓÃÓÚ²úÆ·Ö÷Ìâ¼¼Êõ×êÑС¢¡¢¹ú¶ÈÖØµã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢¡¢×¨Òµ°²È«·þÎñµÈ¡£