¡¾¸´ÏÖ¡¿Chrome V8¶ÑɳÏäÈÆÌ«¹ýÎö

Ðû²¼Ê±¼ä 2025-04-30

1.Ñо¿Åä¾°


V8ÊÇGoogle Chrome¾ç±¾ÓïÑÔ£¨JavaScript£©µÄÆÊÎöÒýÇæ¡£¡£¡£¡£¡£¡£¶àÄêÀ´GoogleÇå¾²ÍŶÓÒ»Ö±ÖÂÁ¦ÓÚÌáÉýV8µÄÇå¾²ÐÔ£¬£¬ £¬£¬£¬£¬ £¬µ«V8Îó²îÈÔ²ã³ö²»Çî¡£¡£¡£¡£¡£¡£³ýÁ˾­µäµÄÄÚ´æÆÆËð¡¢ÔËÐÐʱÎÊÌ⣬£¬ £¬£¬£¬£¬ £¬V8ÓÅ»¯±àÒëÆ÷µÄÂß¼­ÎÊÌâת»¯ÎªÄÚ´æÆÆËðÊÇV8Îó²îÖеĵ䷶¡£¡£¡£¡£¡£¡£ÈôÊDZàÒëÆ÷×Ô¼º¾ÍÊǹ¥»÷Ãæ£¬£¬ £¬£¬£¬£¬ £¬ÌìÉúÓÐÎó²îµÄ´úÂëÔÚËùÄÑÃâ¡£¡£¡£¡£¡£¡£Í¨¹ý½ÓÄÉÄÚ´æÇå¾²µÄ±à³ÌÓïÑÔ»òÕßÓ²¼þÇå¾²²»¿É»º½âÕâÖÖÎÊÌâ¡£¡£¡£¡£¡£¡£ÔÚÕâÖÖÇéÐÎÏ£¬£¬ £¬£¬£¬£¬ £¬GoogleÇå¾²Ìá³öV8ɳÏ䣬£¬ £¬£¬£¬£¬ £¬½«V8¶ÑÉúÑÄÔÚ1TBµÄɳÏäÄÚ£¬£¬ £¬£¬£¬£¬ £¬½«Ê¹ÓÃV8Îó²îÔì³ÉµÄÆÆËðÏÞÖÆÔÚɳÏäÄÚ¡£¡£¡£¡£¡£¡£¹¥»÷ÕßΪÁËÄܽøÒ»²½½á¹¹í§ÒâÄÚ´æ¶Áд£¬£¬ £¬£¬£¬£¬ £¬±ØÐèÕÒµ½ÄÜÈÆ¹ýV8ɳÏäµÄÎó²î¡£¡£¡£¡£¡£¡£


ÀíÏëÇéÐÎÏ£¬£¬ £¬£¬£¬£¬ £¬V8ɳÏäʹµÃä¯ÀÀÆ÷×ÝÈ»ÔËÐв»Çå¾²µÄ´úÂëÒ²²»»áÔì³É¹¥»÷Íþв¡£¡£¡£¡£¡£¡£ È»¶øÊÂʵ²¢·ÇÔÆÔÆ¡£¡£¡£¡£¡£¡£ÔÚpwn2own2024½ÇÖðÖУ¬£¬ £¬£¬£¬£¬ £¬Manfred PaulʹÓÃÁËÒ»¸öV8ÖеÄÀàÐÍ»ìÏýÎó²î£¨CVE-2024-2887£©¿ØÖÆÉ³ÏäÄÚµÄÄڴ棬£¬ £¬£¬£¬£¬ £¬Í¬Ê±Ò²Åû¶ÁËÒ»ÖÖÈÆ¹ýV8ɳÏäµÄÒªÁì¡£¡£¡£¡£¡£¡£¼øºÚµ£±£ÍøADLabÑо¿Ö°Ô±×ÅÖØÆÊÎö¸´ÏÖÁ˸ÃV8ɳÏäµÄÈÆ¹ýÒªÁ죬£¬ £¬£¬£¬£¬ £¬²¢ÌáÐÑGoogle ChromeÓû§ÊµÊ±¸üÐÂä¯ÀÀÆ÷£¬£¬ £¬£¬£¬£¬ £¬×èÖ¹Êܵ½NDayÍþв¡£¡£¡£¡£¡£¡£


2.V8ɳÏä


V8ɳÏäµÄ·ºÆð£¬£¬ £¬£¬£¬£¬ £¬½«Àú³ÌµØµã¿Õ¼ä·ÖΪV8ɳÏäÄÚ´æºÍV8ɳÏäÍâÄڴ棬£¬ £¬£¬£¬£¬ £¬ÎªÁ˱ÜÃâí§ÒâÄÚ´æ¶Áд£¬£¬ £¬£¬£¬£¬ £¬Õ¥È¡Ê¹ÓÃΣÏÕµÄԭʼָÕë¡£¡£¡£¡£¡£¡£É³ÏäÄڵŤ¾ßͨ¹ý¶ÔɳÏä»ùµØµãµÄÆ«ÒÆÒýÓᣡ£¡£¡£¡£¡£ÈçÏÂÃæµÄArrayBufferµÄÄÚ´æ½á¹¹£¬£¬ £¬£¬£¬£¬ £¬ºó¶Ë´æ´¢Êý¾ÝµÄԭʼָÕ루×ÏÉ«²¿·Ö£©ÓÉɳÏä»ùÖ·Æ«ÒÆÈ¡´ú£º


ͼƬ1.png


V8Íⲿ¹¤¾ß£¨ÈçBlink¹¤¾ß£©Í¨¹ýÍⲿË÷Òý±íÒýÓᣡ£¡£¡£¡£¡£ÎªÁË¿ØÖÆÁ÷ÍêÕûÐÔ£¬£¬ £¬£¬£¬£¬ £¬´úÂëºÍËüµÄÔªÊý¾ÝµÈΣÏÕ¹¤¾ßÒ²ÒªÒÆµ½É³ÏäÍ⣬£¬ £¬£¬£¬£¬ £¬ÓÉ´úÂëË÷Òý±íÒÔ¼°ÐÅÈαíÒýÓᣡ£¡£¡£¡£¡£ÐÅÈαíÓÃÓÚ¶Ô²»°üÀ¨Ô­Ê¼Ö¸ÕëµÄV8¹¤¾ß£¨ÈçBytecode ¡¢Code metadata£©µÄË÷Òý£¬£¬ £¬£¬£¬£¬ £¬ÕâЩ¹¤¾ßËäÈ»²»°üÀ¨Ö¸Õ룬£¬ £¬£¬£¬£¬ £¬µ«Ê¹ÓÃÕâЩ¹¤¾ßÈÔ¿ÉÄÜÍ»ÆÆÉ³Ïä¡£¡£¡£¡£¡£¡£V8ɳÏäÕûÌåµÄÉè¼ÆÍ¼ÈçÏ£º


ͼƬ2.png


V8ɳÏäµÄ·ºÆðÔöÌíÁËʹÓÃÁ´µÄ³¤¶È£¬£¬ £¬£¬£¬£¬ £¬Ò»¶¨Ë®Æ½ÉÏïÔÌ­ÁËV8Îó²î¶Ôä¯ÀÀÆ÷Çå¾²´øÀ´µÄ¹¥»÷Íþв¡£¡£¡£¡£¡£¡£¹¥·ÀÏàÉúÏà¿Ë£¬£¬ £¬£¬£¬£¬ £¬ÔÚpwn2own2024½ÇÖðÖУ¬£¬ £¬£¬£¬£¬ £¬Manfred Paul¾ÍʹÓÃÒ»¸öÕûÊýÒç³öÎó²îÈÆ¹ýÁËV8ɳÏä¡£¡£¡£¡£¡£¡£


3.Îó²îÆÊÎö


ÔÚɳÏä·ºÆðǰ£¬£¬ £¬£¬£¬£¬ £¬Í¨¹ýArrayBufferÒÔ¼°Æä¶ÔÓ¦µÄTypedArrayºó¶Ë´æ´¢¿ÉÓÐÓÿØÖÆí§ÒâÄÚ´æ¶Áд¡£¡£¡£¡£¡£¡£´ÓÉÏÃæµÄArrayBufferµÄÄÚ´æ½á¹¹¿ÉÖª£¬£¬ £¬£¬£¬£¬ £¬ÏÖÔÚºó¶Ë´æ´¢Ö¸Õë±»Ìæ»»ÎªÉ³ÏäÖ¸Õ룬£¬ £¬£¬£¬£¬ £¬²¢ÇÒ³¤¶È±»ÏÞÖÆÔÚ235 £¬£¬ £¬£¬£¬£¬ £¬ÓÐÓÃ×èÖ¹ÁËʹÓÃÕâÖÖÒªÁìí§Òâ¶Áд¡£¡£¡£¡£¡£¡£


Ëæ×ÅResizable ArrayBufferµÄ·ºÆð£¬£¬ £¬£¬£¬£¬ £¬¶ÔArrayBufferºÍSharedArrayBufferÒÔ¼°ËûÃǵÄType ViewµÄ»á¼û±äµÃÔ½·¢Öش󡣡£¡£¡£¡£¡£ÏêϸÀ´½²¹ØÓÚArrayBufferºÍSharedArrayBufferµÄ½á¹¹º¯ÊýÌí¼ÓÁËmaximum length£¬£¬ £¬£¬£¬£¬ £¬ArrayBufferÄܹ»ËæÊ±ÔöÌíºÍËõ¼õ»º´æ´óС£¡£¡£¡£¡£¡£¬£¬ £¬£¬£¬£¬ £¬¶øSharedArraybufferÄܹ»ËæÊ±ÔöÌí»º´æ¾Þϸ¡£¡£¡£¡£¡£¡£ÔÚ¹¤¾ß½¨Éèºó»º´æµÄ¶¯Ì¬×ª±ä£¬£¬ £¬£¬£¬£¬ £¬ÖÂʹÿ´Î»á¼ûºó¶Ë»º´æ¶¼ÒªÖØÐÂÅÌË㻺´æµÄ³¤¶È¡£¡£¡£¡£¡£¡£


ͼƬ3.png


¹ØÓÚÀàÐÍÊý×éµÄ³¤¶ÈÅÌËãÓ¦¸Ã²ÉÈ¡£¡£¡£¡£¡£¡£¨byte_length - byte_offset£©/element_size , ÏÂÃæÊǶÔRAB³¤¶ÈÅÌË㣺


ͼƬ4.png


Ïà½ÏÓÚRAB¹ØÓÚbyte_lengthºÍbyte_offsetµÄÒç³ö¼ì²é£¬£¬ £¬£¬£¬£¬ £¬GSABȱÉÙÕûÊýÒç³ö¼ì²é£¬£¬ £¬£¬£¬£¬ £¬ÔÚÓµÓÐɳÏäÄÚÄÚ´æÆÆËðµÄÄÜÁ¦Ï£¬£¬ £¬£¬£¬£¬ £¬ÕâÁ½¸öÖµÍêÈ«¿É¿Ø£¬£¬ £¬£¬£¬£¬ £¬µ±byte_offset´óÓÚbyte_length, ØÊºó¶Ë´æ´¢ºóµÄÕû¸öµØµã¿Õ¼ä¿É¿Ø£¬£¬ £¬£¬£¬£¬ £¬ÍêÈ«Í»ÆÆV8ɳÏ䣬£¬ £¬£¬£¬£¬ £¬µÖ´ïɳÏäÍâÄÚ´æ¶Áд¡£¡£¡£¡£¡£¡£


ͼƬ5.png


4.Îó²î¸´ÏÖ


½¨ÉèGSAB (ab)¹¤¾ß£¬£¬ £¬£¬£¬£¬ £¬lengthΪ0x3000£¬£¬ £¬£¬£¬£¬ £¬maxByteLengthΪ0x6000£»£»£»£»£»£»½¨ÉèÀàÐÍÊý×éUint8Array (dv)£¬£¬ £¬£¬£¬£¬ £¬Æ«ÒÆÖµÎª0x2000 £»£»£»£»£»£»ÓÅ»¯funcº¯Êýƾ֤ÌṩµÄË÷Òý£¨i£©¸øÀàÐÍÊý×éÔªËØ£¨dv[i]£©¸³Öµ£¨0x88£©¡£¡£¡£¡£¡£¡£


´òÓ¡ÀàÐÍÊý×鹤¾ß£¨dv£©ÒÔ±ãÓÚÉó²éØÊºó¶Ë´æ´¢Ö¸Õ룬£¬ £¬£¬£¬£¬ £¬Ê¹ÓÃɳÏäÄÚдº¯ÊýÐÞ¸ÄÀàÐÍÊý×飨dv£©µÄÆ«ÒÆÎª0x8000£¨ÓÉÓÚÄÚ´æ´æ´¢ÕûÊýֵΪÏÖʵֵµÄ2±¶£¬£¬ £¬£¬£¬£¬ £¬ÒÔÊÇÏÖÊµÆ«ÒÆÎª0x4000 £©¡£¡£¡£¡£¡£¡£Æ«ÒÆÖµ£¨0x4000£©´óÓÚ³¤¶È(0x3000) ,µ¼ÖÂÕûÊýÒç³ö£¬£¬ £¬£¬£¬£¬ £¬µ±Ê¹Óó¬´óµÄË÷Òý£¨0x10000000000£©Ô½½ç»á¼ûºó¶Ë»º´æÊ±£¬£¬ £¬£¬£¬£¬ £¬ÅÌËãµÄË÷ÒýСÓÚ³¤¶ÈÖµ£¬£¬ £¬£¬£¬£¬ £¬µ¼ÖÂÔ½½çд¡£¡£¡£¡£¡£¡£


¿ÉÒÔ¿´µ½ÀàÐÍÊý×飨dv£©µÄºó¶Ë´æ´¢Ö¸ÕëΪ0x316600002000£º


ͼƬ6.png


V8ɳÏäµÄÄÚ´æ¹æÄ£ÊÇÔÚ1TBµÄµØµã¿Õ¼ä£¬£¬ £¬£¬£¬£¬ £¬³ÌÐòÔÚ¶Ô0x326600002000ɳÏäÍâµÄ²»¿ÉдÄڴ渳ֵ£¨0x88£©Ê±·ºÆðÍ߽⣺


ͼƬ7.png

ͼƬ8.png


5.Îó²îÐÞ¸´


ÔÚBuidLengthº¯Êý³¤¶ÈÅÌËã֮ǰ£¬£¬ £¬£¬£¬£¬ £¬Ìí¼ÓÁ˶Ôbyte_offsetºÍbyte_lengthµÄ½ÏÁ¿£¬£¬ £¬£¬£¬£¬ £¬×èÖ¹·ºÆðÕûÊýÒç³ö£º


ͼƬ9.png


6.Îó²îÓ°Ïì


Chrome before 123.0.6312.86


²Î¿¼Á´½Ó£º

[1]https://docs.google.com/document/d/1FM4fQmIhEqPG8uGp5o9A-mnPB5BOeScZYpkHjo0KKA8/edit?tab=t.0

[2]https://www.zerodayinitiative.com/blog/2024/5/2/cve-2024-2887-a-pwn2own-winning-bug-in-google-chrome

[3]https://github.com/tc39/proposal-resizablearraybuffer

[4]https://chromium-review.googlesource.com/c/v8/v8/+/5385329/4/src/compiler/graph-assembler.cc



¼øºÚµ£±£ÍøÆð¾¢·ÀÓùʵÑéÊÒ£¨ADLab£©


ADLab½¨ÉèÓÚ1999Ä꣬£¬ £¬£¬£¬£¬ £¬ÊÇÖйúÇå¾²ÐÐÒµ×îÔ罨ÉèµÄ¹¥·ÀÊÖÒÕÑо¿ÊµÑéÊÒÖ®Ò»£¬£¬ £¬£¬£¬£¬ £¬Î¢ÈíMAPPÍýÏë½¹µã³ÉÔ±£¬£¬ £¬£¬£¬£¬ £¬¡°ºÚȸ¹¥»÷¡±¿´·¨Ê×ÍÆÕß¡£¡£¡£¡£¡£¡£×èÖ¹ÏÖÔÚ£¬£¬ £¬£¬£¬£¬ £¬ADLabÒÑͨ¹ý CNVD/CNNVD/NVDB/CVEÀÛ¼ÆÐû²¼Çå¾²Îó²î6500Óà¸ö£¬£¬ £¬£¬£¬£¬ £¬Ò»Á¬¼á³Ö¹ú¼ÊÍøÂçÇå¾²ÁìÓòÒ»Á÷Ë®×¼¡£¡£¡£¡£¡£¡£ÊµÑéÊÒÑо¿Æ«Ïòº­¸Ç»ù´¡Çå¾²Ñо¿¡¢Êý¾ÝÇå¾²Ñо¿¡¢5GÇå¾²Ñо¿¡¢AI+Çå¾²Ñо¿¡¢ÎÀÐÇÇå¾²Ñо¿¡¢ÔËÓªÉÌ»ù´¡ÉèÊ©Çå¾²Ñо¿¡¢Òƶ¯Çå¾²Ñо¿¡¢ÎïÁªÍøÇå¾²Ñо¿¡¢³µÁªÍøÇå¾²Ñо¿¡¢¹¤¿ØÇå¾²Ñо¿¡¢ÐÅ´´Çå¾²Ñо¿¡¢ÔÆÇå¾²Ñо¿¡¢ÎÞÏßÇå¾²Ñо¿¡¢¸ß¼¶ÍþвÑо¿¡¢¹¥·À¶Ô¿¹ÊÖÒÕÑо¿¡£¡£¡£¡£¡£¡£Ñо¿Ð§¹ûÓ¦ÓÃÓÚ²úÆ·½¹µãÊÖÒÕÑо¿¡¢¹ú¼ÒÖØµã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨ÒµÇ徲ЧÀ͵È¡£¡£¡£¡£¡£¡£


adlab.jpg