ChakraÒýÇæÖÐJIT±àÒëÓÅ»¯¹ý³ÌÖеÄÊý×éÀàÐÍ»ìºÏ·ì϶·ÖÎö
°ä²¼¹¦·ò 2018-12-18ChakraÊÇÒ»¸öÓÉ΢ÈíΪMicrosoft Edgeä¯ÀÀÆ÷¿ª·¢µÄJavaScriptÒýÇæ¡£ËüÔÚÒ»¸ö¶ÀÁ¢µÄCPUÖ÷ÌâÉϼ´Ê±±àÒë¾ç±¾£¬Óëä¯ÀÀÆ÷²¢ÐС£±¾ÎÄÖØÒª¶ÔChakraÒýÇæÖÐJIT±àÒëÓÅ»¯¹ý³ÌÖеÄÊý×éÀàÐÍ»ìºÏ·ì϶½øÐзÖÎö¡£
JavaScriptÒýÇæµÄ»úÄܶÔÕû¸öä¯ÀÀÆ÷µÄÓ°ÏìÖÁ¹Ø³ÁÒª£¬ JIT±àÒëÓÅ»¯ÊÇΪÁËÌá¸ßChakraÒýÇæ»úÄÜ¡£µ±ÔÚÑ»·Óï¾äÖз´¸´Ö´ÐÐͳһ¶Î¾ç±¾´úÂëʱ£¬ÈôÊÇÚ¹ÊÍÆ÷·´¸´Ö´ÐÐÓйصÄ×Ö½ÚÂ룬ЧÄÜ»áºÜµÍ¡£JITÄܹ»½«Ô´´úÂëÖ±½ÓÌì»îÁ¦ÐµÖ¸Á±ÉÈËÒ»´ÎÖ´ÐÐʱֱ½ÓÖ´ÐлúеָÁî¡£ÔÚChakraÖÐÖ»Óе±Ö¸±êº¯Êý»òÕßÑ»·Óï¾ä±»ÆµÈÔŲÓÃʱ²Å»áÆôÓÃJIT±àÒ룬JIT±àÒëºóÌìÉúÁËÏàÓ¦µÄ»úеָÁÏÂÒ»´ÎŲÓõ½Õâ¸öÓï¾ä»òÊǺ¯Êýʱ¾Í»áÖ±½ÓÖ´ÐлúеָÁî¡£
Ò»µ©JITÌìÉúʵÏÖ£¬·¨Ê½¾ÍÄܹ»Ö±½ÓŲÓÃJITÌìÉúµÄ»úеָÁî¡£ÓÉÓÚJITÊÇÖ±½Ó±àÒëΪ»úеָÁîµÄ£¬ËùÒÔ±ØÒªÔ¤Ïȼٶ¨²Ù×÷Ö¸±êµÄÀàÐÍ¡£ÈôÊDz»Âú×ãJITµÄÈç¹ûµÄ»°£¬´ËJIT´úÂë¾Í²»ÄÜÖ´ÐУ¬²»È»¾Í»á²úÉúÀàÐÍ»ìºÏµÄÃýÎó¡£Òò¶øJIT´úÂëÖÐÉè¼ÆÁËbailoutÖ°ÄÜ£¬Ò»µ©·¢ÏÖ²»Âú×ãÈç¹û¾Í½øÐÐbailout£¬bailout»áÉÕ»ÙÖ´ÐÐJIT´úÂëת»ØÊ¹ÓÃÚ¹ÊÍÆ÷³ÖÐøÖ´ÐÐ×Ö½ÚÂë¡£
2¡¢Êý×éÀàÐÍ»ìºÏ˼·
ChakraÊý×éÄܹ»·ÖΪÈýÀ࣬±ðÀëÊÇNativeIntArray¡¢NativeFloatArrayºÍVarArray¡£NativeIntArrayºÍNativeFloatArrayÊý×éת»¯³ÉVarArrayÊý×é¹ý³ÌÖлὫÊý×éÖеÄÔÊý¾Ýͨ¹ýÒì»ò0xfffc000000000000ת»¯ÎªVarArrayÖеÄÊý¾Ý¡£Ò²¾ÍÊÇ˵VarArray»áͨ¹ýÊý×éÖÐÔªËØµÄ¸ßλÀ´ÅжÏÊý×éÖеÄÔªËØÊÇÊý¾Ý»¹ÊǶÔÏó¡£
NativeIntArrayºÍNativeFloatArrayÖ®¼ä»ìºÏͨ³£²»ÄÜ´øÀ´°²È«ÎÊÌ⣬µ«Êǵ¹Øâ¶þÕߺÍVarArray»ìºÏÖ®ºó¾Í»á³öÏÖÊý¾ÝºÍ¶ÔÏóÎÞ·¨·Ö±æµÄÎÊÌâ¡£
ÏÈ¿´Ò»¶Îµ¥Ò»´úÂë¡£
Õâ¶Î´úÂëÔÚJITÓÅ»¯ºóµÄ²û·¢´ó¾ÖÊÇÕâÑùµÄ¡£
ÈôÊÇÔÚxxx²Ù×÷¹ý³ÌÖн«NativeArrayµÄÀàÐÍŤת³ÉÁËVarArray£¬²¢ÇÒJITµÄÓÅ»¯¹ý³Ì²¢Ã»Óмì²âµ½ÕâÖֱ䶯µÄ»°£¬2.3023e-320¾Í»á±»µ±×÷floatÊý¾Ý´æ·Å½øÈëVarArrayµÄÔªËØÖУ¬ÓÉÓÚÕâ¸ö¹ý³ÌÖÐÊý×éµÄ±ä¶¯ÊÇʼÁÏδ¼°µÄ£¬ËùÒÔ2.3023e-320²¢Ã»ÓÐͨ¹ýÓë0xfffc000000000000Òì»ò¶øÔì³ÉÒ»¸öÄܹ»±»VarArrayʶ´ËÍâfloat£¬ËùÒÔVarArray¶ÔÏóÔÚ¶ÁÈ¡¸ÃÔªËØÊ±»á½«Æäµ±³ÉÒ»¸ö¶ÔÏóÀ´´¦Öá£
ΪÁËʵÏÖÊý×éµÄÀàÐÍ»ìºÏ£¬xxx²Ù×÷Ö÷Á÷µÄ˼·ÓÐÁ½ÖÖ£¬Ò»ÖÖÊÇͨ¹ýûÓмì²âµÄ»Øµ÷À´Åú¸ÄÊý×éµÄÀàÐÍ£¬µÚ¶þÖÖÊÇͨ¹ýºÏÀíµÄº¯ÊýÀ´Åú¸ÄÊý×éµÄÀàÐÍ¡£ÏÂÃæÍ¨¹ýһЩÊ·ý½øÐмòÒª·ÖÎö¡£
2.1 ˼·һ£ºÍ¨¹ý»Øµ÷Åú¸ÄÊý×éÀàÐÍ
ÏÈÀ´¿´Ò»¸öµ¥Ò»µÄÀý×Ó£¬Í¨¹ý»Øµ÷Åú¸ÄÊý×éÀàÐÍ¡£
funcµÄJITÖØÒªÆ¬¶ÎÈçÏ£º
ƾ¾ÝÉÏÊö´úÂ룬Äܹ»¿´µ½call raxÖ®ºó²¢Ã»ÓÐÑéÖ¤Êý×éaÊÇ·ñºÏ·¨¾ÍÖ±½Ó½øÐÐÁ˸³Öµ¡£ÄÇôÈôºÎŤתÊý×éaµÄÀàÐÍÄØ£¿ÎÒÃÇÀ´¿´×îºóÒ»´Î¶ÔfuncµÄŲÓá£
·ì϶¾ç±¾½«Ò»¸ö¶ÔÏóÖ±½Ó¸³Öµ¸øÁ˲ÎÊýc£¬²¢ÇÒÔÚÕâ¸ö¶ÔÏóÉϹÒÁËÒ»¸övalueOf»Øµ÷£¬cÒª¸³Öµ¸øtypedÊý×éb£¬¶øbÖеÄÔªËØÖ»ÄÜÊÇUint32ÀàÐÍ£¬ËùÒÔJIT»á¶Ô²ÎÊýc½øÐÐÒ»¸öת»»£¨Óõ½ToInt32£©£¬Õâ»á´¥·¢cµÄvalueOf»Øµ÷£¬Ôڻص÷º¯ÊýÖÐͨ¹ýa[0]={}¸øÊý×éa¸³Öµ£¬Õâ»á½«aÓÉNativeFloatArrayÔì³ÉVarArray£¬¶øºóÐø´úÂëÓÉÓÚûÓвé³aÊý×éŤתËùÒÔ³ÖÐø½«Æäµ±×÷NativeFloatArray¸³ÖµÔì³ÉÁËÀàÐÍ»ìºÏ¡£
²¹¶¡ºóÊÀÂëÈçÏ¡£
ͨ³£À´Ëµ£¬ChakraÒýÇæÔÚ¶ÔJITÖеĻص÷½øÐÐÓÅ»¯Ê±»á˼¿¼Ò»¸ö½Ð×öImplicitCallFlagsµÄ±ê־λ£¬Í¨¹ýÕâ¸ö±ê־룬¾ÍÄܹ»¼ì²âÓû§º¯ÊýÊÇ·ñ¿ÉÄܱ»Å²Óã¬ÈôÊÇÊǵϰ¾Í»áÆô¶¯bailout»ò½øÐÐÓйؼì²â¡£µ«ÊÇÕâÖÖ»úÔì´æÔÚһЩÎÊÌ⣬ºÃ±ÈImplicitCallFlags±ê־λµ½µ×ÔÚʲôµØÎ»»á±»ÖÃ룬ËüÊÇ·ñÄܱ£»¤ËùÓдæÔڻص÷º¯ÊýµÄµØÎ»£¿
Ò»¸öµäÐ͵ÄÀý×Ó£ºCVE-2017-11802
Õâ¸ö·ì϶±ÈÁ¦µ¥Ò»£¬´æÔÚÓÚRegexHelper::StringReplaceº¯ÊýÖУ¬regexpµÄreplace²½Ö裬Äܹ»½ç˵һ¸ö»Øµ÷º¯Êý£¬µ«ÊÇÔÚÆäʵÏÖÖв¢Ã»ÓжԻص÷º¯Êý½øÐб£»¤£¬Ò²¾ÍÊÇ˵Äܹ»Ö±½ÓÔÚregexpµÄreplace²½ÖèÖÐÅú¸ÄÊý×éÀàÐͶø²»±»JIT¼ì²âµ½¡£
¸Ã·ì϶µÄ²¹¶¡Ò²±ÈÁ¦µ¥Ò»£¬Í¨¹ý¶ÔÁ½´¦Å²Óûص÷µÄµØÎ»Ôö³¤ExecuteImplicitCallÑéÖ¤£¬¾ÍÄܹ»½¨²¹¸Ã·ì϶¡£Õâ¸ö²¹¶¡Í¬Ê±½¨²¹ÁËÒ»´¦Î»ÓÚJavascriptArray::ArraySpeciesCreateÖеÄÓÉÓÚ´´½¨Ð¶ÔÏó¶øµ¼ÖµĻص÷¡£
ÕâÖÖ»úÔìÔÚʵÏÖºÍÓÅ»¯¹ý³ÌÖÐÓÐûÓÐ覴ÃÄØ£¿ÏÂÃæÀ´¿´ÁíÒ»¸öÀý×ÓCVE-2018-0840¡£
ÕâÊÇÒ»¸öÖ±½Ó¶ÔExecuteImplicitCallº¯Êý½øÐÐÆ¥µÐµÄ·ì϶£¬ÆäÎÊÌâ×ÔÉíÔÚÓÚExecuteImplicitCallº¯ÊýµÄʵÏÖ£¬Æä´úÂëÆ¬¶ÎÈçÏ¡£
º¯ÊýÊ×ÏÈ»áÖ´ÐÐimplicitCall¶øºó²Å»á¸üÐÂImplicitCallFlags£¬µ¥´¿´Óº¯Êý×ÔÉíÀ´Ë¼¿¼ÈçͬûʲôÎÊÌ⣬µ«ÊÇÕâÀïÃæºöÂÔÁËÒ»¸ö¿ÉÄܾÍÊǻص÷ÔÚÖ´Ðйý³ÌÖÐÈôÊdzöÏÖÁËÒ»¸öÒì³£¸ÃÔõô´¦Öã¬POCÖеÄtypeofʵÏÖλÓÚJavascriptOperators::TypeofElemº¯ÊýÖУ¬ºÍ·ì϶ÓйصĴúÂëÈçÏ¡£
»Øµ÷»áͨ¹ýExecuteImplicitCallº¯Êý½øÐÐŲÓ㬵«Êǻص÷º¯Êý»á´¥·¢Ò»¸öÒì³££¬¸ÃÒì³£»á±»TypeofElem²¶»ñ£¬Ò²¾ÍÊÇ˵ExecuteImplicitCallº¯ÊýÖиüÐÂImplicitCallFlagsµÄ²Ù×÷±»Ìø¹ýÁË£¬ÓÉÓÚ±ê־λûÓб»¸üУ¬ËùÒÔÓÅ»¯¹ý³ÌÖеÄÏàÓ¦ÅÅ´í»úÔìÒ²¾ÍûÓб»ÌìÉú£¬×îÖÕµ¼ÖÂÁË·ì϶µÄ²úÉú¡£
Áí±íÒ»¸öÎÊÌâÊÇCVE-2018-8556£¬Í¨¹ý²¹¶¡ÐÅÏ¢Äܹ»ÖªÂ··ì϶´æÔÚÓÚGlobOptBailOut.cppµÄMayNeedBailOnImplicitCallº¯ÊýÖУ¬´ÓÃû×ÖÄܹ»´§Ä¦£¬Õâ¸öº¯ÊýÖØÒªÕÆ¹ÜÅжÏJITÓÅ»¯¹ý³ÌÖÐÊÇ·ñ¶ÔImplicitCallÌìÉúbailout´úÂë¡£
Ôڸú¯Êý¶Ô¶ÔÏóµÄlengthÊôÐÔ½øÐлñÈ¡µÄ²Ù×÷ÖУ¬ÅжϷµ»ØÖµµÄÂß¼³öÏÖÁËÎÊÌâ¡£
´ÓÂß¼ÉÏ¿´£¬stringºÍÂú×ãIsAnyArray²¢ÇÒ²»µÅ×ÚObjectWithArrayµÄ¶ÔÏó¶¼ÊÇÄܹ»Í¨¹ýÑéÖ¤µÄ£¬Ò²¾ÍÊÇ˵typedarrayÒ²ÊÇÂú×ãǰÌáµÄ¡£
ÈôÊÇÒª¸ø¶ÔÏó»ñÈ¡lengthµÄ²Ù×÷¼Ó»Øµ÷»òÕß¹ýÂ˲Ù×÷£¬¶ÔÏóµÄlengthÊôÐÔµÄconfigurable¸öÐÔ±ØÐëΪtrue£¬stringºÍarrayµÄlength¶¼ÇкÏÕâ¸ö¼Ù¶¨£¬µ«ÊÇtypedarrayÈ´ÊǸöÀý±í£¬ËùÒÔÄܹ»Í¨¹ý¸øtypedarrayµÄlengthÊôÐԼӻص÷µÄ²Ù×÷£¬È¥Ö´ÐÐÓû§½ç˵µÄ´úÂëÀ´´¥·¢ÀàÐÍ»ìºÏ·ì϶¡£
2.2 ˼·¶þ£ºÍ¨¹ýºÏÀíµÄº¯ÊýŲÓÃÅú¸ÄÊý×éÀàÐÍ
½ÓÏÂÀ´¿´µÚ¶þÖÖ˼·£¬Í¨¹ýºÏÀíº¯ÊýŲÓÃÀ´´¥·¢Êý×éÀàÐÍŤת¡£ÔÚһЩº¯Êý´¦ÖÃÖУ¬ÓÉÓÚÖ°ÄÜÔÒò»áŲÓÃToVarArrayº¯Êý¶ÔÊý×éÀàÐͽøÐÐŤת¡£
ÏÂÃæ¾ÙÀý×¢Ã÷¡£
optº¯ÊýµÄJITÓÅ»¯´úÂëÈçÏ£º
Äܹ»¿´µ½£¬ÔÚcall raxÖ®ºó²¢Ã»ÓнøÐÐÊý×éÀàÐ͵ļì²â¾ÍÖ±½Ó¸³ÖµÁË£¬ÄÇôÕâ¸öcallÖе½µ×²úÉúÁËÊ²Ã´ÄØ£¿Õâ¸öcallŲÓÃÁËJavascriptOperators::OP_InitProtoº¯ÊýÀ´³õʼ»¯proto£¬ÔÚ×îºóÒ»´ÎoptŲÓÃʱ£¬½«arrayµ±×÷proto¸øÁËÊôÐÔÁ´£¬ÔÚ¶ÔÊôÐÔÁ´¸³ÖµÊ±£¬ÈôÊǸ³Öµ²ÎÊýÊÇÒ»¸öNativeÊý×éµÄ»°»á½«Æäת»»ÎªVarArray£¨Å²ÓÃÁËToVarArrayº¯Êý£©¡£ÆäŲÓú¯ÊýÕ»ÈçÏ¡£
´ËʱÊý×éµÄÀàÐÍÒѾ²úÉúÁËŤת¶øJIT²¢Ã»Óв鳵½ÕâÒ»µãËùÒÔ²úÉúÁË·ì϶¡£
ÔÙÀ´¿´Ò»¸ö½ÏΪ¸´ÔÓµãµÄÀý×ÓCVE-2018-0835¡£
¸Ã·ì϶´æÔÚÓÚJavascriptArray::ReverseHelperº¯ÊýÖУ¬º¯Êý»áŲÓÃJavascriptArray::FillFromPrototypes£¬¸Ãº¯Êýͨ¹ý±éÀúprototypeÀ´Ìî³äarray¡£
ÔÚ·¨Ê½ÖУ¬º¯ÊýÈ·±£prototypeÖеÄarray²»ÄÜÊÇNativeArray¡£
Ò²¾ÍÊÇ˵£¬ÈôÊÇprototypeÊÇNativeArrayÊý×éÔò»á±»·¨Ê½×ª»»ÎªVarArray£¬ÈôÊÇ¿ÉÄÜʹһ¸öÊý×éµÄprototypeΪNativeArray£¬¾ÍÄܹ»Í¨¹ýÊý×éµÄReverse²½Ö轫ÆäprototypeµÄNativeArrayת»»ÎªVarArray¡£²»ÍâÕâÀﻹÓÐÒ»¸öÎÊÌâ¾ÍÊÇÈôºÎÈ·±£prototypeÊÇNativeArray£¬Í¨³£Çé¿öÏÂÈôÊÇÒ»¸öÊý×é±»µ±×÷prototype£¬ÔòËü»á±»×ª»¯ÎªVarArray¡£
ÔÚJavascriptArray::EntrySortÖдæÔÚÈçÏ´úÂë¡£
ÈôÊÇarrÊÇÒ»¸öNativeArray£¬ËüÊ×ÏÈ»áÔì³ÉÒ»¸öVarArrayÖ´ÐÐsort»Øµ÷£¬ÔÙ±ä»ØNativeArray£¬ÈôÊÇ¿ÉÄÜÔڻص÷Öн«Õâ¸öarr¸³¸øprototype£¬Ö®ºóËüµÄÀàÐÍÓÖ»á±ä»ØÀ´£¬ÕâÑù¾ÍÄܹ»µÃµ½Ò»¸öÀàÐÍ»ìºÏ·ì϶¡£
2.3 ˼·Èý£ºMissingItem
CVE-2018-0953ͬÑùÒ²ÊÇͨ¹ýº¯ÊýŲÓÃÅú¸ÄÊý×éÀàÐÍ£¬Õâ¸ö·ì϶³ö¸ñÖ®´¦ÔÚÓÚÒý³öÁËÁíÒ»¸ö¹Ø×¢µã£¬¼´Êý×éµÄMissingItem¡£MissingItemÊÇÒ»¸öÊýÖµ£¬ÔÚ64λ·¨Ê½ÉϵÅ×Ú0x8000000280000002¡£ChakraÒýÇæÔÚÊý×é´´½¨µÄʱ³½»áʹÓÃÕâ¸öÖµ¶ÔÊý×éÔªËØ½øÐгõʼ»¯£¬°µÊ¾Êý×éÖиÃÔªËØ»¹Î´½øÐи³Öµ£¬Áí±íÊý×黹»á±£ÁôÒ»¸ö±ê־루NoMissingValues£©À´±êÖ¾´ËÊý×éÊÇ·ñÓÐδ±»¸³ÖµµÄÔªËØ¡£
ÏÈ¿´¿´ÏÂÃæÕâ¶Î´úÂë¡£
µ±Ö´ÐÐÊý×éµÄ¸³Öµ²Ù×÷£¬Å²ÓÃÁËNativeArrayµÄSetItemº¯Êý£¬SetItemº¯ÊýʵÏÖÈçÏ¡£
µ±¸øNativeArray¸³ÖµÊ±£¬ÈôÊÇÕâ¸öÖµµÅ×ÚMissingItem£¬Äܹ»½«NativeArrayת»¯ÎªVarArray¡£ÓÅ»¯Âß¼Èç¹û¶ÔÊý×é½øÐи³ÖµÊÇÒ»¸öºÜ°²È«µÄ²Ù×÷£¬Ö»Óд«Èë²ÎÊý²»ÊÇÒ»¸ö¶ÔÏóÄÇô¾Í²»»áŤתÊý×éÀàÐÍ£¬µ«ÊDz¢Ã»ÓÐ˼¿¼µ½ÈôÊǸ³ÖµµÄÖµµÅ×ÚMissingItemµÄ»°»áÒýÆðÊý×éÀàÐ͵ı䶯£¬ÕýÊÇÕâÖÖºöÂÔµ¼ÖÂÁË·ì϶µÄ²úÉú¡£
Õâ¸ö·ì϶×ÔÉí¼«¶ÈºÃÀí½â£¬µ«ÊÇMissingItem×ÔÉíÓÖÒý³öÁËÒ»Á¬´®µÄÎÊÌâ¡£¸Ã·ì϶µÄ²¹¶¡·¨Ê½½¨²¹ÁËͨ¹ýOP_SetElementIÀ´Å²ÓÃSetItemµÄÇé¿ö£¬µ«ÊÇÕâÑù½¨²¹Ô¶Ô¶²»¹»£¬ÓÉÓڶԸú¯ÊýŲÓõĵØÎ»Æäʵ¼«¶È¶à£¬Òò¶øÕÒ·ì϶µÄ˼·Ôì³ÉÁËѰÕÒΪNativeArray¸³ÖµµÄ¸÷Ààõè¾¶µÄÎÊÌâ¡£
CVE-2018-0953µÄ·ì϶·¢ÏÖÕßlokihardtÔÚ²¹¶¡½¨²¹ºóÓÖÌá³öÁ½ÖÖ˼·À´Èƹý²¹¶¡£¬µÚÒ»¸öÊÇͨ¹ýarraypushÀ´Å²ÓÃSetItem¡£
´¥·¢·ì϶´úÂëÈçÏ£º
ÓÉÓÚͨ¹ýpush¶ÔÊý×é½øÐвåÈëµÄ²Ù×÷»áŲÓÃSetItem£¬ËùÒÔÊý×éŤתµÄÇé¿öÈÔ¾É»á´æÔÚ¡£
µÚ¶þ¸ö˼·ÊÇÏÈÖ±½ÓÅú¸ÄÊý×éµÄÔªËØ£¬ÔÙͨ¹ýcancatÀ´Åú¸ÄÊý×éÀàÐÍ¡£·ì϶´¥·¢´úÂëÈçÏ£º
POCÊ×ÏÈͨ¹ýsetÅú¸ÄÁËÊý×éÖÐÔªËØµÄÖµ¡£
¶ÔÓ¦µÄJIT´úÂëÊÇÕâÑùµÄ¡£
ÔÚÅú¸ÄÁËÊý×éÔªËØºó£¬´´ÔìÁËÒ»¸öÓÐMissingItemµ«ÊÇHasNoMissingValuesµÄarray¡£
½Óמ籾ŲÓÃÁËtriggerº¯Êý£¬ÓÉÓÚÊý×éµÄHasNoMissingValues±êÖ¾Î»ÎªÕæ£¬ÏÂͼ´úÂëÖеÄǰÌáÊÇÂú×ãµÄ¡£
ÓÉÓÚÊý×éÓÐÁËMissingItem£¬ËùÒÔÄܹ»½øÐе½ÈçÏ·ÖÖ§¡£
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À´µÃµ½Ò»¸öÀàÐÍ»ìºÏ·ì϶¡£
ÖµµÃÒ»ÌáµÄÊÇ£¬ÔÚ11ÔµIJ¹¶¡ÖÐChakraÖ±½Ó¶Ôconcat²½Öè×öÁËÑϸñµÄ´¦Ö㬴ÓÇé¿öÉÏ´§Ä¦Ó¦¸ÃÊÇÕÒµ½ÁËеIJ½ÖèÀ´½«MissingItemдÈëarray£¬µ«ÓÉÓÚÍøÉÏûÕÒµ½ÏàÓ¦µÄÐÅÏ¢£¬ÔÙ¼ÓÉϲ¹¶¡²¢Ã»ÓжԽ«ÖµÐ´ÈëarrayµÄ´úÂë½øÐн¨²¹£¬·´¶øÏÞ¶ÈÁËconcat£¬ËùÒÔÒ²ÎÞ·¨ÅжϾßÌåÇé¿ö¡£
2.4 ˼·ËÄ£º½«Êý×é¼Ù×°³É¶ÔÏó
×îºóÒ»ÖÖ˼·£¬Í¨¹ý¹Æ»óChakraÒýÇæ£¬Ê¹ÆäÔÚÌìÉúJIT´úÂë¹ý³ÌÖÐÃýÎóµÄ½«NativeArrayµ±×÷ÆäËû¶ÔÏó£¬ÒÔÖÁÓÚûÓÐÔÚÊʵ±µÄµØÎ»Ôö³¤²é³´úÂë¡£
¹«¿ªµÄÀý×ÓÊÇCVE-2018-8466¡£
ChakraʹÓÃJavascriptArray::GetArrayForArrayOrObjectWithArrayÀ´Åж϶ÔÏóÊÇ·ñÊÇarray£¬ÆäÂß¼ÈçÏÂËùʾ¡£
ͨ¹ýCrossSite classÀ´wrapÒ»¸ö¶ÔÏóµÄʱ³½»á´úÌæ¸Ã¶ÔÏóµÄÐé±í£¬ËùÒÔ±»wrappingµÄÊý×齫²»»á±»¼ø±ðΪÊý×飬Õ⽫µ¼ÖÂÎÞ·¨ÔÚÕýÈ·µÄ´¦ËùÌìÉú¶ÔÊý×éÀàÐ͵IJ鳲¢²úÉúÀàÐÍ»ìºÏ·ì϶¡£
²¹¶¡³ýÁËÑéÖ¤Ðé±íÊÇ·ñÊÇarray¶ÔÏóÖ®±í£¬»¹²é³Á˶ÔÏóÊÇ·ñÊDZ»CrossSite wrapµÄÊý×é¡£
ÁíÒ»¸öÀý×ÓÊÇCVE-2018-8542£¬Æä²¹¶¡ÔÚValueType::MergeWithObjectÖС£
¸Ãº¯ÊýÖØÒªÓÃÓڹ鲢Á½¸ö¶ÔÏó£¬Äܹ»¿´µ½²¹¶¡Ôö³¤ÁËÑéÖ¤£¬ÓÃÓÚÈ·¶¨Á½¸ö¶ÔÏóÖÐÊÇ·ñº±¼û×飬ÔÙ¹Û²ìÒ»ÏÂû´ò¹ý²¹¶¡µÄÎÊÌâ´úÂ룬ÈôÊÇÁ½¸ö¶ÔÏó¶¼²»ÊÇUninitializedObject£¬Ôò¹é²¢ÎªObject¶ÔÏ󣬴óÌåÄܹ»»ñÖª·ì϶²úÉúµÄÔÒò£¬ÔÚÖ´Ðе½Õâ¾äµÄʱ³½ÈôÊÇÁ½¸ö¶ÔÏóÖÐÓÐÒ»¸öÊÇÊý×飬Ôڹ鲢ʱÊý×é»á±»µ±×÷¶ÔÏóÀ´´¦Öã¬ÓÅ»¯¹ý³ÌÖÐÒýÇæ°Ñ¹é²¢µÄÊý×éµ±×÷Á˶ÔÏó£¬ÄÇô¶ÔÊý×éÀàÐÍÊÇ·ñŤתµÄ¼ì²âµ±È»¾Í²»±»±ØÒª£¬Òò¶ø×îÖÕµ¼ÖÂÁËÀàÐÍ»ìºÏ¡£
3¡¢×Ü ½á
ÔÚ´ÓǰһÄê×óÓÒ£¬JIT±àÒëÓÅ»¯¹ý³ÌÖеÄÀàÐÍ»ìºÏÊÇChakra·ì϶ÍÚ¾ò·½ÃæµÄÒ»¸öÖØÒª¹Ø×¢µã¡£´ÓÔçÆÚµÄÀûÓÃδ±»±£»¤µÄ»ØºÍгÕý³£º¯ÊýÀ´Åú¸ÄÊý×éÀàÐÍ£¬ÔÙµ½Ñ°ÕÒÑéÖ¤¹ý³ÌÖеÄÂß¼ÎÊÌ⣬ÀûÓÃÊý×éµÄMissingItem¸öÐÔ£¬½«Êý×é¼Ù×°³ÉÆäËûÀàÐͶÔÏó˼·£¬ÎÒÃÇÄܹ»¿´µ½Ëæ×Å×êÑÐÕß¶ÔChakraÒýÇæµÄÉî¿Ì×êÑУ¬·ì϶²úÉúµÄµØÎ»ÒѾ´Óµ¥Ò»µÄ¶ÔÏó²½ÖèÂýÂýÏòJITÓÅ»¯´úÂëÌìÉú¹ý³ÌÖвúÉúµÄ¸÷ÀàÂß¼ºÍÅжÏÎÊÌâ°¤½ü£¬·ì϶ÍÚ¾òµÄÃż÷Ò²ÓÐÁËÏÔÖøµÄÌáÉý¡£
GA»Æ½ð¼×»ý¼«·ÀÓù³¢ÊÔÊÒ£¨ADLab£©
ADLab³ÉÁ¢ÓÚ1999Ä꣬ÊÇÖйú°²È«ÐÐÒµ×îÔç³ÉÁ¢µÄ¹¥·À¼¼Êõ×êÑг¢ÊÔÊÒÖ®Ò»£¬Î¢ÈíMAPP´òËãÖ÷Ìâ³ÉÔ±£¬¡°ºÚȸ¹¥»÷¡±¸ÅÏëÊ×ÍÆÕß¡£½ØÖ¹Ä¿Ç°£¬ADLabÒÑͨ¹ýCVEÀۼư䲼°²È«·ì϶½ü1000¸ö£¬Í¨¹ý CNVD/CNNVDÀۼư䲼°²È«·ì϶½ü500¸ö£¬³ÖÐøÎ¬³Ö¹ú¼ÊÍøÂ簲ȫÁìÓòÒ»Á÷Ë®×¼¡£³¢ÊÔÊÒ×êÑз½Ïòº¸Ç²Ù×÷ϵͳÓëÀûÓÃϵͳ°²È«×êÑÓ×¢ÒÆ¶¯ÖÇÄÜÖն˰²È«×êÑÓ×¢ÎïÁªÍøÖÇÄÜÉ豸°²È«×êÑÓ×¢Web°²È«×êÑÓ×¢¹¤¿ØÏµÍ³°²È«×êÑÓ×¢ÔÆ°²È«×êÑС£×êÑгɾÍÀûÓÃÓÚ²úÆ·Ö÷Ìâ¼¼Êõ×êÑÓ×¢¹ú¶È³Áµã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨Òµ°²È«·þÎñµÈ¡£


¾©¹«Íø°²±¸11010802024551ºÅ