CINXE.COM
Project Zero: February 2021
<!DOCTYPE html> <html class='v2' dir='ltr' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <meta content='width=1100' name='viewport'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='https://googleprojectzero.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='https://googleprojectzero.blogspot.com/2021/02/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Project Zero - Atom" href="https://googleprojectzero.blogspot.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Project Zero - RSS" href="https://googleprojectzero.blogspot.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Project Zero - Atom" href="https://www.blogger.com/feeds/4838136820032157985/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='https://googleprojectzero.blogspot.com/2021/02/' property='og:url'/> <meta content='Project Zero' property='og:title'/> <meta content='News and updates from the Project Zero team at Google' property='og:description'/> <title>Project Zero: February 2021</title> <style type='text/css'>@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;font-stretch:normal;font-display:swap;src:url(//fonts.gstatic.com/s/opensans/v40/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVY.eot);}</style> <style id='page-skin-1' type='text/css'><!-- /* ----------------------------------------------- Blogger Template Style Name: Simple Designer: Blogger URL: www.blogger.com ----------------------------------------------- */ /* Variable definitions ==================== <Variable name="keycolor" description="Main Color" type="color" default="#66bbdd"/> <Group description="Page Text" selector="body"> <Variable name="body.font" description="Font" type="font" default="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="body.text.color" description="Text Color" type="color" default="#222222"/> </Group> <Group description="Backgrounds" selector=".body-fauxcolumns-outer"> <Variable name="body.background.color" description="Outer Background" type="color" default="#66bbdd"/> <Variable name="content.background.color" description="Main Background" type="color" default="#ffffff"/> <Variable name="header.background.color" description="Header Background" type="color" default="transparent"/> </Group> <Group description="Links" selector=".main-outer"> <Variable name="link.color" description="Link Color" type="color" default="#2288bb"/> <Variable name="link.visited.color" description="Visited Color" type="color" default="#888888"/> <Variable name="link.hover.color" description="Hover Color" type="color" default="#33aaff"/> </Group> <Group description="Blog Title" selector=".header h1"> <Variable name="header.font" description="Font" type="font" default="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="header.text.color" description="Title Color" type="color" default="#3399bb" /> </Group> <Group description="Blog Description" selector=".header .description"> <Variable name="description.text.color" description="Description Color" type="color" default="#777777" /> </Group> <Group description="Tabs Text" selector=".tabs-inner .widget li a"> <Variable name="tabs.font" description="Font" type="font" default="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="tabs.text.color" description="Text Color" type="color" default="#999999"/> <Variable name="tabs.selected.text.color" description="Selected Color" type="color" default="#000000"/> </Group> <Group description="Tabs Background" selector=".tabs-outer .PageList"> <Variable name="tabs.background.color" description="Background Color" type="color" default="#f5f5f5"/> <Variable name="tabs.selected.background.color" description="Selected Color" type="color" default="#eeeeee"/> </Group> <Group description="Post Title" selector="h3.post-title, .comments h4"> <Variable name="post.title.font" description="Font" type="font" default="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> </Group> <Group description="Date Header" selector=".date-header"> <Variable name="date.header.color" description="Text Color" type="color" default="#000000"/> <Variable name="date.header.background.color" description="Background Color" type="color" default="transparent"/> <Variable name="date.header.font" description="Text Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="date.header.padding" description="Date Header Padding" type="string" default="inherit"/> <Variable name="date.header.letterspacing" description="Date Header Letter Spacing" type="string" default="inherit"/> <Variable name="date.header.margin" description="Date Header Margin" type="string" default="inherit"/> </Group> <Group description="Post Footer" selector=".post-footer"> <Variable name="post.footer.text.color" description="Text Color" type="color" default="#666666"/> <Variable name="post.footer.background.color" description="Background Color" type="color" default="#f9f9f9"/> <Variable name="post.footer.border.color" description="Shadow Color" type="color" default="#eeeeee"/> </Group> <Group description="Gadgets" selector="h2"> <Variable name="widget.title.font" description="Title Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="widget.title.text.color" description="Title Color" type="color" default="#000000"/> <Variable name="widget.alternate.text.color" description="Alternate Color" type="color" default="#999999"/> </Group> <Group description="Images" selector=".main-inner"> <Variable name="image.background.color" description="Background Color" type="color" default="#ffffff"/> <Variable name="image.border.color" description="Border Color" type="color" default="#eeeeee"/> <Variable name="image.text.color" description="Caption Text Color" type="color" default="#000000"/> </Group> <Group description="Accents" selector=".content-inner"> <Variable name="body.rule.color" description="Separator Line Color" type="color" default="#eeeeee"/> <Variable name="tabs.border.color" description="Tabs Border Color" type="color" default="transparent"/> </Group> <Variable name="body.background" description="Body Background" type="background" color="#eeeeee" default="$(color) none repeat scroll top left"/> <Variable name="body.background.override" description="Body Background Override" type="string" default=""/> <Variable name="body.background.gradient.cap" description="Body Gradient Cap" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="body.background.gradient.tile" description="Body Gradient Tile" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/body_gradient_tile_light.png)"/> <Variable name="content.background.color.selector" description="Content Background Color Selector" type="string" default=".content-inner"/> <Variable name="content.padding" description="Content Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.padding.horizontal" description="Content Horizontal Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.shadow.spread" description="Content Shadow Spread" type="length" default="40px" min="0" max="100px"/> <Variable name="content.shadow.spread.webkit" description="Content Shadow Spread (WebKit)" type="length" default="5px" min="0" max="100px"/> <Variable name="content.shadow.spread.ie" description="Content Shadow Spread (IE)" type="length" default="10px" min="0" max="100px"/> <Variable name="main.border.width" description="Main Border Width" type="length" default="0" min="0" max="10px"/> <Variable name="header.background.gradient" description="Header Gradient" type="url" default="none"/> <Variable name="header.shadow.offset.left" description="Header Shadow Offset Left" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.offset.top" description="Header Shadow Offset Top" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.spread" description="Header Shadow Spread" type="length" default="1px" min="0" max="100px"/> <Variable name="header.padding" description="Header Padding" type="length" default="30px" min="0" max="100px"/> <Variable name="header.border.size" description="Header Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.bottom.border.size" description="Header Bottom Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.border.horizontalsize" description="Header Horizontal Border Size" type="length" default="0" min="0" max="10px"/> <Variable name="description.text.size" description="Description Text Size" type="string" default="140%"/> <Variable name="tabs.margin.top" description="Tabs Margin Top" type="length" default="0" min="0" max="100px"/> <Variable name="tabs.margin.side" description="Tabs Side Margin" type="length" default="30px" min="0" max="100px"/> <Variable name="tabs.background.gradient" description="Tabs Background Gradient" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="tabs.border.width" description="Tabs Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="tabs.bevel.border.width" description="Tabs Bevel Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="post.margin.bottom" description="Post Bottom Margin" type="length" default="25px" min="0" max="100px"/> <Variable name="image.border.small.size" description="Image Border Small Size" type="length" default="2px" min="0" max="10px"/> <Variable name="image.border.large.size" description="Image Border Large Size" type="length" default="5px" min="0" max="10px"/> <Variable name="page.width.selector" description="Page Width Selector" type="string" default=".region-inner"/> <Variable name="page.width" description="Page Width" type="string" default="auto"/> <Variable name="main.section.margin" description="Main Section Margin" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding" description="Main Padding" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding.top" description="Main Padding Top" type="length" default="30px" min="0" max="100px"/> <Variable name="main.padding.bottom" description="Main Padding Bottom" type="length" default="30px" min="0" max="100px"/> <Variable name="paging.background" color="#ffffff" description="Background of blog paging area" type="background" default="transparent none no-repeat scroll top center"/> <Variable name="footer.bevel" description="Bevel border length of footer" type="length" default="0" min="0" max="10px"/> <Variable name="mobile.background.overlay" description="Mobile Background Overlay" type="string" default="transparent none repeat scroll top left"/> <Variable name="mobile.background.size" description="Mobile Background Size" type="string" default="auto"/> <Variable name="mobile.button.color" description="Mobile Button Color" type="color" default="#ffffff" /> <Variable name="startSide" description="Side where text starts in blog language" type="automatic" default="left"/> <Variable name="endSide" description="Side where text ends in blog language" type="automatic" default="right"/> */ /* Content ----------------------------------------------- */ body { font: normal normal 12px Open Sans; color: #000000; background: #eeeeee none repeat scroll top left; padding: 0 0 0 0; } html body .region-inner { min-width: 0; max-width: 100%; width: auto; } h2 { font-size: 22px; } a:link { text-decoration:none; color: #2288bb; } a:visited { text-decoration:none; color: #888888; } a:hover { text-decoration:underline; color: #33aaff; } .body-fauxcolumn-outer .fauxcolumn-inner { background: transparent none repeat scroll top left; _background-image: none; } .body-fauxcolumn-outer .cap-top { position: absolute; z-index: 1; height: 400px; width: 100%; } .body-fauxcolumn-outer .cap-top .cap-left { width: 100%; background: transparent none repeat-x scroll top left; _background-image: none; } .content-outer { -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .15); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 0 0 #333333; box-shadow: 0 0 0 rgba(0, 0, 0, .15); margin-bottom: 1px; } .content-inner { padding: 10px 40px; } .content-inner { background-color: #ffffff; } /* Header ----------------------------------------------- */ .header-outer { background: transparent none repeat-x scroll 0 -400px; _background-image: none; } .Header h1 { font: normal normal 40px Open Sans; color: #000000; text-shadow: 0 0 0 rgba(0, 0, 0, .2); } .Header h1 a { color: #000000; } .Header .description { font-size: 18px; color: #000000; } .header-inner .Header .titlewrapper { padding: 22px 0; } .header-inner .Header .descriptionwrapper { padding: 0 0; } /* Tabs ----------------------------------------------- */ .tabs-inner .section:first-child { border-top: 0 solid #dddddd; } .tabs-inner .section:first-child ul { margin-top: -1px; border-top: 1px solid #dddddd; border-left: 1px solid #dddddd; border-right: 1px solid #dddddd; } .tabs-inner .widget ul { background: transparent none repeat-x scroll 0 -800px; _background-image: none; border-bottom: 1px solid #dddddd; margin-top: 0; margin-left: -30px; margin-right: -30px; } .tabs-inner .widget li a { display: inline-block; padding: .6em 1em; font: normal normal 12px Open Sans; color: #000000; border-left: 1px solid #ffffff; border-right: 1px solid #dddddd; } .tabs-inner .widget li:first-child a { border-left: none; } .tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { color: #000000; background-color: #eeeeee; text-decoration: none; } /* Columns ----------------------------------------------- */ .main-outer { border-top: 0 solid transparent; } .fauxcolumn-left-outer .fauxcolumn-inner { border-right: 1px solid transparent; } .fauxcolumn-right-outer .fauxcolumn-inner { border-left: 1px solid transparent; } /* Headings ----------------------------------------------- */ div.widget > h2, div.widget h2.title { margin: 0 0 1em 0; font: normal bold 11px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; color: #000000; } /* Widgets ----------------------------------------------- */ .widget .zippy { color: #999999; text-shadow: 2px 2px 1px rgba(0, 0, 0, .1); } .widget .popular-posts ul { list-style: none; } /* Posts ----------------------------------------------- */ h2.date-header { font: normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif; } .date-header span { background-color: #bbbbbb; color: #ffffff; padding: 0.4em; letter-spacing: 3px; margin: inherit; } .main-inner { padding-top: 35px; padding-bottom: 65px; } .main-inner .column-center-inner { padding: 0 0; } .main-inner .column-center-inner .section { margin: 0 1em; } .post { margin: 0 0 45px 0; } h3.post-title, .comments h4 { font: normal normal 22px Open Sans; margin: .75em 0 0; } .post-body { font-size: 110%; line-height: 1.4; position: relative; } .post-body img, .post-body .tr-caption-container, .Profile img, .Image img, .BlogList .item-thumbnail img { padding: 2px; background: #ffffff; border: 1px solid #eeeeee; -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); } .post-body img, .post-body .tr-caption-container { padding: 5px; } .post-body .tr-caption-container { color: #666666; } .post-body .tr-caption-container img { padding: 0; background: transparent; border: none; -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .1); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .1); box-shadow: 0 0 0 rgba(0, 0, 0, .1); } .post-header { margin: 0 0 1.5em; line-height: 1.6; font-size: 90%; } .post-footer { margin: 20px -2px 0; padding: 5px 10px; color: #666666; background-color: #eeeeee; border-bottom: 1px solid #eeeeee; line-height: 1.6; font-size: 90%; } #comments .comment-author { padding-top: 1.5em; border-top: 1px solid transparent; background-position: 0 1.5em; } #comments .comment-author:first-child { padding-top: 0; border-top: none; } .avatar-image-container { margin: .2em 0 0; } #comments .avatar-image-container img { border: 1px solid #eeeeee; } /* Comments ----------------------------------------------- */ .comments .comments-content .icon.blog-author { background-repeat: no-repeat; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==); } .comments .comments-content .loadmore a { border-top: 1px solid #999999; border-bottom: 1px solid #999999; } .comments .comment-thread.inline-thread { background-color: #eeeeee; } .comments .continue { border-top: 2px solid #999999; } /* Accents ---------------------------------------------- */ .section-columns td.columns-cell { border-left: 1px solid transparent; } .blog-pager { background: transparent url(//www.blogblog.com/1kt/simple/paging_dot.png) repeat-x scroll top center; } .blog-pager-older-link, .home-link, .blog-pager-newer-link { background-color: #ffffff; padding: 5px; } .footer-outer { border-top: 1px dashed #bbbbbb; } /* Mobile ----------------------------------------------- */ body.mobile { background-size: auto; } .mobile .body-fauxcolumn-outer { background: transparent none repeat scroll top left; } .mobile .body-fauxcolumn-outer .cap-top { background-size: 100% auto; } .mobile .content-outer { -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .15); box-shadow: 0 0 3px rgba(0, 0, 0, .15); } .mobile .tabs-inner .widget ul { margin-left: 0; margin-right: 0; } .mobile .post { margin: 0; } .mobile .main-inner .column-center-inner .section { margin: 0; } .mobile .date-header span { padding: 0.1em 10px; margin: 0 -10px; } .mobile h3.post-title { margin: 0; } .mobile .blog-pager { background: transparent none no-repeat scroll top center; } .mobile .footer-outer { border-top: none; } .mobile .main-inner, .mobile .footer-inner { background-color: #ffffff; } .mobile-index-contents { color: #000000; } .mobile-link-button { background-color: #2288bb; } .mobile-link-button a:link, .mobile-link-button a:visited { color: #ffffff; } .mobile .tabs-inner .section:first-child { border-top: none; } .mobile .tabs-inner .PageList .widget-content { background-color: #eeeeee; color: #000000; border-top: 1px solid #dddddd; border-bottom: 1px solid #dddddd; } .mobile .tabs-inner .PageList .widget-content .pagelist-arrow { border-left: 1px solid #dddddd; } --></style> <style id='template-skin-1' type='text/css'><!-- body { min-width: 1120px; } .content-outer, .content-fauxcolumn-outer, .region-inner { min-width: 1120px; max-width: 1120px; _width: 1120px; } .main-inner .columns { padding-left: 0; padding-right: 310px; } .main-inner .fauxcolumn-center-outer { left: 0; right: 310px; /* IE6 does not respect left and right together */ _width: expression(this.parentNode.offsetWidth - parseInt("0") - parseInt("310px") + 'px'); } .main-inner .fauxcolumn-left-outer { width: 0; } .main-inner .fauxcolumn-right-outer { width: 310px; } .main-inner .column-left-outer { width: 0; right: 100%; margin-left: -0; } .main-inner .column-right-outer { width: 310px; margin-right: -310px; } #layout { min-width: 0; } #layout .content-outer { min-width: 0; width: 800px; } #layout .region-inner { min-width: 0; width: auto; } body#layout div.add_widget { padding: 8px; } body#layout div.add_widget a { margin-left: 32px; } --></style> <script type='text/javascript'> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-240546891-1', 'auto', 'blogger'); ga('blogger.send', 'pageview'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=4838136820032157985&zx=1340865a-3aab-4434-a99c-c00c7a32edd6' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=4838136820032157985&zx=1340865a-3aab-4434-a99c-c00c7a32edd6' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body class='loading'> <div class='navbar section' id='navbar' name='Navbar'><div class='widget Navbar' data-version='1' id='Navbar1'><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar/4838136820032157985?origin\x3dhttps://googleprojectzero.blogspot.com', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe" }); } }); </script><script type="text/javascript"> (function() { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(script); }})(); </script> </div></div> <div class='body-fauxcolumns'> <div class='fauxcolumn-outer body-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content'> <div class='content-fauxcolumns'> <div class='fauxcolumn-outer content-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content-outer'> <div class='content-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left content-fauxborder-left'> <div class='fauxborder-right content-fauxborder-right'></div> <div class='content-inner'> <header> <div class='header-outer'> <div class='header-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left header-fauxborder-left'> <div class='fauxborder-right header-fauxborder-right'></div> <div class='region-inner header-inner'> <div class='header section' id='header' name='Header'><div class='widget Header' data-version='1' id='Header1'> <div id='header-inner'> <div class='titlewrapper'> <h1 class='title'> <a href='https://googleprojectzero.blogspot.com/'> Project Zero </a> </h1> </div> <div class='descriptionwrapper'> <p class='description'><span>News and updates from the Project Zero team at Google</span></p> </div> </div> </div></div> </div> </div> <div class='header-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </header> <div class='tabs-outer'> <div class='tabs-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left tabs-fauxborder-left'> <div class='fauxborder-right tabs-fauxborder-right'></div> <div class='region-inner tabs-inner'> <div class='tabs no-items section' id='crosscol' name='Cross-Column'></div> <div class='tabs no-items section' id='crosscol-overflow' name='Cross-Column 2'></div> </div> </div> <div class='tabs-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='main-outer'> <div class='main-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left main-fauxborder-left'> <div class='fauxborder-right main-fauxborder-right'></div> <div class='region-inner main-inner'> <div class='columns fauxcolumns'> <div class='fauxcolumn-outer fauxcolumn-center-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-left-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-right-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <!-- corrects IE6 width calculation --> <div class='columns-inner'> <div class='column-center-outer'> <div class='column-center-inner'> <div class='main section' id='main' name='Main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='blog-posts hfeed'> <div class="date-outer"> <h2 class='date-header'><span>Wednesday, February 3, 2021</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='4838136820032157985' itemprop='blogId'/> <meta content='2386590713508572091' itemprop='postId'/> <a name='2386590713508572091'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://googleprojectzero.blogspot.com/2021/02/deja-vu-lnerability.html'>D茅j脿 vu-lnerability</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-2386590713508572091' itemprop='description articleBody'> <style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=cGvuclDC_Z1vE_cnVEU6Ae_NZQ7StBcqH_vXVqoPMX0');.lst-kix_r9pow2tp8cv0-3>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-3}ol.lst-kix_r9pow2tp8cv0-8.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-8 0}ol.lst-kix_rh2sjnt7clnl-5.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-5 0}.lst-kix_r9pow2tp8cv0-8>li:before{content:"" counter(lst-ctn-kix_r9pow2tp8cv0-8,lower-roman) ". "}ol.lst-kix_r9pow2tp8cv0-5.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-5 0}ol.lst-kix_rh2sjnt7clnl-2.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-2 0}.lst-kix_xcgzvmnt5e4b-8>li:before{content:"\0025a0 "}.lst-kix_r9pow2tp8cv0-4>li:before{content:"(" counter(lst-ctn-kix_r9pow2tp8cv0-4,lower-latin) ") "}.lst-kix_r9pow2tp8cv0-6>li:before{content:"" counter(lst-ctn-kix_r9pow2tp8cv0-6,decimal) ". "}.lst-kix_r9pow2tp8cv0-3>li:before{content:"(" counter(lst-ctn-kix_r9pow2tp8cv0-3,decimal) ") "}.lst-kix_r9pow2tp8cv0-7>li:before{content:"" counter(lst-ctn-kix_r9pow2tp8cv0-7,lower-latin) ". "}.lst-kix_rh2sjnt7clnl-0>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-0}.lst-kix_r9pow2tp8cv0-4>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-4}ol.lst-kix_rh2sjnt7clnl-8.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-8 0}.lst-kix_r9pow2tp8cv0-5>li:before{content:"(" counter(lst-ctn-kix_r9pow2tp8cv0-5,lower-roman) ") "}.lst-kix_ir94vkdxrs7o-0>li:before{content:"\0025cf "}.lst-kix_ir94vkdxrs7o-2>li:before{content:"\0025a0 "}ul.lst-kix_ir94vkdxrs7o-0{list-style-type:none}ul.lst-kix_ir94vkdxrs7o-1{list-style-type:none}.lst-kix_ir94vkdxrs7o-3>li:before{content:"\0025cf "}ul.lst-kix_ir94vkdxrs7o-2{list-style-type:none}ul.lst-kix_ir94vkdxrs7o-3{list-style-type:none}ul.lst-kix_ir94vkdxrs7o-4{list-style-type:none}ul.lst-kix_ir94vkdxrs7o-5{list-style-type:none}.lst-kix_r9pow2tp8cv0-0>li:before{content:"" counter(lst-ctn-kix_r9pow2tp8cv0-0,decimal) ") "}.lst-kix_r9pow2tp8cv0-2>li:before{content:"" counter(lst-ctn-kix_r9pow2tp8cv0-2,lower-roman) ") "}ul.lst-kix_ir94vkdxrs7o-6{list-style-type:none}.lst-kix_r9pow2tp8cv0-5>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-5}ul.lst-kix_ir94vkdxrs7o-7{list-style-type:none}ul.lst-kix_ir94vkdxrs7o-8{list-style-type:none}.lst-kix_ir94vkdxrs7o-1>li:before{content:"\0025cb "}.lst-kix_r9pow2tp8cv0-1>li:before{content:"" counter(lst-ctn-kix_r9pow2tp8cv0-1,lower-latin) ") "}.lst-kix_rh2sjnt7clnl-1>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-1}.lst-kix_r9pow2tp8cv0-2>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-2}ol.lst-kix_r9pow2tp8cv0-2.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-2 0}.lst-kix_wa1quvbznvvl-0>li:before{content:"\0025cf "}.lst-kix_wa1quvbznvvl-1>li:before{content:"\0025cb "}.lst-kix_r9pow2tp8cv0-0>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-0}ol.lst-kix_r9pow2tp8cv0-3.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-3 0}.lst-kix_rh2sjnt7clnl-0>li:before{content:"" counter(lst-ctn-kix_rh2sjnt7clnl-0,decimal) ") "}.lst-kix_rh2sjnt7clnl-1>li:before{content:"" counter(lst-ctn-kix_rh2sjnt7clnl-1,lower-latin) ") "}.lst-kix_r9pow2tp8cv0-6>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-6}ul.lst-kix_xcgzvmnt5e4b-8{list-style-type:none}.lst-kix_wa1quvbznvvl-2>li:before{content:"\0025a0 "}.lst-kix_rh2sjnt7clnl-2>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-2}.lst-kix_rh2sjnt7clnl-3>li:before{content:"(" counter(lst-ctn-kix_rh2sjnt7clnl-3,decimal) ") "}.lst-kix_wa1quvbznvvl-4>li:before{content:"\0025cb "}.lst-kix_wa1quvbznvvl-5>li:before{content:"\0025a0 "}.lst-kix_wa1quvbznvvl-3>li:before{content:"\0025cf "}.lst-kix_rh2sjnt7clnl-2>li:before{content:"" counter(lst-ctn-kix_rh2sjnt7clnl-2,lower-roman) ") "}.lst-kix_ir94vkdxrs7o-8>li:before{content:"\0025a0 "}ol.lst-kix_rh2sjnt7clnl-3.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-3 0}.lst-kix_ir94vkdxrs7o-6>li:before{content:"\0025cf "}.lst-kix_ir94vkdxrs7o-7>li:before{content:"\0025cb "}.lst-kix_ir94vkdxrs7o-4>li:before{content:"\0025cb "}.lst-kix_ir94vkdxrs7o-5>li:before{content:"\0025a0 "}ol.lst-kix_r9pow2tp8cv0-4.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-4 0}.lst-kix_rh2sjnt7clnl-8>li:before{content:"" counter(lst-ctn-kix_rh2sjnt7clnl-8,lower-roman) ". "}.lst-kix_wa1quvbznvvl-8>li:before{content:"\0025a0 "}.lst-kix_wa1quvbznvvl-6>li:before{content:"\0025cf "}.lst-kix_rh2sjnt7clnl-7>li:before{content:"" counter(lst-ctn-kix_rh2sjnt7clnl-7,lower-latin) ". "}.lst-kix_rh2sjnt7clnl-8>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-8}.lst-kix_rh2sjnt7clnl-4>li:before{content:"(" counter(lst-ctn-kix_rh2sjnt7clnl-4,lower-latin) ") "}.lst-kix_rh2sjnt7clnl-5>li:before{content:"(" counter(lst-ctn-kix_rh2sjnt7clnl-5,lower-roman) ") "}.lst-kix_rh2sjnt7clnl-5>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-5}.lst-kix_wa1quvbznvvl-7>li:before{content:"\0025cb "}.lst-kix_rh2sjnt7clnl-6>li:before{content:"" counter(lst-ctn-kix_rh2sjnt7clnl-6,decimal) ". "}ol.lst-kix_rh2sjnt7clnl-0{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-1{list-style-type:none}.lst-kix_r9pow2tp8cv0-8>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-8}ol.lst-kix_r9pow2tp8cv0-1.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-1 0}.lst-kix_z1i3uqhq0nom-7>li:before{content:"\0025cb "}.lst-kix_z1i3uqhq0nom-8>li:before{content:"\0025a0 "}ul.lst-kix_wa1quvbznvvl-4{list-style-type:none}ul.lst-kix_wa1quvbznvvl-5{list-style-type:none}ul.lst-kix_wa1quvbznvvl-6{list-style-type:none}ul.lst-kix_wa1quvbznvvl-7{list-style-type:none}ul.lst-kix_wa1quvbznvvl-0{list-style-type:none}.lst-kix_rh2sjnt7clnl-6>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-6}ul.lst-kix_wa1quvbznvvl-1{list-style-type:none}ul.lst-kix_wa1quvbznvvl-2{list-style-type:none}ul.lst-kix_wa1quvbznvvl-3{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-1.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-1 0}ul.lst-kix_wa1quvbznvvl-8{list-style-type:none}.lst-kix_rh2sjnt7clnl-4>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-4}ul.lst-kix_xcgzvmnt5e4b-3{list-style-type:none}ul.lst-kix_xcgzvmnt5e4b-2{list-style-type:none}ul.lst-kix_xcgzvmnt5e4b-1{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-4.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-4 0}ul.lst-kix_xcgzvmnt5e4b-0{list-style-type:none}ul.lst-kix_xcgzvmnt5e4b-7{list-style-type:none}ul.lst-kix_xcgzvmnt5e4b-6{list-style-type:none}ul.lst-kix_xcgzvmnt5e4b-5{list-style-type:none}ul.lst-kix_xcgzvmnt5e4b-4{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-0.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-0 0}ol.lst-kix_rh2sjnt7clnl-7.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-7 0}ol.lst-kix_r9pow2tp8cv0-5{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-6{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-7{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-8{list-style-type:none}.lst-kix_rh2sjnt7clnl-7>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-7}ol.lst-kix_r9pow2tp8cv0-6.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-6 0}.lst-kix_r9pow2tp8cv0-7>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-7}.lst-kix_r9pow2tp8cv0-1>li{counter-increment:lst-ctn-kix_r9pow2tp8cv0-1}.lst-kix_rh2sjnt7clnl-3>li{counter-increment:lst-ctn-kix_rh2sjnt7clnl-3}ol.lst-kix_rh2sjnt7clnl-6.start{counter-reset:lst-ctn-kix_rh2sjnt7clnl-6 0}.lst-kix_xcgzvmnt5e4b-0>li:before{content:"\0025cf "}.lst-kix_xcgzvmnt5e4b-1>li:before{content:"\0025cb "}.lst-kix_z1i3uqhq0nom-1>li:before{content:"\0025cb "}.lst-kix_z1i3uqhq0nom-3>li:before{content:"\0025cf "}.lst-kix_xcgzvmnt5e4b-2>li:before{content:"\0025a0 "}.lst-kix_z1i3uqhq0nom-2>li:before{content:"\0025a0 "}.lst-kix_z1i3uqhq0nom-6>li:before{content:"\0025cf "}.lst-kix_z1i3uqhq0nom-5>li:before{content:"\0025a0 "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_xcgzvmnt5e4b-7>li:before{content:"\0025cb "}ol.lst-kix_r9pow2tp8cv0-0.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-0 0}.lst-kix_z1i3uqhq0nom-4>li:before{content:"\0025cb "}ol.lst-kix_r9pow2tp8cv0-1{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-2{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-2{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-3{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-3{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-4{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-4{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-5{list-style-type:none}.lst-kix_xcgzvmnt5e4b-6>li:before{content:"\0025cf "}ul.lst-kix_z1i3uqhq0nom-8{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-6{list-style-type:none}ul.lst-kix_z1i3uqhq0nom-7{list-style-type:none}ol.lst-kix_rh2sjnt7clnl-7{list-style-type:none}.lst-kix_xcgzvmnt5e4b-5>li:before{content:"\0025a0 "}ol.lst-kix_rh2sjnt7clnl-8{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-0{list-style-type:none}.lst-kix_xcgzvmnt5e4b-4>li:before{content:"\0025cb "}ul.lst-kix_z1i3uqhq0nom-4{list-style-type:none}ul.lst-kix_z1i3uqhq0nom-3{list-style-type:none}ol.lst-kix_r9pow2tp8cv0-7.start{counter-reset:lst-ctn-kix_r9pow2tp8cv0-7 0}ul.lst-kix_z1i3uqhq0nom-6{list-style-type:none}ul.lst-kix_z1i3uqhq0nom-5{list-style-type:none}ul.lst-kix_z1i3uqhq0nom-0{list-style-type:none}.lst-kix_xcgzvmnt5e4b-3>li:before{content:"\0025cf "}ul.lst-kix_z1i3uqhq0nom-2{list-style-type:none}.lst-kix_z1i3uqhq0nom-0>li:before{content:"\0025cf "}ul.lst-kix_z1i3uqhq0nom-1{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c28{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#e0e0e0;border-top-width:1pt;border-right-width:1pt;border-left-color:#e0e0e0;vertical-align:top;border-right-color:#e0e0e0;border-left-width:1pt;border-top-style:solid;background-color:#fafafa;border-left-style:solid;border-bottom-width:1pt;width:468pt;border-top-color:#e0e0e0;border-bottom-style:solid}.c30{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:174.8pt;border-top-color:#000000;border-bottom-style:solid}.c32{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:137.2pt;border-top-color:#000000;border-bottom-style:solid}.c12{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:156pt;border-top-color:#000000;border-bottom-style:solid}.c38{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:468pt;border-top-color:#000000;border-bottom-style:solid}.c9{padding-top:20pt;padding-bottom:6pt;line-height:1.5;page-break-after:avoid;text-align:left}.c7{padding-top:16pt;padding-bottom:4pt;line-height:1.5;page-break-after:avoid;text-align:left}.c42{padding-top:0pt;padding-bottom:16pt;line-height:1.5;page-break-after:avoid;text-align:left}.c36{padding-top:18pt;padding-bottom:6pt;line-height:1.5;page-break-after:avoid;text-align:left}.c37{-webkit-text-decoration-skip:none;text-decoration:underline;vertical-align:baseline;text-decoration-skip-ink:none;font-style:normal}.c17{border-spacing:0;border-collapse:collapse;margin-right:auto}.c2{font-size:10pt;font-family:Consolas,"Courier New";color:#000000;font-weight:400}.c11{color:#000000;font-weight:400;font-size:11pt;font-family:"Arial"}.c27{color:#000000;font-weight:400;font-size:20pt;font-family:"Arial"}.c33{color:#000000;font-weight:400;font-size:16pt;font-family:"Arial"}.c8{font-size:10pt;font-family:Consolas,"Courier New";color:#3367d6;font-weight:400}.c0{padding-top:0pt;padding-bottom:0pt;line-height:1.5;text-align:left}.c5{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c18{font-size:10pt;font-family:Consolas,"Courier New";color:#455a64;font-weight:400}.c1{font-size:10pt;font-family:Consolas,"Courier New";color:#616161;font-weight:400}.c16{color:#434343;font-weight:400;font-size:14pt;font-family:"Arial"}.c46{color:#666666;font-weight:400;font-size:15pt;font-family:"Arial"}.c34{font-size:10pt;font-family:Consolas,"Courier New";color:#0f9d58;font-weight:400}.c20{font-size:10pt;font-family:Consolas,"Courier New";color:#c53929;font-weight:400}.c6{font-size:10pt;font-family:Consolas,"Courier New";color:#9c27b0;font-weight:400}.c25{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c29{font-size:10pt;font-family:Consolas,"Courier New";color:#000000}.c44{font-size:10pt;font-family:Consolas,"Courier New";color:#9c27b0}.c24{font-size:10pt;font-family:Consolas,"Courier New";color:#3367d6}.c40{-webkit-text-decoration-skip:none;text-decoration:underline;text-decoration-skip-ink:none}.c43{color:#000000;font-size:11pt;font-family:"Arial"}.c39{font-size:10pt;font-family:Consolas,"Courier New";color:#616161}.c45{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c23{font-family:Consolas,"Courier New";color:#0d904f;font-weight:400}.c4{text-decoration:none;vertical-align:baseline;font-style:normal}.c22{margin-left:36pt;padding-left:0pt}.c3{orphans:2;widows:2}.c41{padding:0;margin:0}.c21{color:inherit;text-decoration:inherit}.c13{height:11pt}.c10{background-color:#ea9999}.c31{font-style:italic}.c15{background-color:#ffff00}.c19{font-weight:700}.c14{background-color:#b6d7a8}.c26{height:0pt}.c35{height:21pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.5;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style></head><body class="c45"><p class="c3 c42 subtitle" id="h.g01b955lvcgn"><span class="c4 c46">A Year in Review of 0-days Exploited In-The-Wild in 2020</span></p><p class="c0 c3"><span class="c11 c4">Posted by Maddie Stone, Project Zero</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>2020 was a year full of 0-day exploits. Many of the Internet’s most popular browsers had their moment in the spotlight. Memory corruption is </span><span class="c31">still</span><span> the name of the game and how the vast majority of detected 0-days are getting in. While we tried new methods of 0-day detection with modest success, 2020 showed us that there is still a long way to go in detecting these 0-day exploits in-the-wild. But what may be the most notable fact is that</span><span> </span><span>25% of the 0-days detected in 2020 are c</span><span>losely related to</span><span> previously publicly disclosed vulnerabilities.</span><span> In other words,</span><span class="c19"> </span><span class="c19">1 out of every 4 detected 0-day exploits could potentially have been avoided if a more thorough investigation and patching effort were explored</span><span class="c19">.</span><span> Across the industry, incomplete patches — patches that don’t correctly and comprehensively fix the root cause of a vulnerability — allow attackers to use 0-days against users with less effort.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Since mid-2019, Project Zero has dedicated an effort specifically to track, analyze, and learn from 0-days that are actively exploited in-the-wild. For the last 6 years, Project Zero’s mission has been to “make 0-day hard”. From that came the goal of our in-the-wild program: “Learn from 0-days exploited in-the-wild in order to make 0-day hard.” In order to ensure our work is </span><span class="c31">actually</span><span> making it harder to exploit 0-days, we need to </span><span>understand how 0-days are</span><span class="c31"> actually</span><span> being used</span><span>. Continuously pushing forward the public’s understanding of</span><span> 0-day exploitation</span><span class="c11 c4"> is only helpful when it doesn’t diverge from the “private state-of-the-art”, what attackers are doing and are capable of. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Over the last 18 months, we’ve learned a lot about the active exploitation of 0-days and our work has matured and evolved with it. </span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/2020/07/detection-deficit-year-in-review-of-0.html">For the 2nd year in a row</a></span><span>, we’re publishing a “Year in Review” report of the previous year’s detected 0-day exploits. The goal of this report is not to detail each individual exploit, but instead to analyze the exploits from the year as a group, looking for trends, gaps, lessons learned, successes, etc. If you’re interested in each individual exploit’s analysis, please check out our</span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/p/rca.html"> root cause analyses</a></span><span class="c11 c4">. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>When looking at the 24 0-days detected in-the-wild in 2020, there’s an undeniable conclusion: </span><span class="c19">increasing investment in correct and comprehensive patches is a huge opportunity for our industry to impact attackers using 0-days.</span><span class="c11 c4"> </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>A correct patch is one that fixes a bug with complete accuracy, </span><span>meaning the patch no longer allows any exploitation of the vulnerability</span><span class="c11 c4">. A comprehensive patch applies that fix everywhere that it needs to be applied, covering all of the variants. We consider a patch to be complete only when it is both correct and comprehensive. When exploiting a single vulnerability or bug, there are often multiple ways to trigger the vulnerability, or multiple paths to access it. Many times we’re seeing vendors block only the path that is shown in the proof-of-concept or exploit sample, rather than fixing the vulnerability as a whole, which would block all of the paths. Similarly, security researchers are often reporting bugs without following up on how the patch works and exploring related attacks.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>While the idea that incomplete patches are making it easier for attackers to exploit 0-days may be uncomfortable,</span><span> the converse of this conclusion can give us hope. We have a clear path toward making 0-days harder.</span><span class="c19"> If more vulnerabilities are patched correctly and comprehensively, it will be harder for</span><span class="c19"> attackers to exploit </span><span class="c4 c19 c43">0-days.</span></p><h1 class="c9 c3" id="h.pjwf2y1do0f0"><span class="c27 c4">This vulnerability looks familiar 🤔</span></h1><p class="c0 c3"><span class="c11 c4">As stated in the introduction, 2020 included 0-day exploits that are similar to ones we’ve seen before. 6 of 24 0-days exploits detected in-the-wild are closely related to publicly disclosed vulnerabilities. Some of these 0-day exploits only had to change a line or two of code to have a new working 0-day exploit. This section explains how each of these 6 actively exploited 0-days are related to a previously seen vulnerability. We’re taking the time to detail each and show the minimal differences between the vulnerabilities to demonstrate that once you understand one of the vulnerabilities, it’s much easier to then exploit another.<br></span></p><a id="t.b74f5f217f98f20b760791f8e1d63f313284b751"></a><a id="t.0"></a><table class="c17"><tbody><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Product</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Vulnerability exploited in-the-wild</span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Variant of...</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Microsoft Internet Explorer</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-0674</span></p><p class="c25 c13"><span class="c11 c4"></span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2018-8653* CVE-2019-1367* CVE-2019-1429*</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Mozilla Firefox</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-6820</span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span>Mozilla </span><span class="c5"><a class="c211" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1507180">Bug 1507180</a></span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Google Chrome</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-6572</span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2019-5870</span></p><p class="c25"><span class="c11 c4">CVE-2019-13695</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Microsoft Windows</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-0986</span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2019-0880*</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Google Chrome/Freetype</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-15999</span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2014-9665</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Apple Safari</span></p></td><td class="c30" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-27930</span></p></td><td class="c32" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2015-0093</span></p></td></tr><tr class="c35"><td class="c38" colspan="3" rowspan="1"><p class="c25"><span class="c11 c4">* vulnerability was also exploited in-the-wild in previous years</span></p></td></tr></tbody></table><p class="c0 c3"><span class="c11 c4"> </span></p><h2 class="c36 c3" id="h.k0ack2noqebb"><span class="c33 c4">Internet Explorer JScript CVE-2020-0674</span></h2><p class="c0 c3"><span>CVE-2020-0674 is the fourth vulnerability that’s been exploited in this bug class in 2 years. The other three vulnerabilities are CVE-2018-8653, CVE-2019-1367, and CVE-2019-1429. In the </span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/2020/07/detection-deficit-year-in-review-of-0.html">2019 year-in-review</a></span><span> we devoted a section to these vulnerabilities. </span><span class="c5"><a class="c211" href="https://www.blog.google/threat-analysis-group/identifying-vulnerabilities-and-protecting-you-phishing/">Google’s Threat Analysis Group attributed</a></span><span> all four exploits to the same threat actor. </span><span>It bears repeating, the same actor exploited similar vulnerabilities four separate times.</span><span> </span><span>For all four exploits, the attacker used the same vulnerability type and the same exact exploitation method</span><span class="c11 c4">. Fixing these vulnerabilities comprehensively the first time would have caused attackers to work harder or find new 0-days.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>JScript is the legacy Javascript engine in Internet Explorer. While it’s legacy, </span><span class="c5"><a class="c211" href="https://support.microsoft.com/en-us/topic/option-to-disable-jscript-execution-in-internet-explorer-9e3b5ab3-8115-4650-f3d8-e496e7f8e40e">by default it is still enabled</a></span><span> in Internet Explorer 11, which is a built-in feature of </span><span>Windows 10 computers</span><span>. The bug class, or type of vulnerability, is that a specific JScript </span><span>object</span><span>, a </span><span class="c31">variable</span><span class="c11 c4"> (uses the VAR struct), is not tracked by the garbage collector. I’ve included the code to trigger each of the four vulnerabilities below to demonstrate how similar they are. Ivan Fratric from Project Zero wrote all of the included code that triggers the four vulnerabilities.</span></p><h3 class="c7 c3" id="h.667740l9k8k0"><span class="c16 c4">CVE-2018-8653</span></h3><p class="c0 c3"><span>In December 2018, it was discovered that </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2018-8653">CVE-2018-8653</a></span><span> was being actively exploited. In this vulnerability, the </span><span class="c23">this</span><span> variable is not tracked by the garbage collector in the </span><span class="c23">isPrototypeof</span><span> callback. McAfee also wrote a </span><span class="c5"><a class="c211" href="https://www.mcafee.com/blogs/other-blogs/mcafee-labs/ie-scripting-flaw-still-a-threat-to-unpatched-systems-analyzing-cve-2018-8653/">write-up going through each step of this exploit</a></span><span class="c11 c4">. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.1f8226adda08b392a30970fd8b644091a916c945"></a><a id="t.1"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">var</span><span class="c2"> objs </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">();</span></p><p class="c0"><span class="c6">var</span><span class="c2"> refs </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">();</span></p><p class="c0"><span class="c6">var</span><span class="c2"> dummyObj </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Object</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c6">function</span><span class="c2"> getFreeRef</span><span class="c1">()</span></p><p class="c0"><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 5. delete prototype objects as well as ordinary objects</span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> </span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">10000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++</span><span class="c2"> </span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> objs</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c20">1</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0"><span class="c2"> </span><span class="c8">CollectGarbage</span><span class="c1">();</span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> </span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">200</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++</span><span class="c2"> </span><span class="c1">)</span></p><p class="c0"><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> refs</span><span class="c1">[</span><span class="c2">i</span><span class="c1">].</span><span class="c2">prototype </span><span class="c1">=</span><span class="c2"> </span><span class="c20">1</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 6. Garbage collector frees unused variable blocks.</span></p><p class="c0"><span class="c2"> </span><span class="c18">// This includes the one holding the "this" variable</span></p><p class="c0"><span class="c2"> </span><span class="c8">CollectGarbage</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 7. Boom</span></p><p class="c0"><span class="c2"> alert</span><span class="c1">(</span><span class="c6">this</span><span class="c1">);</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 1. create "special" objects for which isPrototypeOf can be invoked</span></p><p class="c0"><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> </span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">200</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++</span><span class="c2"> </span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c6">var</span><span class="c2"> arr </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">({</span><span class="c2"> prototype</span><span class="c1">:</span><span class="c2"> </span><span class="c1">{}</span><span class="c2"> </span><span class="c1">});</span></p><p class="c0"><span class="c2"> </span><span class="c6">var</span><span class="c2"> e </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Enumerator</span><span class="c1">(</span><span class="c2">arr</span><span class="c1">);</span></p><p class="c0"><span class="c2"> refs</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> e</span><span class="c1">.</span><span class="c2">item</span><span class="c1">();</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 2. create a bunch of ordinary objects</span></p><p class="c0"><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> </span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">10000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++</span><span class="c2"> </span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> objs</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Object</span><span class="c1">();</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 3. create objects to serve as prototypes and set up callbacks</span></p><p class="c0"><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> </span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">200</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++</span><span class="c2"> </span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> refs</span><span class="c1">[</span><span class="c2">i</span><span class="c1">].</span><span class="c2">prototype </span><span class="c1">=</span><span class="c2"> </span><span class="c1">{};</span></p><p class="c0"><span class="c2"> refs</span><span class="c1">[</span><span class="c2">i</span><span class="c1">].</span><span class="c2">prototype</span><span class="c1">.</span><span class="c2">isPrototypeOf </span><span class="c1">=</span><span class="c2"> getFreeRef</span><span class="c1">;</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 4. calls isPrototypeOf. This sets up refs[100].prototype as "this" variable</span></p><p class="c0"><span class="c18">// During callback, the "this" variable won't be tracked by the Garbage collector</span></p><p class="c0"><span class="c18">// use different index if this doesn't work</span></p><p class="c0"><span class="c2">dummyObj </span><span class="c6">instanceof</span><span class="c2"> refs</span><span class="c1">[</span><span class="c20">100</span><span class="c1">];</span></p><p class="c0 c13"><span class="c2 c4"></span></p></td></tr></tbody></table><h3 class="c7 c3" id="h.ine73rgba0in"><span class="c16 c4">CVE-2019-1367</span></h3><p class="c0 c3"><span>In September 2019, </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2019-1367">CVE-2019-1367</a></span><span> was detected as exploited in-the-wild. This is the same vulnerability type as CVE-2018-8653: a JScript </span><span class="c31">variable</span><span> object</span><span> is not tracked by the garbage collector. This time though the </span><span class="c31">variables</span><span> that are not tracked are in the </span><span class="c23">arguments</span><span> array in the </span><span class="c23">Array.sort</span><span class="c11 c4"> callback.</span></p><a id="t.43a0a5db0b1d20befc1e52448e47d5adb550749a"></a><a id="t.2"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">var</span><span class="c2"> spray </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c6">function</span><span class="c2"> F</span><span class="c1">()</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 2. Create a bunch of objects</span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++)</span><span class="c2"> spray</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Object</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 3. Store a reference to one of them in the arguments array</span></p><p class="c0"><span class="c2"> </span><span class="c18">// The arguments array isn't tracked by garbage collector</span></p><p class="c0"><span class="c2"> arguments</span><span class="c1">[</span><span class="c20">0</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> spray</span><span class="c1">[</span><span class="c20">5000</span><span class="c1">];</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 4. Delete the objects and call the garbage collector</span></p><p class="c0"><span class="c2"> </span><span class="c18">// All JSCript variables get reclaimed... </span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++)</span><span class="c2"> spray</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c20">1</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c8">CollectGarbage</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 5. But we still have reference to one of them in the</span></p><p class="c0"><span class="c2"> </span><span class="c18">// arguments array</span></p><p class="c0"><span class="c2"> alert</span><span class="c1">(</span><span class="c2">arguments</span><span class="c1">[</span><span class="c20">0</span><span class="c1">]);</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 1. Call sort with a custom callback</span></p><p class="c0"><span class="c1">[</span><span class="c20">1</span><span class="c1">,</span><span class="c20">2</span><span class="c1">].</span><span class="c2">sort</span><span class="c1">(</span><span class="c2">F</span><span class="c1">);</span></p><p class="c0 c13"><span class="c2 c4"></span></p></td></tr></tbody></table><h3 class="c3 c7" id="h.8h929p3lop4y"><span class="c16 c4">CVE-2019-1429</span></h3><p class="c0 c3"><span>The CVE-2019-1367 patch did not actually fix the vulnerability triggered by the proof-of-concept above and exploited in the in-the-wild. The proof-of-concept for CVE-2019-1367 </span><span class="c31">still worked</span><span class="c11 c4"> even after the CVE-2019-1367 patch was applied! </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In November 2019, Microsoft released another patch to address this gap. </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2019-1429">CVE-2019-1429</a></span><span> addressed the shortcomings of the CVE-2019-1367 and also fixed a variant. </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/project-zero/issues/detail?id=1947">The variant</a></span><span> is that </span><span>the </span><span class="c31">variables</span><span> in the </span><span class="c23">arguments</span><span> array are not tracked by the garbage collector in the </span><span class="c23">toJson</span><span> callback rather than the </span><span class="c23">Array.sort</span><span> callback. </span><span>The only difference between the variant triggers</span><span> is the</span><span> highlighted lines</span><span>. Instead of calling the </span><span class="c23">Array.sort</span><span> callback, we call the </span><span class="c23">toJSON</span><span class="c11 c4"> callback.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.1e22b404c604206b0862eb75b336baee152ee3ca"></a><a id="t.3"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">var</span><span class="c2"> spray </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c6">function</span><span class="c2"> F</span><span class="c1">()</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 2. Create a bunch of objects</span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++)</span><span class="c2"> spray</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Object</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 3. Store a reference to one of them in the arguments array</span></p><p class="c0"><span class="c2"> </span><span class="c18">// The arguments array isn't tracked by garbage collector</span></p><p class="c0"><span class="c2"> arguments</span><span class="c1">[</span><span class="c20">0</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> spray</span><span class="c1">[</span><span class="c20">5000</span><span class="c1">];</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 4. Delete the objects and call the garbage collector</span></p><p class="c0"><span class="c2"> </span><span class="c18">// All JSCript variables get reclaimed... </span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++)</span><span class="c2"> spray</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c20">1</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c8">CollectGarbage</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 5. But we still have reference to one of them in the</span></p><p class="c0"><span class="c2"> </span><span class="c18">// arguments array</span></p><p class="c0"><span class="c2"> alert</span><span class="c1">(</span><span class="c2">arguments</span><span class="c1">[</span><span class="c20">0</span><span class="c1">]);</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c18 c14">// 1. Cause toJSON callback to fire</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c6 c14">var</span><span class="c2 c14"> o </span><span class="c1 c14">=</span><span class="c2 c14"> </span><span class="c1 c14">{</span><span class="c2 c14">toJSON</span><span class="c1 c14">:</span><span class="c2 c14">F</span><span class="c1 c14">}</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> JSON</span><span class="c1 c14">.</span><span class="c2 c14">stringify</span><span class="c1 c14">(</span><span class="c2 c14">o</span><span class="c1 c14">);</span></p><p class="c0 c13"><span class="c2 c4 c15"></span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c18 c10">// 1. Call sort with a custom callback</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c1 c10">[</span><span class="c20 c10">1</span><span class="c1 c10">,</span><span class="c20 c10">2</span><span class="c1 c10">].</span><span class="c2 c10">sort</span><span class="c1 c10">(</span><span class="c2 c10">F</span><span class="c1 c4 c10">);</span></p></td></tr></tbody></table><h3 class="c7 c3" id="h.7s5b4t8wlng1"><span class="c4 c16">CVE-2020-0674</span></h3><p class="c0 c3"><span>In January 2020, </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-0674">CVE-2020-0674</a></span><span> was detected as exploited in-the-wild. The vulnerability is that the named arguments are not tracked by the garbage collector in the </span><span class="c23">Array.sort</span><span> callback. </span><span>The only changes required to the trigger </span><span>for CVE-2019-1367 is to change the references to </span><span class="c23">arguments[]</span><span> to one of the arguments named in the function definition. For example, we replaced any instances of </span><span class="c23">arguments[0]</span><span> with </span><span class="c23">arg1</span><span class="c11 c4">.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.cb84ed0d0e41c9e179f65374ff4d12c9a051426f"></a><a id="t.4"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">var</span><span class="c2"> spray </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c6 c14">function</span><span class="c2 c14"> F</span><span class="c1 c14">(</span><span class="c2 c14">arg1</span><span class="c1 c14">,</span><span class="c2 c14"> arg2</span><span class="c1 c14">)</span><span class="c2 c14"> </span><span class="c1 c14">{</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c6 c10">function</span><span class="c2 c10"> F</span><span class="c1 c10">()</span><span class="c2 c10"> </span><span class="c1 c10">{</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 2. Create a bunch of objects</span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++)</span><span class="c2"> spray</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Object</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 3. Store a reference to one of them in one of the named arguments</span></p><p class="c0"><span class="c2"> </span><span class="c18">// The named arguments aren't tracked by garbage collector</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> arg1 </span><span class="c1 c14">=</span><span class="c2 c14"> spray</span><span class="c1 c14">[</span><span class="c20 c14">5000</span><span class="c1 c14">];</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> arguments</span><span class="c1 c10">[</span><span class="c20 c10">0</span><span class="c1 c10">]</span><span class="c2 c10"> </span><span class="c1 c10">=</span><span class="c2 c10"> spray</span><span class="c1 c10">[</span><span class="c20 c10">5000</span><span class="c1 c10">];</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 4. Delete the objects and call the garbage collector</span></p><p class="c0"><span class="c2"> </span><span class="c18">// All JScript variables get reclaimed... </span></p><p class="c0"><span class="c2"> </span><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> i</span><span class="c1">++)</span><span class="c2"> spray</span><span class="c1">[</span><span class="c2">i</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c20">1</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c8">CollectGarbage</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c18">// 5. But we still have reference to one of them in</span></p><p class="c0"><span class="c2"> </span><span class="c18">// a named argument</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> alert</span><span class="c1 c14">(</span><span class="c2 c14">arg1</span><span class="c1 c14">);</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> alert</span><span class="c1 c10">(</span><span class="c2 c10">arguments</span><span class="c1 c10">[</span><span class="c20 c10">0</span><span class="c1 c10">]);</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 1. Call sort with a custom callback</span></p><p class="c0"><span class="c1">[</span><span class="c20">1</span><span class="c1">,</span><span class="c20">2</span><span class="c1">].</span><span class="c2">sort</span><span class="c1">(</span><span class="c2">F</span><span class="c1">);</span></p></td></tr></tbody></table><h3 class="c7 c3" id="h.n3s7fz70dd0k"><span class="c16 c4">CVE-2020-0968</span></h3><p class="c0 c3"><span>Unfortunately CVE-2020-0674 was not the end of this story, even though it was the fourth vulnerability of this type to be exploited in-the-wild. In April 2020, Microsoft patched </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-us/vulnerability/CVE-2020-0968">CVE-2020-0968</a></span><span>, another Internet Explorer JScript vulnerability. When the bulletin was first released, it was designated as exploited in-the-wild, </span><span>but t</span><span>he following day, Microsoft changed this field to say it was not exploited in-the-wild (see the revisions section at the bottom of the </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-us/vulnerability/CVE-2020-0968">advisory</a></span><span>). </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.e6bf02b53677f0afb1adc9e2d195428f0079f5f2"></a><a id="t.5"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">var</span><span class="c2"> spray </span><span class="c1">=</span><span class="c2"> </span><span class="c6">new</span><span class="c2"> </span><span class="c8">Array</span><span class="c1">();</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c6">function</span><span class="c2"> f1</span><span class="c1">()</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> alert</span><span class="c1">(</span><span class="c34">'callback 1'</span><span class="c1">);</span></p><p class="c0"><span class="c2"> </span><span class="c6">return</span><span class="c2"> spray</span><span class="c1">[</span><span class="c20">6000</span><span class="c1">];</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c6">function</span><span class="c2"> f2</span><span class="c1">()</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> alert</span><span class="c1">(</span><span class="c34">'callback 2'</span><span class="c1">);</span></p><p class="c0"><span class="c2"> spray </span><span class="c1">=</span><span class="c2"> </span><span class="c6">null</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c8">CollectGarbage</span><span class="c1">();</span></p><p class="c0"><span class="c2"> </span><span class="c6">return</span><span class="c2"> </span><span class="c34">'a'</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c6">function</span><span class="c2"> boom</span><span class="c1">()</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c6">var</span><span class="c2"> e </span><span class="c1">=</span><span class="c2"> o1</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c6">var</span><span class="c2"> d </span><span class="c1">=</span><span class="c2"> o2</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 3. the first callback (e.toString) happens</span></p><p class="c0"><span class="c2"> </span><span class="c18">// it returns one of the string variables</span></p><p class="c0"><span class="c2"> </span><span class="c18">// which is stored in a temporary variable</span></p><p class="c0"><span class="c2"> </span><span class="c18">// on the stack, not tracked by garbage collector</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 4. Second callback (d.toString) happens</span></p><p class="c0"><span class="c2"> </span><span class="c18">// There, string variables get freed</span></p><p class="c0"><span class="c2"> </span><span class="c18">// and the space reclaimed</span></p><p class="c0"><span class="c2"> </span><span class="c18">// 5. Crash happens when attempting to access</span></p><p class="c0"><span class="c2"> </span><span class="c18">// string content of the temporary variable</span></p><p class="c0"><span class="c2"> </span><span class="c6">var</span><span class="c2"> b </span><span class="c1">=</span><span class="c2"> e </span><span class="c1">+</span><span class="c2"> d</span><span class="c1">;</span></p><p class="c0"><span class="c2"> alert</span><span class="c1">(</span><span class="c2">b</span><span class="c1">);</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 1. create two objects with toString callbacks</span></p><p class="c0"><span class="c6">var</span><span class="c2"> o1 </span><span class="c1">=</span><span class="c2"> </span><span class="c1">{</span><span class="c2"> toString</span><span class="c1">:</span><span class="c2"> f1 </span><span class="c1">};</span></p><p class="c0"><span class="c6">var</span><span class="c2"> o2 </span><span class="c1">=</span><span class="c2"> </span><span class="c1">{</span><span class="c2"> toString</span><span class="c1">:</span><span class="c2"> f2 </span><span class="c1">};</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c18">// 2. create a bunch of string variables</span></p><p class="c0"><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> a </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> a </span><span class="c1"><</span><span class="c2"> </span><span class="c20">20000</span><span class="c1">;</span><span class="c2"> a</span><span class="c1">++)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> spray</span><span class="c1">[</span><span class="c2">a</span><span class="c1">]</span><span class="c2"> </span><span class="c1">=</span><span class="c2"> </span><span class="c34">"aaa"</span><span class="c1">;</span></p><p class="c0"><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2">boom</span><span class="c1">();</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In addition to the vulnerabilities themselves being very similar, the attacker used the same exploit method for each of the four 0-day exploits</span><span class="c11 c4">. This provided a type of “plug and play” quality to their 0-day development which would have reduced the amount of work required for each new 0-day exploit. </span></p><h2 class="c36 c3" id="h.o5e89hxj78l"><span class="c33 c4">Firefox CVE-2020-6820</span></h2><p class="c0 c3"><span>Mozilla patched </span><span class="c5"><a class="c211" href="https://www.mozilla.org/en-US/security/advisories/mfsa2020-11/">CVE-2020-6820 in Firefox with an out-of-band security update</a></span><span class="c11 c4"> in April 2020. It is a use-after-free in the Cache subsystem. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>CVE-2020-6820 is a use-after-free of the </span><span class="c23">CacheStreamControlParent</span><span> when closing its last open read stream. The read stream is the response returned to the context process from a cache query. If the close or abort command is received while any read streams are still open, it triggers </span><span class="c23">StreamList::CloseAll</span><span>. If the </span><span class="c23">StreamControl</span><span> (must be the Parent which lives in the browser process in order to get the use-after-free in the browser process; the Child would only provide in renderer) still has </span><span class="c23">ReadStreams</span><span> when </span><span class="c23">StreamList::CloseAll</span><span> is called, then this will cause the </span><span class="c23">CacheStreamControlParent</span><span> to be freed. The </span><span class="c23">mId</span><span> member of the </span><span class="c23">CacheStreamControl</span><span class="c11 c4"> parent is then subsequently accessed, causing the use-after-free.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span class="c11 c4">The execution patch for CVE-2020-6820 is:</span></p><a id="t.3234b37aec7a6c3a6791502170cd32aec509fe5b"></a><a id="t.6"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c8">StreamList</span><span class="c1">::</span><span class="c8">CloseAll</span><span class="c2"> </span><span class="c39 c15 c19">←</span><span class="c29 c15 c19"> </span><span class="c24 c15 c19">Patched</span><span class="c29 c15 c19"> </span><span class="c15 c19 c44">function</span></p><p class="c0"><span class="c2"> </span><span class="c8">CacheStreamControlParent</span><span class="c1">::</span><span class="c8">CloseAll</span></p><p class="c0"><span class="c2"> </span><span class="c8">CacheStreamControlParent</span><span class="c1">::</span><span class="c8">NotifyCloseAll</span></p><p class="c0"><span class="c2"> </span><span class="c8">StreamControl</span><span class="c1">::</span><span class="c8">CloseAllReadStreams</span></p><p class="c0"><span class="c2"> </span><span class="c8 c40">For</span><span class="c2 c40"> each stream</span><span class="c1 c40">:</span><span class="c2 c37"> </span></p><p class="c0"><span class="c2"> </span><span class="c8">ReadStream</span><span class="c1">::</span><span class="c8">Inner</span><span class="c1">::</span><span class="c8">CloseStream</span></p><p class="c0"><span class="c2"> </span><span class="c8">ReadStream</span><span class="c1">::</span><span class="c8">Inner</span><span class="c1">::</span><span class="c8">Close</span></p><p class="c0"><span class="c2"> </span><span class="c8">ReadStream</span><span class="c1">::</span><span class="c8">Inner</span><span class="c1">::</span><span class="c8">NoteClosed</span></p><p class="c0"><span class="c2"> </span><span class="c1">…</span></p><p class="c0"><span class="c2"> </span><span class="c8">StreamControl</span><span class="c1">::</span><span class="c8">NoteClosed</span></p><p class="c0"><span class="c2"> </span><span class="c8">StreamControl</span><span class="c1">::</span><span class="c8">ForgetReadStream</span><span class="c2 c4"> </span></p><p class="c0"><span class="c2"> </span><span class="c8">CacheStreamControlParent</span><span class="c1">/</span><span class="c8">Child</span><span class="c1">::</span><span class="c8">NoteClosedAfterForget</span></p><p class="c0"><span class="c2"> </span><span class="c8">CacheStreamControlParent</span><span class="c1">::</span><span class="c8">RecvNoteClosed</span></p><p class="c0"><span class="c2"> </span><span class="c8">StreamList</span><span class="c1">::</span><span class="c8">NoteClosed</span></p><p class="c0"><span class="c2"> </span><span class="c8">If</span><span class="c2"> </span><span class="c8">StreamList</span><span class="c2"> </span><span class="c6">is</span><span class="c2"> empty </span><span class="c1">&&</span><span class="c2"> mStreamControl</span><span class="c1">:</span></p><p class="c0"><span class="c2"> </span><span class="c8">CacheStreamControlParent</span><span class="c1">::</span><span class="c8">Shutdown</span></p><p class="c0"><span class="c2"> </span><span class="c8">Send__delete</span><span class="c1">(</span><span class="c6">this</span><span class="c1">)</span><span class="c29 c15 c19"> </span><span class="c39 c15 c19">←</span><span class="c29 c15 c19"> FREED HERE</span><span class="c15 c19 c39">!</span></p><p class="c0"><span class="c2"> </span><span class="c8">PCacheStreamControlParent</span><span class="c1">::</span><span class="c8">SendCloseAll</span><span class="c2"> </span><span class="c39 c15 c19">←</span><span class="c29 c15 c19"> </span><span class="c15 c19 c24">Used</span><span class="c29 c15 c19"> here </span><span class="c44 c15 c19">in</span><span class="c15 c19 c29"> call to </span><span class="c24 c15 c19">Id</span><span class="c39 c15 c19">()</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>CVE-2020-6820 is a variant of an internally found Mozilla vulnerability, </span><span class="c5"><a class="c211" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1507180">Bug 1507180</a></span><span>. 1507180 was discovered in November 2018 and </span><span class="c5"><a class="c211" href="https://hg.mozilla.org/mozilla-central/rev/cdf525897bff">patched in December 2019</a></span><span>. 1507180 is a use-after-free of the </span><span class="c23">ReadStream</span><span> in </span><span class="c23">mReadStreamList</span><span> in </span><span class="c23">StreamList::CloseAll</span><span>. While it was patched in December, </span><span class="c5"><a class="c211" href="https://hg.mozilla.org/mozilla-central/rev/25beb671c14a">an explanatory comment</a></span><span class="c11 c4"> for why the December 2019 patch was needed was added in early March 2020. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>For 150718 the execution path was the same as for CVE-2020-6820 except that the the use-after-free occurred earlier, in </span><span class="c23">StreamControl::CloseAllReadStreams</span><span> rather than a few calls “higher” in </span><span class="c23">StreamList::CloseAll</span><span>.</span><span class="c11 c4"> </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In my personal opinion, I have doubts about whether or not this vulnerability was actually exploited in-the-wild.</span><span> As far as we know, no one (including myself or Mozilla engineers [</span><span class="c5"><a class="c211" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1626728#c15">1</a></span><span>, </span><span class="c5"><a class="c211" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1507180#c10">2</a></span><span>]), has found a way to trigger this exploit without shutting down the process. Therefore, </span><span>exploiting this vulnerability doesn’t seem very practical.</span><span> However, because it was marked as exploited in-the-wild in the advisory, it remains in our </span><span class="c5"><a class="c211" href="https://docs.google.com/spreadsheets/d/1lkNJ0uQwbeC1ZTRrxdtuPLCIl7mlUreoKfSIgajnSyY/edit#gid=1869060786">in-the-wild tracking spreadsheet</a></span><span class="c11 c4"> and thus included in this list.</span></p><h2 class="c36 c3" id="h.u7zhsxie5e9k"><span>Chrome for Android CVE-2020-6572</span></h2><p class="c0 c3"><span class="c5"><a class="c211" href="https://chromereleases.googleblog.com/2020/04/stable-channel-update-for-desktop_7.html">CVE-2020-6572</a></span><span> is use-after-free in </span><span class="c23">MediaCodecAudioDecoder::~MediaCodecAudioDecoder()</span><span>.</span><span> </span><span class="c11 c4">This is Android-specific code that uses Android's media decoding APIs to support playback of DRM-protected media on Android. The root of this use-after-free is that a `unique_ptr` is assigned to another, going out of scope which means it can be deleted, while at the same time a raw pointer from the originally referenced object isn't updated. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>More specifically, </span><span class="c23">MediaCodecAudioDecoder::Initialize</span><span> doesn't reset </span><span class="c23">media_crypto_context_</span><span> if </span><span class="c23">media_crypto_</span><span> has been previously set. This can occur if </span><span class="c23">MediaCodecAudioDecoder::Initialize</span><span> is called twice, which is explicitly supported. This is problematic when the second initialization uses a different CDM than the first one. Each CDM owns the </span><span class="c23">media_crypto_context_ </span><span>object</span><span>, and the CDM itself (</span><span class="c23">cdm_context_ref_</span><span>) is a `unique_ptr`. Once the new CDM is set, the old CDM loses a reference and may be destructed. However, </span><span class="c23">MediaCodecAudioDecoder</span><span> still holds a raw pointer to </span><span class="c23">media_crypto_context_</span><span> from the old CDM since it wasn't updated, which results in the use-after-free on </span><span class="c23">media_crypto_context_</span><span> (for example, in </span><span class="c23">MediaCodecAudioDecoder::~MediaCodecAudioDecoder</span><span class="c11 c4">). </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>This vulnerability that was exploited in-the-wild was reported in April 2020. 7 months prior, in September 2019, Man Yue Mo of Semmle </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1004730">reported a very similar vulnerability</a></span><span>, </span><span class="c5"><a class="c211" href="https://chromereleases.googleblog.com/2019/10/stable-channel-update-for-desktop.html">CVE-2019-13695</a></span><span>. CVE-2019-13695 is also a use-after-free on a dangling </span><span class="c23">media_crypto_context_</span><span> in </span><span class="c23">MojoAudioDecoderService</span><span> after releasing the </span><span class="c23">cdm_context_ref_</span><span>. </span><span>This vulnerability is essentially the same bug as CVE-2020-6572, it’s just triggered by an error path after initializing </span><span class="c23">MojoAudioDecoderService</span><span> twice rather than by reinitializing the </span><span class="c23">MediaCodecAudioDecoder</span><span>.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In addition, in August 2019, Guang Gong of Alpha Team, Qihoo 360 reported another similar vulnerability in the same component. The </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/chromium/issues/detail?id=999311">vulnerability</a></span><span> is where the CDM could be registered twice (e.g. </span><span class="c23">MojoCdmService::Initialize</span><span> could be called twice) leading to use-after-free. When </span><span class="c23">MojoCdmService::Initialize</span><span> was called twice there would be two map entries in </span><span class="c23">cdm_services_</span><span>, but only one would be removed upon destruction, and the other was left dangling. This vulnerability is </span><span class="c5"><a class="c211" href="https://chromereleases.googleblog.com/2019/09/stable-channel-update-for-desktop.html">CVE-2019-5870</a></span><span>. Guang Gong used this vulnerability as a part of an Android exploit chain. He presented on this exploit chain at Blackhat USA 2020, “</span><span class="c5"><a class="c211" href="https://github.com/secmob/TiYunZong-An-Exploit-Chain-to-Remotely-Root-Modern-Android-Devices/blob/master/us-20-Gong-TiYunZong-An-Exploit-Chain-to-Remotely-Root-Modern-Android-Devices-wp.pdf">TiYunZong: An Exploit Chain to Remotely Root Modern Android Devices</a></span><span class="c11 c4">”. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>While one could argue that the vulnerability from Guang Gong is not a variant of the vulnerability exploited in-the-wild, it was at the very least an early indicator that the Mojo CDM code for Android had life-cycle issues and needed a closer look. This </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/chromium/issues/detail?id=999311#c8">was noted in the issue tracker </a></span><span>for CVE-2019-5870 and then </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1004730#c1">brought up again</a></span><span> after Man Yue Mo reported CVE-2019-13695.</span></p><h2 class="c36 c3" id="h.ejffpv4bguza"><span class="c33 c4">Windows splwow64 CVE-2020-0986</span></h2><p class="c0 c3"><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-0986">CVE-2020-0986</a></span><span> is an arbitrary pointer dereference in Windows splwow64. Splwow64 is executed any time a 32-bit application wants to </span><span>print</span><span> a document. </span><span>It runs as a Medium integrity process. Internet Explorer runs as a 32-bit application and a Low integrity process.</span><span> Internet Explorer can send LPC messages to splwow64. CVE-2020-0986 allows an attacker in the Internet Explorer process to control all three arguments to a </span><span class="c23">memcpy</span><span> call in the more privileged splwow64 address space. The only difference between CVE-2020-0986 and </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2019-0880">CVE-2019-0880</a></span><span>, which was also exploited in-the-wild, is that CVE-2019-0880 exploited the </span><span class="c23">memcpy</span><span class="c11 c4"> by sending message type 0x75 and CVE-2020-0986 exploits it by sending message type 0x6D. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>From this </span><span class="c5"><a class="c211" href="https://byteraptors.github.io/windows/exploitation/2020/05/24/sandboxescape.html">great write-up from ByteRaptors</a></span><span> on CVE-2019-0880 the pseudo code that allows the controlling of the </span><span class="c23">memcpy</span><span class="c11 c4"> is:</span></p><a id="t.a6fa8b5c3c8ad2be97429c1d22237b810a735e00"></a><a id="t.7"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">void</span><span class="c2"> </span><span class="c8">GdiPrinterThunk</span><span class="c1">(</span><span class="c2">LPVOID firstAddress</span><span class="c1">,</span><span class="c2"> LPVOID secondAddress</span><span class="c1">,</span><span class="c2"> LPVOID thirdAddress</span><span class="c1">)</span></p><p class="c0"><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c1">...</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c1">(*((</span><span class="c2">BYTE</span><span class="c1">*)(</span><span class="c2">firstAddress </span><span class="c1">+</span><span class="c2"> </span><span class="c20">0x4</span><span class="c1">))</span><span class="c2"> </span><span class="c1">==</span><span class="c2"> </span><span class="c20">0x75</span><span class="c1">){</span></p><p class="c0"><span class="c2"> ULONG64 memcpyDestinationAddress </span><span class="c1">=</span><span class="c2"> </span><span class="c1">*((</span><span class="c2">ULONG64</span><span class="c1">*)(</span><span class="c2">firstAddress </span><span class="c1">+</span><span class="c2"> </span><span class="c20">0x20</span><span class="c1">));</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c1">(</span><span class="c2">memcpyDestinationAddress </span><span class="c1">!=</span><span class="c2"> NULL</span><span class="c1">){</span></p><p class="c0"><span class="c2"> ULONG64 sourceAddress </span><span class="c1">=</span><span class="c2"> </span><span class="c1">*((</span><span class="c2">ULONG64</span><span class="c1">*)(</span><span class="c2">firstAddress </span><span class="c1">+</span><span class="c2"> </span><span class="c20">0x18</span><span class="c1">));</span></p><p class="c0"><span class="c2"> DWORD copySize </span><span class="c1">=</span><span class="c2"> </span><span class="c1">*((</span><span class="c2">DWORD</span><span class="c1">*)(</span><span class="c2">firstAddress </span><span class="c1">+</span><span class="c2"> </span><span class="c20">0x28</span><span class="c1">));</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> memcpy</span><span class="c1">(</span><span class="c2">memcpyDestinationAddress</span><span class="c1">,</span><span class="c2">sourceAddress</span><span class="c1">,</span><span class="c2">copySize</span><span class="c1">);</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c1">...</span></p><p class="c0"><span class="c1">}</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>The equivalent pseudocode for CVE-2020-0986 is below. </span><span>Only the message type (0x75 to 0x6D) and the offsets of the controlled </span><span class="c23">memcpy</span><span> arguments changed</span><span class="c11 c4"> as highlighted below.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.8dbc0fb11c95a5ee904cce1df18fa4f5f62d385d"></a><a id="t.8"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">void</span><span class="c2"> </span><span class="c8">GdiPrinterThunk</span><span class="c1">(</span><span class="c2">LPVOID msgSend</span><span class="c1">,</span><span class="c2"> LPVOID msgReply</span><span class="c1">,</span><span class="c2"> LPVOID arg3</span><span class="c1">)</span></p><p class="c0"><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c1">...</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> </span><span class="c6 c15">if</span><span class="c1 c15">(*((</span><span class="c2 c15">BYTE</span><span class="c1 c15">*)(</span><span class="c2 c15">msgSend </span><span class="c1 c15">+</span><span class="c2 c15"> </span><span class="c20 c15">0x4</span><span class="c1 c15">))</span><span class="c2 c15"> </span><span class="c1 c15">==</span><span class="c2 c15"> </span><span class="c20 c15">0x6D</span><span class="c1 c15">){</span></p><p class="c0"><span class="c2"> </span><span class="c1">...</span></p><p class="c0"><span class="c2"> ULONG64 srcAddress </span><span class="c1">=</span><span class="c2"> </span><span class="c1">**((</span><span class="c2">ULONG64 </span><span class="c1">**)(</span><span class="c2">msgSend </span><span class="c1 c15">+</span><span class="c2 c15"> </span><span class="c20 c15">0xA</span><span class="c1">));</span><span class="c2 c4"> </span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c1">(</span><span class="c2">srcAddress </span><span class="c1">!=</span><span class="c2"> NULL</span><span class="c1">){</span></p><p class="c0"><span class="c2"> DWORD copySize </span><span class="c1">=</span><span class="c2"> </span><span class="c1">*((</span><span class="c2">DWORD</span><span class="c1">*)(</span><span class="c2">msgSend </span><span class="c1 c15">+</span><span class="c2 c15"> </span><span class="c20 c15">0x40</span><span class="c1">));</span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c1">(</span><span class="c2">copySize </span><span class="c1"><=</span><span class="c2"> </span><span class="c20">0x1FFFE</span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> ULONG64 destAddress </span><span class="c1">=</span><span class="c2"> </span><span class="c1">*((</span><span class="c2">ULONG64</span><span class="c1">*)(</span><span class="c2">msgSend </span><span class="c1 c15">+</span><span class="c2 c15"> </span><span class="c20 c15">0xB</span><span class="c1">));</span></p><p class="c0"><span class="c2"> memcpy</span><span class="c1">(</span><span class="c2">destAddress</span><span class="c1">,</span><span class="c2">sourceAddress</span><span class="c1">,</span><span class="c2">copySize</span><span class="c1">);</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c1">...</span></p><p class="c0"><span class="c1">}</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In addition to CVE-2020-0986 being a trivial variant of a previous in-the-wild vulnerability, CVE-2020-0986 was also not patched completely and the vulnerability was still exploitable even after the patch was applied. This is detailed in the</span><span> “</span><span class="c11 c4">Exploited 0-days not properly fixed” section below.</span></p><h2 class="c3 c36" id="h.3ecniw2v9hbz"><span>Freetype CVE-2020-15999</span></h2><p class="c0 c3"><span>In October 2020, Project Zero discovered multiple exploit chains being used in the wild. The exploit chains targeted iPhone, Android, and Windows users, but they all shared the same Freetype RCE to exploit the Chrome renderer, </span><span class="c5"><a class="c211" href="https://chromereleases.googleblog.com/2020/10/stable-channel-update-for-desktop_20.html">CVE-2020-15999</a></span><span>. </span><span class="c5"><a class="c211" href="https://savannah.nongnu.org/bugs/?59308">The vulnerability is a heap buffer overflow</a></span><span> in the </span><span class="c23">Load_SBit_Png</span><span class="c11 c4"> function. The vulnerability was being triggered by an integer truncation. `Load_SBit_Png` processes PNG images embedded in fonts. The image width and height are stored in the PNG header as 32-bit integers. Freetype then truncated them to 16-bit integers. This truncated value was used to calculate the bitmap size and the backing buffer is allocated to that size. However, the original 32-bit width and height values of the bitmap are used when reading the bitmap into its backing buffer, thus causing the buffer overflow.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In November 2014, Project Zero team member </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/project-zero/issues/detail?id=168">Mateusz Jurczyk reported CVE-2014-9665</a></span><span> to Freetype. CVE-2014-9665 is also a heap buffer overflow in the </span><span class="c23">Load_SBit_Png</span><span> function. This one was triggered differently though. In CVE-2014-9665, when calculating the bitmap size, the size variable is vulnerable to an integer overflow causing the backing buffer to be too small. </span></p><p class="c25 c13"><span class="c11 c4"></span></p><p class="c25"><span>To patch CVE-2014-9665, </span><span class="c5"><a class="c211" href="http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/src/sfnt/pngshim.c?id=54abd22891bd51ef8b533b24df53b3019b5cee81">Freetype added a check to the rows and width</a></span><span class="c11 c4"> prior to calculating the size as shown below.</span></p><p class="c25 c13"><span class="c11 c4"></span></p><a id="t.544aaafdb3cb243b450aa049bcdb0901e282420f"></a><a id="t.9"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">if</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> populate_map_and_metrics </span><span class="c1">)</span></p><p class="c0"><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> FT_Long size</span><span class="c1">;</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">width </span><span class="c1">=</span><span class="c2"> </span><span class="c1">(</span><span class="c2">FT_Int</span><span class="c1">)</span><span class="c2">imgWidth</span><span class="c1">;</span></p><p class="c0"><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">height </span><span class="c1">=</span><span class="c2"> </span><span class="c1">(</span><span class="c2">FT_Int</span><span class="c1">)</span><span class="c2">imgHeight</span><span class="c1">;</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">width </span><span class="c1">=</span><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">width</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">rows </span><span class="c1">=</span><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">height</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">pixel_mode </span><span class="c1">=</span><span class="c2"> FT_PIXEL_MODE_BGRA</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">pitch </span><span class="c1">=</span><span class="c2"> map</span><span class="c1">-></span><span class="c2">width </span><span class="c1">*</span><span class="c2"> </span><span class="c20">4</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">num_grays </span><span class="c1">=</span><span class="c2"> </span><span class="c20">256</span><span class="c1">;</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c18 c14">/* reject too large bitmaps similarly to the rasterizer */</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c6 c14">if</span><span class="c2 c14"> </span><span class="c1 c14">(</span><span class="c2 c14"> map</span><span class="c1 c14">-></span><span class="c2 c14">rows </span><span class="c1 c14">></span><span class="c2 c14"> </span><span class="c20 c14">0x7FFF</span><span class="c2 c14"> </span><span class="c1 c14">||</span><span class="c2 c14"> map</span><span class="c1 c14">-></span><span class="c2 c14">width </span><span class="c1 c14">></span><span class="c2 c14"> </span><span class="c20 c14">0x7FFF</span><span class="c2 c14"> </span><span class="c1 c14">)</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c1 c14">{</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> error </span><span class="c1 c14">=</span><span class="c2 c14"> FT_THROW</span><span class="c1 c14">(</span><span class="c2 c14"> </span><span class="c8 c14">Array_Too_Large</span><span class="c2 c14"> </span><span class="c1 c14">);</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c6 c14">goto</span><span class="c2 c14"> </span><span class="c8 c14">DestroyExit</span><span class="c1 c14">;</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c1 c14">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> size </span><span class="c1">=</span><span class="c2"> map</span><span class="c1">-></span><span class="c2">rows </span><span class="c1">*</span><span class="c2"> map</span><span class="c1">-></span><span class="c2">pitch</span><span class="c1">;</span><span class="c2"> </span><span class="c1 c15"><-</span><span class="c2 c4 c15"> overflow size</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> error </span><span class="c1">=</span><span class="c2"> ft_glyphslot_alloc_bitmap</span><span class="c1">(</span><span class="c2"> slot</span><span class="c1">,</span><span class="c2"> size </span><span class="c1">);</span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> error </span><span class="c1">)</span></p><p class="c0"><span class="c2"> </span><span class="c6">goto</span><span class="c2"> </span><span class="c8">DestroyExit</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0 c13"><span class="c2 c4"></span></p></td></tr></tbody></table><p class="c25 c13"><span class="c11 c4"></span></p><p class="c25 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span class="c11 c4">To patch CVE-2020-15999, the vulnerability exploited in the wild in 2020, this check was moved up earlier in the `Load_Sbit_Png` function and changed to `imgHeight` and `imgWidth`, the width and height values that are included in the header of the PNG. </span></p><p class="c25 c13"><span class="c11 c4"></span></p><a id="t.7619df884503092ed17583662f4823868b1905a5"></a><a id="t.10"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c2"> </span><span class="c1">(</span><span class="c2"> populate_map_and_metrics </span><span class="c1">)</span></p><p class="c0"><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c18 c14">/* reject too large bitmaps similarly to the rasterizer */</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c6 c14">if</span><span class="c2 c14"> </span><span class="c1 c14">(</span><span class="c2 c14"> imgWidth </span><span class="c1 c14">></span><span class="c2 c14"> </span><span class="c20 c14">0x7FFF</span><span class="c2 c14"> </span><span class="c1 c14">||</span><span class="c2 c14"> imgHeight </span><span class="c1 c14">></span><span class="c2 c14"> </span><span class="c20 c14">0x7FFF</span><span class="c2 c14"> </span><span class="c1 c14">)</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c1 c14">{</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> error </span><span class="c1 c14">=</span><span class="c2 c14"> FT_THROW</span><span class="c1 c14">(</span><span class="c2 c14"> </span><span class="c8 c14">Array_Too_Large</span><span class="c2 c14"> </span><span class="c1 c14">);</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c6 c14">goto</span><span class="c2 c14"> </span><span class="c8 c14">DestroyExit</span><span class="c1 c14">;</span></p><p class="c0"><span class="c1 c14">+</span><span class="c2 c14"> </span><span class="c1 c14">}</span></p><p class="c0"><span class="c1 c14">+</span></p><p class="c0"><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">width </span><span class="c1">=</span><span class="c2"> </span><span class="c1">(</span><span class="c2">FT_UShort</span><span class="c1">)</span><span class="c2">imgWidth</span><span class="c1">;</span></p><p class="c0"><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">height </span><span class="c1">=</span><span class="c2"> </span><span class="c1">(</span><span class="c2">FT_UShort</span><span class="c1">)</span><span class="c2">imgHeight</span><span class="c1">;</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">width </span><span class="c1">=</span><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">width</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">rows </span><span class="c1">=</span><span class="c2"> metrics</span><span class="c1">-></span><span class="c2">height</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">pixel_mode </span><span class="c1">=</span><span class="c2"> FT_PIXEL_MODE_BGRA</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">pitch </span><span class="c1">=</span><span class="c2"> map</span><span class="c1">-></span><span class="c2">width </span><span class="c1">*</span><span class="c2"> </span><span class="c20">4</span><span class="c1">;</span></p><p class="c0"><span class="c2"> map</span><span class="c1">-></span><span class="c2">num_grays </span><span class="c1">=</span><span class="c2"> </span><span class="c20">256</span><span class="c1">;</span></p><p class="c0 c13"><span class="c2 c4"></span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c18 c10">/* reject too large bitmaps similarly to the rasterizer */</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c6 c10">if</span><span class="c2 c10"> </span><span class="c1 c10">(</span><span class="c2 c10"> map</span><span class="c1 c10">-></span><span class="c2 c10">rows </span><span class="c1 c10">></span><span class="c2 c10"> </span><span class="c20 c10">0x7FFF</span><span class="c2 c10"> </span><span class="c1 c10">||</span><span class="c2 c10"> map</span><span class="c1 c10">-></span><span class="c2 c10">width </span><span class="c1 c10">></span><span class="c2 c10"> </span><span class="c20 c10">0x7FFF</span><span class="c2 c10"> </span><span class="c1 c10">)</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c1 c10">{</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> error </span><span class="c1 c10">=</span><span class="c2 c10"> FT_THROW</span><span class="c1 c10">(</span><span class="c2 c10"> </span><span class="c8 c10">Array_Too_Large</span><span class="c2 c10"> </span><span class="c1 c10">);</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c6 c10">goto</span><span class="c2 c10"> </span><span class="c8 c10">DestroyExit</span><span class="c1 c10">;</span></p><p class="c0"><span class="c1 c10">-</span><span class="c2 c10"> </span><span class="c1 c10">}</span></p><p class="c0"><span class="c1">[...]</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span class="c11 c4">To summarize: </span></p><ul style='padding: 0;' class="c41 lst-kix_ir94vkdxrs7o-0 start"><li style='margin-left: 46pt;' class="c0 c3 c22 li-bullet-0"><span>CVE-2014-9665 caused a buffer overflow by overflowing the size field in the </span><span class="c23">size = map->rows * map->pitch;</span><span class="c11 c4"> calculation.</span></li><li style='margin-left: 46pt;' class="c0 c22 c3 li-bullet-0"><span>CVE-2020-15999 caused a buffer overflow by truncating </span><span class="c23">metrics->width</span><span> and </span><span class="c23">metrics->height</span><span class="c11 c4"> which are then used to calculate the size field, thus causing the size field to be too small.</span></li></ul><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>A fix for the root cause of the buffer overflow in November 2014 would have been to bounds check </span><span class="c23">imgWidth</span><span> and </span><span class="c23">imgHeight</span><span class="c11 c4"> prior to any assignments to an unsigned short. Including the bounds check of the height and widths from the PNG headers early would have prevented both manners of triggering this buffer overflow. </span></p><h2 class="c36 c3" id="h.c0g67ylrwoty"><span>Apple Safari CVE-2020-27930</span></h2><p class="c0 c3"><span>This vulnerability is slightly different than the rest in that while it’s still a variant, it’s not clear that by current disclosure norms, one would have necessarily expected Apple to have picked up the patc</span><span>h. Apple and Microsoft both forked the Adobe Type Manager code over 20 years</span><span> ago</span><span class="c11 c4">. Due to the forks, there’s no true “upstream”. However when vulnerabilities were reported in Microsoft’s, Apple’s, or Adobe’s fork, there is a possibility (though no guarantee) that it was also in the others.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>CVE-2020-27930 vulnerability was used in an exploit chain for iOS. The </span><span class="c5"><a class="c211" href="http://bugs.chromium.org/p/project-zero/issues/detail?id=180">variant, CVE-2015-0993, was reported</a></span><span> to Microsoft in November 2014. In CVE-2015-0993, the vulnerability is in the </span><span class="c23">blend</span><span> operator in Microsoft’s implementation of Adobe’s Type 1/2 Charstring Font Format. The </span><span class="c23">blend</span><span> operation takes </span><span class="c23">n + 1</span><span> parameters. The vulnerability is that it did not validate or handle correctly when </span><span class="c23">n</span><span class="c11 c4"> is negative, allowing the font to arbitrarily read and write on the native interpreter stack. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span class="c5"><a class="c211" href="https://support.apple.com/en-us/HT211929">CVE-2020-27930</a></span><span>, the vulnerability exploited in-the-wild in 2020, is very similar. The vulnerability this time is in the </span><span class="c23">callothersubr</span><span> operator in Apple’s implementation of Adobe’s Type 1 Charstring Font Format. In the same way as the vulnerability reported in November 2014, </span><span class="c23">callothersubr</span><span> expects </span><span class="c23">n</span><span> arguments from the stack. However, the function did not validate nor handle correctly negative values of </span><span class="c23">n</span><span class="c11 c4">, leading to the same outcome of arbitrary stack read/write. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Six years after the original vulnerability was reported, a similar vulnerability was exploited in a different project. This presents an interesting question: </span><span>How do</span><span class="c11 c4"> related, but separate, projects stay up-to-date on security vulnerabilities that likely exist in their fork of a common code base? There’s little doubt that reviewing the vulnerability Microsoft fixed in 2015 would help the attackers discover this vulnerability in Apple.</span></p><h1 class="c9 c3" id="h.4ehznvuodkxx"><span class="c27 c4">Exploited 0-days not properly fixed… 😭</span></h1><p class="c0 c3"><span class="c11 c4">Three vulnerabilities that were exploited in-the-wild were not properly fixed after they were reported to the vendor. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.edf72bcd4c78a28db713eae74fa87ed90f591310"></a><a id="t.11"></a><table class="c17"><tbody><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Product</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Vulnerability that was exploited in-the-wild</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">2nd patch</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Internet Explorer</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-0674</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-0968</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Google Chrome</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c4 c11">CVE-2019-13764*</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-6383</span></p></td></tr><tr class="c26"><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">Microsoft Windows</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-0986</span></p></td><td class="c12" colspan="1" rowspan="1"><p class="c25"><span class="c11 c4">CVE-2020-17008/CVE-2021-1648</span></p></td></tr><tr class="c35"><td class="c38" colspan="3" rowspan="1"><p class="c25"><span class="c11 c4">* when CVE-2019-13764 was patched, it was not known to be exploited in-the-wild</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><h2 class="c36 c3" id="h.1vbp8s70d1dn"><span class="c33 c4">Internet Explorer JScript CVE-2020-0674</span></h2><p class="c0 c3"><span>In the section above, we detailed the timeline of the Internet Explorer JScript vulnerabilities that were exploited in-the-wild. After the most recent vulnerability, CVE-2020-0674, was exploited in January 2020, it still didn’t comprehensively fix all of the variants. Microsoft patched </span><span class="c5"><a class="c211" href="https://msrc.microsoft.com/update-guide/en-us/vulnerability/CVE-2020-0968">CVE-2020-0968</a></span><span class="c11 c4"> in April 2020. We show the trigger in the section above.</span></p><h2 class="c36 c3" id="h.djf2g8z23hpx"><span>Google Chrome CVE-2019-13674</span></h2><p class="c0 c3"><span class="c5"><a class="c211" href="https://chromereleases.googleblog.com/2019/12/stable-channel-update-for-desktop.html">CVE-2019-13674</a></span><span> in Chrome is an interesting case. When it was </span><span class="c5"><a class="c211" href="https://chromium.googlesource.com/v8/v8/+/b8b6075021ade0969c6b8de9459cd34163f7dbe1">patched in November 2019</a></span><span>, it was not known to be exploited in-the-wild. Instead, </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1028863">it was reported by security researchers Soyeon Park and Wen Xu</a></span><span>. Three months later, in February 2020, Sergei Glazunov of Project Zero discovered that it was exploited in-the-wild, and may have been exploited as a 0-day prior to the patch. When Sergei realized it had already been patched, he decided to look a little closer at the patch. That’s when he realized that the patch didn’t fix all of the paths to trigger the vulnerability. To read about the vulnerability and the subsequent patches in greater detail, check out Sergei’s blog post, “</span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/2021/01/in-wild-series-chrome-infinity-bug.html">Chrome Infinity Bug</a></span><span class="c11 c4">”. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>To summarize, the vulnerability is a type confusion in Chrome’s v8 Javascript engine. The issue is in the function that is designed to compute the type of induction variables, the variable that gets increased or decreased by a fixed amount in each iteration of a loop, such as a </span><span class="c23">for</span><span> loop. The algorithm works only on v8’s integer type though. The integer type in v8 includes a few special values, </span><span class="c23">+Infinity</span><span> and </span><span class="c23">-Infinity</span><span>. </span><span class="c23">-0</span><span> and </span><span class="c23">NaN</span><span> do not belong to the integer type though. Another interesting aspect to v8’s integer type is that it is not closed under addition meaning that adding two integers doesn’t always result in an integer. An example of this is </span><span class="c23">+Infinity + -Infinity = NaN</span><span class="c11 c4">. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Therefore, the following line is sufficient to </span><span>trigger</span><span> CVE-2019-13674. Note that this line will not show any observable crash effects and the road to making this vulnerability exploitable is quite long, check out </span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/">this blog post</a></span><span class="c11 c4"> if you’re interested! </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.a9314e9b2bd8b19d1e18395634993f466fea284a"></a><a id="t.12"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c1">-</span><span class="c6">Infinity</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1">+=</span><span class="c2"> </span><span class="c6">Infinity</span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span><span class="c2"> </span><span class="c1">}</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span class="c5"><a class="c211" href="https://chromium.googlesource.com/v8/v8.git/+/b8b6075021ade0969c6b8de9459cd34163f7dbe1">The patch</a></span><span> that Chrome released for this vulnerability added an explicit check for the </span><span class="c23">NaN</span><span> case. But the patch made an assumption that leads to it being insufficient: that the loop variable can only become </span><span class="c23">NaN</span><span> if the sum or difference of the initial value of the variable and the increment is </span><span class="c23">NaN</span><span class="c11 c4">. The issue is that the value of the increment can change inside the loop body. Therefore the following trigger would still work even after the patch was applied.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><a id="t.9eb676d3c545b8bdcea88fbbc80c4de5301054de"></a><a id="t.13"></a><table class="c17"><tbody><tr class="c26"><td class="c28" colspan="1" rowspan="1"><p class="c0"><span class="c6">var</span><span class="c2"> increment </span><span class="c1">=</span><span class="c2"> </span><span class="c1">-</span><span class="c6">Infinity</span><span class="c1">;</span></p><p class="c0"><span class="c6">var</span><span class="c2"> k </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span></p><p class="c0"><span class="c18">// The initial loop value is 0 and the increment is -Infinity.</span></p><p class="c0"><span class="c18">// This is permissible because 0 + -Infinity = -Infinity, an integer.</span></p><p class="c0"><span class="c6">for</span><span class="c2"> </span><span class="c1">(</span><span class="c6">var</span><span class="c2"> i </span><span class="c1">=</span><span class="c2"> </span><span class="c20">0</span><span class="c1">;</span><span class="c2"> i </span><span class="c1"><</span><span class="c2"> </span><span class="c20">1</span><span class="c1">;</span><span class="c2"> i </span><span class="c1">+=</span><span class="c2"> increment</span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c2"> </span><span class="c1">(</span><span class="c2">i </span><span class="c1">==</span><span class="c2"> </span><span class="c1">-</span><span class="c6">Infinity</span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c18">// Once the initial variable equals -Infinity (one loop through)</span></p><p class="c0"><span class="c2"> </span><span class="c18">// the increment is changed to +Infinity. -Infinity + +Infinity = NaN</span></p><p class="c0"><span class="c2"> increment </span><span class="c1">=</span><span class="c2"> </span><span class="c1">+</span><span class="c6">Infinity</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0"><span class="c2"> </span><span class="c6">if</span><span class="c2"> </span><span class="c1">(++</span><span class="c2">k </span><span class="c1">></span><span class="c2"> </span><span class="c20">10</span><span class="c1">)</span><span class="c2"> </span><span class="c1">{</span></p><p class="c0"><span class="c2"> </span><span class="c6">break</span><span class="c1">;</span></p><p class="c0"><span class="c2"> </span><span class="c1">}</span></p><p class="c0"><span class="c1">}</span></p></td></tr></tbody></table><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>To “revive” the entire exploit, the attacker only needed to change a couple of lines in the trigger to have another working 0-day. </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1051017">This incomplete fix was reported</a></span><span> to Chrome in February 2020. </span><span class="c5"><a class="c211" href="https://chromium.googlesource.com/v8/v8.git/+/a2e971c56d1c46f7c71ccaf33057057308cc8484">This patch</a></span><span> was more conservative: it bailed as soon as the type detected that increment can be </span><span class="c23">+Infinity</span><span> or </span><span class="c23">-Infinity</span><span class="c11 c4">. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Unfortunately, this patch introduced an additional security vulnerability, which allowed for a wider choice of possible “type confusions”. Again, check out </span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/2021/01/in-wild-series-chrome-infinity-bug.html">Sergei’s blog post</a></span><span class="c11 c4"> if you’re interested in more details. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>This is an example where the exploit is found </span><span class="c31">after</span><span> the bug was initially reported by security researchers. As an aside, I</span><span> think this shows why it’s important to work towards “correct & comprehensive” patches in general, not just vulnerabilities known to be exploited in-the-wild. </span><span>The security industry </span><span class="c5"><a class="c211" href="https://googleprojectzero.blogspot.com/2020/07/detection-deficit-year-in-review-of-0.html">knows there is a detection gap</a></span><span class="c11 c4"> in our ability to detect 0-days exploited in-the-wild. We don’t find and detect all exploited 0-days and we certainly don’t find them all in a timely manner. </span></p><h2 class="c36 c3" id="h.n50yx180dgki"><span class="c33 c4">Windows splwow64 CVE-2020-0986</span></h2><p class="c0 c3"><span>This vulnerability has already been discussed in the previous section on variants. After </span><span class="c5"><a class="c211" href="https://securelist.com/operation-powerfall-cve-2020-0986-and-variants/98329/">Kaspersky reported that CVE-2020-0986 was actively exploited</a></span><span> as a 0-day, I began performing root cause analysis and variant analysis on the vulnerability. The vulnerability was patched in June 2020, but it was only</span><span class="c5"><a class="c211" href="https://securelist.com/ie-and-windows-zero-day-operation-powerfall/97976/"> disclosed as exploited in-the-wild in August 2020</a></span><span class="c11 c4">. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Microsoft’s patch for CVE-2020-0986 replaced the raw pointers that an attacker could previously send through the LPC message, with offsets. This didn’t fix the root cause vulnerability, just changed how an attacker would trigger the vulnerability. </span><span class="c5"><a class="c211" href="https://bugs.chromium.org/p/project-zero/issues/detail?id=2096">This issue was reported</a></span><span> to Microsoft in September 2020, including a working trigger. Microsoft released a more complete patch for the vulnerability in January 2021, four months later. This new patch checks that all </span><span class="c23">memcpy</span><span class="c11 c4"> operations are only reading from and copying into the buffer of the message.</span></p><h1 class="c3 c9" id="h.3yn8y6vmd87d"><span class="c4 c27">Correct and comprehensive patches</span></h1><p class="c0 c3"><span>We’ve detailed how six 0-days that were exploited in-the-wild in 2020 were closely related to vulnerabilities that had been seen previously.</span><span class="c11 c4"> We also showed how three vulnerabilities that were exploited in-the-wild were either not fixed correctly or not fixed comprehensively when patched this year. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>When 0-day exploits are detected in-the-wild, it’s the failure case for an attacker. It’s a gift for us security defenders to learn as much as we can and take actions to ensure that that vector can’t be used again. The goal is to force attackers to start from scratch each time we detect one of their exploits: </span><span>they’re forced to discover a whole new vulnerability</span><span class="c11 c4">, they have to invest the time in learning and analyzing a new attack surface, they must develop a brand new exploitation method. To do that, we need correct and comprehensive fixes. </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>Being able to </span><span>correctly and comprehensively patch isn't just flicking a switch: it requires investment, prioritization, and planning. It also requires developing a patching process that balances both protecting users quickly and ensuring it is comprehensive, which can at times be in tension. While we expect that none of this will come as a surprise to security teams in an organization, this analysis is a good reminder that there is still more work to be done.</span><span class="c11 c4"> </span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span class="c11 c4">Exactly what investments are likely required depends on each unique situation, but we see some common themes around staffing/resourcing, incentive structures, process maturity, automation/testing, release cadence, and partnerships.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>While the aim is that one day all vulnerabilities will be fixed correctly </span><span class="c31">and</span><span class="c11 c4"> comprehensively, each step we take in that direction will make it harder for attackers to exploit 0-days.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In 2021, Project Zero will continue completing root cause and variant analyses for vulnerabilities reported as in-the-wild. We will also be looking over the patches for these exploited vulnerabilities with more scrutiny. We hope to also expand our work into variant analysis work on other vulnerabilities as well. We hope more researchers will join us in this work. (If you’re an aspiring vulnerability researcher, variant analysis could be a great way to begin building your skills! Here are two conference talks on the topic: </span><span class="c5"><a class="c211" href="https://www.youtube.com/watch?v=mC1Pwsdy814">my talk at BluehatIL 2020</a></span><span> and </span><span class="c5"><a class="c211" href="https://www.youtube.com/watch?v=fTNzylTMYks">Ki Chan Ahn at OffensiveCon 2020</a></span><span class="c11 c4">.)</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p><p class="c0 c3"><span>In addition, we would really like to work more closely with vendors on patches and mitigations </span><span class="c31">prior</span><span class="c11 c4"> to the patch being released. We often have ideas of how issues can be addressed. Early collaboration and offering feedback during the patch design and implementation process is good for everyone. Researchers and vendors alike can save time, resources, and energy by working together, rather than patch diffing a binary after release and realizing the vulnerability was not completely fixed.</span></p><p class="c0 c3 c13"><span class="c11 c4"></span></p> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <span itemprop='name'>Anonymous</span> </span> </span> <span class='post-timestamp'> at <meta content='https://googleprojectzero.blogspot.com/2021/02/deja-vu-lnerability.html' itemprop='url'/> <a class='timestamp-link' href='https://googleprojectzero.blogspot.com/2021/02/deja-vu-lnerability.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2021-02-03T09:10:00-08:00'>9:10 AM</abbr></a> </span> <span class='post-comment-link'> <a class='comment-link' href='https://googleprojectzero.blogspot.com/2021/02/deja-vu-lnerability.html#comment-form' onclick=''> No comments: </a> </span> <span class='post-icons'> <span class='item-control blog-admin pid-145400864'> <a href='https://www.blogger.com/post-edit.g?blogID=4838136820032157985&postID=2386590713508572091&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> <a class='goog-inline-block share-button sb-email' href='https://www.blogger.com/share-post.g?blogID=4838136820032157985&postID=2386590713508572091&target=email' target='_blank' title='Email This'><span class='share-button-link-text'>Email This</span></a><a class='goog-inline-block share-button sb-blog' href='https://www.blogger.com/share-post.g?blogID=4838136820032157985&postID=2386590713508572091&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='BlogThis!'><span class='share-button-link-text'>BlogThis!</span></a><a class='goog-inline-block share-button sb-twitter' href='https://www.blogger.com/share-post.g?blogID=4838136820032157985&postID=2386590713508572091&target=twitter' target='_blank' title='Share to X'><span class='share-button-link-text'>Share to X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://www.blogger.com/share-post.g?blogID=4838136820032157985&postID=2386590713508572091&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Share to Facebook'><span class='share-button-link-text'>Share to Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://www.blogger.com/share-post.g?blogID=4838136820032157985&postID=2386590713508572091&target=pinterest' target='_blank' title='Share to Pinterest'><span class='share-button-link-text'>Share to Pinterest</span></a> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> </div> <div class='blog-pager' id='blog-pager'> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='https://googleprojectzero.blogspot.com/search?updated-max=2021-04-01T09:06:00-07:00&max-results=1&reverse-paginate=true' id='Blog1_blog-pager-newer-link' title='Newer Posts'>Newer Posts</a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='https://googleprojectzero.blogspot.com/search?updated-max=2021-02-03T09:10:00-08:00&max-results=1' id='Blog1_blog-pager-older-link' title='Older Posts'>Older Posts</a> </span> <a class='home-link' href='https://googleprojectzero.blogspot.com/'>Home</a> </div> <div class='clear'></div> <div class='blog-feeds'> <div class='feed-links'> Subscribe to: <a class='feed-link' href='https://googleprojectzero.blogspot.com/feeds/posts/default' target='_blank' type='application/atom+xml'>Posts (Atom)</a> </div> </div> </div></div> </div> </div> <div class='column-left-outer'> <div class='column-left-inner'> <aside> </aside> </div> </div> <div class='column-right-outer'> <div class='column-right-inner'> <aside> <div class='sidebar section' id='sidebar-right-1'><div class='widget BlogSearch' data-version='1' id='BlogSearch1'> <h2 class='title'>Search This Blog</h2> <div class='widget-content'> <div id='BlogSearch1_form'> <form action='https://googleprojectzero.blogspot.com/search' class='gsc-search-box' target='_top'> <table cellpadding='0' cellspacing='0' class='gsc-search-box'> <tbody> <tr> <td class='gsc-input'> <input autocomplete='off' class='gsc-input' name='q' size='10' title='search' type='text' value=''/> </td> <td class='gsc-search-button'> <input class='gsc-search-button' title='search' type='submit' value='Search'/> </td> </tr> </tbody> </table> </form> </div> </div> <div class='clear'></div> </div><div class='widget PageList' data-version='1' id='PageList1'> <h2>Pages</h2> <div class='widget-content'> <ul> <li> <a href='https://googleprojectzero.blogspot.com/p/about-project-zero.html'>About Project Zero</a> </li> <li> <a href='https://googleprojectzero.blogspot.com/p/working-at-project-zero.html'>Working at Project Zero</a> </li> <li> <a href='https://googleprojectzero.blogspot.com/p/0day.html'>0day "In the Wild"</a> </li> <li> <a href='https://googleprojectzero.github.io/0days-in-the-wild/rca.html'>0day Exploit Root Cause Analyses</a> </li> <li> <a href='https://googleprojectzero.blogspot.com/p/vulnerability-disclosure-faq.html'>Vulnerability Disclosure FAQ</a> </li> </ul> <div class='clear'></div> </div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <h2>Archives</h2> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2025/'> 2025 </a> <span class='post-count' dir='ltr'>(2)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2025/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2024/'> 2024 </a> <span class='post-count' dir='ltr'>(12)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2024/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2024/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2024/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2024/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2024/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/'> 2023 </a> <span class='post-count' dir='ltr'>(11)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2023/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/'> 2022 </a> <span class='post-count' dir='ltr'>(17)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/04/'> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2022/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> ▼  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/'> 2021 </a> <span class='post-count' dir='ltr'>(24)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/06/'> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/04/'> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> ▼  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> <ul class='posts'> <li><a href='https://googleprojectzero.blogspot.com/2021/02/deja-vu-lnerability.html'>D茅j脿 vu-lnerability</a></li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2021/01/'> January </a> <span class='post-count' dir='ltr'>(10)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/'> 2020 </a> <span class='post-count' dir='ltr'>(36)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/08/'> August </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/07/'> July </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/04/'> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/02/'> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2020/01/'> January </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/'> 2019 </a> <span class='post-count' dir='ltr'>(27)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/08/'> August </a> <span class='post-count' dir='ltr'>(11)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/04/'> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2019/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/'> 2018 </a> <span class='post-count' dir='ltr'>(22)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/12/'> December </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/06/'> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2018/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/'> 2017 </a> <span class='post-count' dir='ltr'>(19)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/04/'> April </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2017/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/'> 2016 </a> <span class='post-count' dir='ltr'>(17)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/03/'> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2016/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/'> 2015 </a> <span class='post-count' dir='ltr'>(33)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/08/'> August </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/07/'> July </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/06/'> June </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2015/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/'> 2014 </a> <span class='post-count' dir='ltr'>(11)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='https://googleprojectzero.blogspot.com/2014/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> </div> </div> <script type='text/javascript'> //<![CDATA[ (function(){ let archive_list = document.getElementById('ArchiveList'); if (archive_list == null) return; let cur_year = archive_list.querySelector('.post-count-link').innerText.trim() - 0; let last_year = 2014; let elements = []; const MONTHS = ',Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','); let parent = document.getElementById('ArchiveList'); while (parent.childNodes.length) parent.removeChild(parent.childNodes[0]); function fetch_next_year() { let url = 'https://googleprojectzero.blogspot.com/?action=getTitles&widgetId=BlogArchive1&widgetType=BlogArchive&responseType=js&path=https%3A%2F%2Fgoogleprojectzero.blogspot.com%2F'+cur_year; fetch(url).then(resp => { if (!resp.ok) { console.log('http error'); return; } resp.text().then(text => { let scope = { _WidgetManager: { _HandleControllerResult: (name, method, results) => { elements.push(document.createElement('hr')); let year_header = document.createElement('div'); year_header.appendChild(document.createTextNode(cur_year)); year_header.style.fontSize = 'large'; elements.push(year_header); let list = document.createElement('ul'); elements.push(list); for (let obj of results.posts) { let link_parts = obj.url.split('/'); let year = link_parts[3]; let month = link_parts[4]; let el = document.createElement(/*'div'*/'li'); el.style.listStyleType = 'square'; el.style.listStylePosition = 'inside'; let link = document.createElement('a'); el.appendChild(link); link.appendChild(document.createTextNode(obj.title)); link.href = obj.url; let date_trailer = document.createElement('span'); el.appendChild(date_trailer); //date_trailer.appendChild(document.createTextNode(' ('+year+'-'+month+')')); date_trailer.appendChild(document.createTextNode(' ('+MONTHS[parseInt(month, 10)]+')')); //date_trailer.style.textAlign = 'right'; //elements.push(el); list.appendChild(el); } } } }; with (scope) { eval(text); } if (cur_year == last_year) { finish(); } else { cur_year--; fetch_next_year(); } }); }); } fetch_next_year(); function finish() { for (let obj of elements) { parent.appendChild(obj); } console.log(elements); } })(); //]]> </script> <div class='clear'></div> </div> </div></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='sidebar no-items section' id='sidebar-right-2-1'></div> </td> <td class='columns-cell'> <div class='sidebar no-items section' id='sidebar-right-2-2'></div> </td> </tr> </tbody> </table> <div class='sidebar no-items section' id='sidebar-right-3'></div> </aside> </div> </div> </div> <div style='clear: both'></div> <!-- columns --> </div> <!-- main --> </div> </div> <div class='main-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <footer> <div class='footer-outer'> <div class='footer-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left footer-fauxborder-left'> <div class='fauxborder-right footer-fauxborder-right'></div> <div class='region-inner footer-inner'> <div class='foot no-items section' id='footer-1'></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='foot no-items section' id='footer-2-1'></div> </td> <td class='columns-cell'> <div class='foot no-items section' id='footer-2-2'></div> </td> </tr> </tbody> </table> <!-- outside of the include in order to lock Attribution widget --> <div class='foot section' id='footer-3' name='Footer'><div class='widget Attribution' data-version='1' id='Attribution1'> <div class='widget-content' style='text-align: center;'> Powered by <a href='https://www.blogger.com' target='_blank'>Blogger</a>. </div> <div class='clear'></div> </div></div> </div> </div> <div class='footer-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </footer> <!-- content --> </div> </div> <div class='content-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <script type='text/javascript'> window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/60983134-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY5y0Fe_aBWykMcW-CL2gzOwv2Iz3g:1739732869022';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d4838136820032157985','//googleprojectzero.blogspot.com/2021/02/','4838136820032157985'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '4838136820032157985', 'title': 'Project Zero', 'url': 'https://googleprojectzero.blogspot.com/2021/02/', 'canonicalUrl': 'https://googleprojectzero.blogspot.com/2021/02/', 'homepageUrl': 'https://googleprojectzero.blogspot.com/', 'searchUrl': 'https://googleprojectzero.blogspot.com/search', 'canonicalHomepageUrl': 'https://googleprojectzero.blogspot.com/', 'blogspotFaviconUrl': 'https://googleprojectzero.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-240546891-1', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Project Zero - Atom\x22 href\x3d\x22https://googleprojectzero.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Project Zero - RSS\x22 href\x3d\x22https://googleprojectzero.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Project Zero - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/4838136820032157985/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/32c3d108bdd93523', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'archive', 'pageName': 'February 2021', 'pageTitle': 'Project Zero: February 2021'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Project Zero', 'description': 'News and updates from the Project Zero team at Google', 'url': 'https://googleprojectzero.blogspot.com/2021/02/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2021, 'month': 2, 'rangeMessage': 'Showing posts from February, 2021'}}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/918196653-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/1964470060-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogSearchView', new _WidgetInfo('BlogSearch1', 'sidebar-right-1', document.getElementById('BlogSearch1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_PageListView', new _WidgetInfo('PageList1', 'sidebar-right-1', document.getElementById('PageList1'), {'title': 'Pages', 'links': [{'isCurrentPage': false, 'href': 'https://googleprojectzero.blogspot.com/p/about-project-zero.html', 'id': '4384467920505278144', 'title': 'About Project Zero'}, {'isCurrentPage': false, 'href': 'https://googleprojectzero.blogspot.com/p/working-at-project-zero.html', 'id': '2459334498880008057', 'title': 'Working at Project Zero'}, {'isCurrentPage': false, 'href': 'https://googleprojectzero.blogspot.com/p/0day.html', 'id': '3414239791814532209', 'title': '0day \x22In the Wild\x22'}, {'isCurrentPage': false, 'href': 'https://googleprojectzero.github.io/0days-in-the-wild/rca.html', 'title': '0day Exploit Root Cause Analyses'}, {'isCurrentPage': false, 'href': 'https://googleprojectzero.blogspot.com/p/vulnerability-disclosure-faq.html', 'id': '2935252455704572784', 'title': 'Vulnerability Disclosure FAQ'}], 'mobile': false, 'showPlaceholder': true, 'hasCurrentPage': false}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-right-1', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull')); </script> </body> </html>