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

Ðû²¼Ê±¼ä 2018-12-18
1¡¢Ñо¿Åä¾°

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


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


Ò»µ©JITÉú³ÉÍê³É £¬·¨Ê½¾Í¿ÉÒÔÖ±½Óµ÷ÓÃJITÉú³ÉµÄ»úÆ÷Ö¸Áî¡£ÒòΪJITÊÇÖ±½Ó±àÒëΪ»úÆ÷Ö¸ÁîµÄ £¬ËùÒÔÐèÒªÔ¤Ïȼٶ¨²Ù×÷Ä¿±êµÄÀàÐÍ¡£Èç¹û²»Âú×ã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 £¬µ¥´¿´Óº¯Êý×Ô¼ºÀ´¿¼ÂǺÃÏñûʲôÎÊÌâ £¬µ«ÊÇÕâÀïÃæºöÂÔÁËÒ»¸ö¿ÉÄܾÍÊǻص÷ÔÚÖ´Ðйý³ÌÖÐÈç¹û·ºÆðÁËÒ»¸öÒì³£¸ÃÔõô´¦Öà £¬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ÒªÁì×öÁËÑϸñµÄ´¦Öà £¬´ÓÇé¿öÉÏÍƲâÓ¦¸ÃÊÇÕÒµ½ÁËеÄÒªÁìÀ´½«MissingItemдÈëarray £¬µ«ÓÉÓÚÍøÉÏûÕÒµ½ÏàÓ¦µÄÐÅÏ¢ £¬ÔÙ¼ÓÉϲ¹¶¡²¢Ã»ÓжԽ«ÖµÐ´ÈëarrayµÄ´úÂë½øÐÐÐÞ²¹ £¬·´¶øÏÞÖÆÁËconcat £¬ËùÒÔÒ²ÎÞ·¨ÅжϾßÌåÇé¿ö¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


2.4 ˼·ËÄ£º½«Êý×éαװ³É¹¤¾ß


×îºóÒ»ÖÖ˼· £¬Í¨¹ýÃÔ»óChakraÒýÇæ £¬Ê¹ÆäÔÚÉú³ÉJIT´úÂë¹ý³ÌÖдíÎóµÄ½«NativeArray¿´³ÉÆäËû¹¤¾ß £¬ÒÔÖÁÓÚûÓÐÔÚÇ¡µ±µÄλÖÃÌí¼Ó¼ì²é´úÂë¡£


¹ûÈ»µÄÀý×ÓÊÇCVE-2018-8466¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


²¹¶¡³ýÁËÑéÖ¤Ðé±íÊÇ·ñÊÇarray¹¤¾ßÖ®Íâ £¬»¹¼ì²éÁ˹¤¾ßÊÇ·ñÊDZ»CrossSite wrapµÄÊý×é¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


¸Ãº¯ÊýÖ÷ÒªÓÃÓںϲ¢Á½¸ö¹¤¾ß £¬¿ÉÒÔ¿´µ½²¹¶¡Ìí¼ÓÁËÑéÖ¤ £¬ÓÃÓÚÈ·¶¨Á½¸ö¹¤¾ßÖÐÊÇ·ñÓÐÊý×é £¬ÔÙÊÓ²ìÒ»ÏÂû´ò¹ý²¹¶¡µÄÎÊÌâ´úÂë £¬Èç¹ûÁ½¸ö¹¤¾ß¶¼²»ÊÇUninitializedObject £¬ÔòºÏ²¢ÎªObject¹¤¾ß £¬´óÖ¿ÉÒÔ»ñ֪©¶´·¢ÉúµÄÔ­Òò £¬ÔÚÖ´Ðе½Õâ¾äµÄʱºòÈç¹ûÁ½¸ö¹¤¾ßÖÐÓÐÒ»¸öÊÇÊý×é £¬Ôںϲ¢Ê±Êý×é»á±»¿´³É¹¤¾ßÀ´´¦Öà £¬ÓÅ»¯¹ý³ÌÖÐÒýÇæ°ÑºÏ²¢µÄÊý×é¿´³ÉÁ˹¤¾ß £¬ÄÇô¶ÔÊý×éÀàÐÍÊÇ·ñ¸Ä±äµÄ¼ì²âËäÈ»¾Í²»±»ÐèÒª £¬ÓÚÊÇ×îÖÕµ¼ÖÂÁËÀàÐÍ»ìÏý¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

3¡¢×Ü ½á

ÔÚ¹ýÈ¥Ò»Äê×óÓÒ £¬JIT±àÒëÓÅ»¯¹ý³ÌÖеÄÀàÐÍ»ìÏýÊÇChakra©¶´ÍÚ¾ò·½ÃæµÄÒ»¸öÖ÷Òª¹Ø×¢µã¡£´ÓÔçÆÚµÄÀûÓÃδ±»±£»¤µÄ»Øµ÷ºÍÕý³£º¯ÊýÀ´ÐÞ¸ÄÊý×éÀàÐÍ £¬ÔÙµ½Ñ°ÕÒÑéÖ¤¹ý³ÌÖеÄÂß¼­ÎÊÌâ £¬ÀûÓÃÊý×éµÄMissingItemÌØÐÔ £¬½«Êý×éαװ³ÉÆäËûÀàÐ͹¤¾ß˼· £¬ÎÒÃÇ¿ÉÒÔ¿´µ½Ëæ×ÅÑо¿Õ߶ÔChakraÒýÇæµÄÉîÈëÑо¿ £¬Â©¶´·¢ÉúµÄλÖÃÒѾ­´Ó¼òµ¥µÄ¹¤¾ßÒªÁìÂýÂýÏòJITÓÅ»¯´úÂëÉú³É¹ý³ÌÖз¢ÉúµÄÖÖÖÖÂß¼­ºÍÅжÏÎÊÌ⿿£ £¬Â©¶´ÍÚ¾òµÄÃż÷Ò²ÓÐÁËÏÔÖøµÄÌáÉý¡£

¶«É­Æ½Ì¨»ý¼«·ÀÓùʵÑéÊÒ£¨ADLab£©

ADLab½¨Á¢ÓÚ1999Äê £¬ÊÇÖйúÄþ¾²ÐÐÒµ×îÔ罨Á¢µÄ¹¥·À¼¼ÊõÑо¿ÊµÑéÊÒÖ®Ò» £¬Î¢ÈíMAPP¼Æ»®ºËÐijÉÔ± £¬¡°ºÚȸ¹¥»÷¡±¿´·¨Ê×ÍÆÕß¡£½ØֹĿǰ £¬ADLabÒÑͨ¹ýCVEÀÛ¼ÆÐû²¼Äþ¾²Â©¶´½ü1000¸ö £¬Í¨¹ý CNVD/CNNVDÀÛ¼ÆÐû²¼Äþ¾²Â©¶´½ü500¸ö £¬Á¬Ðø±£³Ö¹ú¼ÊÍøÂçÄþ¾²ÁìÓòÒ»Á÷Ë®×¼¡£ÊµÑéÊÒÑо¿Æ«Ïòº­¸Ç²Ù×÷ϵͳÓëÓ¦ÓÃϵͳÄþ¾²Ñо¿¡¢Òƶ¯ÖÇÄÜÖÕ¶ËÄþ¾²Ñо¿¡¢ÎïÁªÍøÖÇÄÜÉ豸Äþ¾²Ñо¿¡¢WebÄþ¾²Ñо¿¡¢¹¤¿ØϵͳÄþ¾²Ñо¿¡¢ÔÆÄþ¾²Ñо¿¡£Ñо¿½á¹ûÓ¦ÓÃÓÚ²úÎïºËÐļ¼ÊõÑо¿¡¢¹ú¼ÒÖصã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨ÒµÄþ¾²·þÎñµÈ¡£