tag:blogger.com,1999:blog-11769492575416861272025-02-15T20:59:16.932-05:00Google Online Security BlogThe latest news and insights from Google on security and safety on the Internet.Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]Blogger616125tag:blogger.com,1999:blog-1176949257541686127.post-87683255326111920272025-01-29T12:59:00.002-05:002025-01-29T13:39:07.407-05:00How we kept the Google Play & Android app ecosystems safe in 2024<span class="byline-author">Posted by Bethel Otuteye and Khawaja Shams (Android Security and Privacy Team), and Ron Aquino (Play Trust and Safety)</span>
<p>
Android and Google Play comprise a vibrant ecosystem with billions of users around the globe and millions of helpful apps. Keeping this ecosystem safe for users and developers remains our top priority. However, like any flourishing ecosystem, it also attracts its share of bad actors. That’s why every year, we continue to invest in more ways to protect our community and fight bad actors, so users can trust the apps they download from Google Play and developers can build thriving businesses.
</p>
<p>
Last year, those investments included AI-powered threat detection, stronger privacy policies, supercharged developer tools, new industry-wide alliances, and more. As a result, <strong>we prevented 2.36 million policy-violating apps from being published on Google Play and banned more than 158,000 bad developer accounts that attempted to publish harmful apps. </strong><br>
</p>
<p>
But that was just the start. For more, take a look at our recent highlights from 2024:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW25Q2BOplDtBkLAULliNUloMIIcD0j6UtJgrmz3bAioa7gEFKdoY71iDoJ9gvbw-UnKJzsicA3AiLIiPLTBXBXg_n_yWPlSQem3jcrJy9CzLRxhkZjntJeT0juhMcfBDJWTs5I19TJwy3gffYYNCG7y9Xch63Otldnt1JmFGjEJdQbPktay3xw-z98T4z/s1600/bad_app_3b_stat%20_1200x630%20%20%20.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="630" data-original-width="1201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW25Q2BOplDtBkLAULliNUloMIIcD0j6UtJgrmz3bAioa7gEFKdoY71iDoJ9gvbw-UnKJzsicA3AiLIiPLTBXBXg_n_yWPlSQem3jcrJy9CzLRxhkZjntJeT0juhMcfBDJWTs5I19TJwy3gffYYNCG7y9Xch63Otldnt1JmFGjEJdQbPktay3xw-z98T4z/s1600/bad_app_3b_stat%20_1200x630%20%20%20.jpg"/></a></div>
</p>
<p>
<h3>Google’s advanced AI: helping make Google Play a safer place</h3><br><br>To keep out bad actors, we have always used a combination of human security experts and the latest threat-detection technology. In 2024, we used Google’s advanced AI to improve our systems’ ability to proactively identify malware, enabling us to detect and block bad apps more effectively. It also helps us streamline review processes for developers with a proven track record of policy compliance. Today, <strong>over 92% of our human reviews for harmful apps are AI-assisted</strong>, allowing us to take quicker and more accurate action to help prevent harmful apps from becoming available on Google Play.
</p>
<p>
That’s enabled us to stop more bad apps than ever from reaching users through the Play Store, protecting users from harmful or malicious apps before they can cause any damage.
</p>
<p>
<h3>Working with developers to enhance security and privacy on Google Play</h3>
</p>
<p>
To protect user privacy, we’re working with developers to reduce unnecessary access to sensitive data.<strong> In 2024, we prevented 1.3 million apps from getting excessive or unnecessary access to sensitive user data.</strong> We also required apps to be more transparent about how they handle user information by launching <a href="https://support.google.com/googleplay/android-developer/answer/13327111?hl=en">new developer requirements</a> and a new <a href="https://support.google.com/googleplay/thread/279819114/control-your-app-account-data-with-the-updated-data-safety-section">“Data deletion” </a>option for apps that support user accounts and data collection. This helps users manage their app data and understand the app’s deletion practices, making it easier for Play users to delete data collected from third-party apps.
</p>
<p>
We also worked to ensure that apps use the strongest and most up-to-date privacy and security capabilities Android has to offer. Every new version of Android introduces new security and privacy features, and we encourage developers to embrace these advancements as soon as possible. As a result of partnering closely with developers, <strong>over 91% of app installs on the Google Play Store now use the latest protections of Android 13 or newer. <br><br></strong>Safeguarding apps from scams and fraud is an ongoing battle for developers. The <a href="https://android-developers.googleblog.com/2024/12/making-play-integrity-api-faster-resilient-private.html">Play Integrity API </a>allows developers to check if their apps have been tampered with or are running in potentially compromised environments, helping them to prevent abuse like fraud, bots, cheating, and data theft. Play Integrity API and Play’s <a href="https://support.google.com/googleplay/android-developer/answer/10183279">automatic protection</a> helps developers ensure that users are using the official Play version of their app with the latest security updates. <strong>Apps using Play integrity features are seeing 80% lower usage from unverified and untrusted sources on average. </strong>
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz_Iim7vuzd9bgkk_kKayLD_qDbZ0uRcqbXjRwgYVg2cSONqIBeZhfoPUCleJHNkEiRFImfbZrDjnhJMuTiqRa21rNEaZ7O9qCOfvQnOS8D4QSQp4OOwQFvisyxaeL1T5GA-x3G9ztjfU1stixKqT5bJWDUhbuDot4nh9s9FJE1ITnpf57FSVTjosddwik/s1600/bad_app_asset_6%20_1920x1080%20.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz_Iim7vuzd9bgkk_kKayLD_qDbZ0uRcqbXjRwgYVg2cSONqIBeZhfoPUCleJHNkEiRFImfbZrDjnhJMuTiqRa21rNEaZ7O9qCOfvQnOS8D4QSQp4OOwQFvisyxaeL1T5GA-x3G9ztjfU1stixKqT5bJWDUhbuDot4nh9s9FJE1ITnpf57FSVTjosddwik/s1600/bad_app_asset_6%20_1920x1080%20.jpg"/></a></div>
<p>
We’re also constantly working to improve the safety of apps on Play at scale, such as with the<a href="https://play.google.com/sdks"> Google Play SDK Index</a>. This tool offers insights and data to help developers make more informed decisions about the safety of an SDK. Last year, in addition to adding 80 SDKs to the index, we also worked closely with SDK and app developers to address potential SDK security and privacy issues, helping to build safer and more secure apps for Google Play.
</p>
<p>
</p>
<p>
<h3>Google Play’s multi-layered protections against bad apps </h3><br><br>To create a trusted experience for everyone on Google Play, we use our <a href="https://security.googleblog.com/2024/04/how-we-fought-bad-apps-and-bad-actors-in-2023.html">SAFE principles</a> as a guide, incorporating multi-layered protections that are always evolving to help keep Google Play safe. These protections start with the developers themselves, who play a crucial role in building secure apps. We provide developers with <a href="https://developer.android.com/google/play/integrity/overview">best-in-class tools</a>, <a href="https://developer.android.com/security">best practices</a>, and on-demand training <a href="https://playacademy.withgoogle.com/courses/design">resources</a> for building safe, high-quality apps. Every app undergoes rigorous <a href="https://www.youtube.com/watch?v=uxFU9D4EtMc&t=1s">review and testing</a>, with only approved apps allowed to appear in the Play Store. Before a user downloads an app from Play, users can explore its user reviews, ratings, and <a href="https://support.google.com/googleplay/answer/11416267?hl=en&co=GENIE.Platform%3DAndroid">Data safety section</a> on Google Play to help them make an informed decision. And once installed, <a href="https://support.google.com/googleplay/answer/2812853?hl=en">Google Play Protect</a>, Android’s built-in security protection, helps to shield their Android device by continuously scanning for malicious app behavior.
</p>
<p>
<h3>Enhancing Google Play Protect to help keep users safe on Android</h3><br><br>While the Play Store offers best-in-class security, we know it’s not the only place users download Android apps – so it’s important that we also defend Android users from more generalized mobile threats. To do this in an open ecosystem, we’ve invested in sophisticated, real-time defenses that protect against scams, malware, and abusive apps. These intelligent security measures help to keep users, user data, and devices safe, even if apps are installed from various sources with varying levels of security. <br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6g_YmBZdHI0WvKGex5AIrmRQXPq5OrTt3K1186YSjvbDIV_dZhWU1XO69po667_ZydU35OUX2pLsLZVghMg02v9bLkYdmkvuR_V9AGXNt2tFModmJMxr37qeoIi4XasFJhqHqIyeQT-YbfyxhI41OSqMVoXgxKTBLHN9T0L1vwiF8yJa6t0Mu8ZqXyOr9/s1600/bad_app_asset_9%20_1920x1080%20.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6g_YmBZdHI0WvKGex5AIrmRQXPq5OrTt3K1186YSjvbDIV_dZhWU1XO69po667_ZydU35OUX2pLsLZVghMg02v9bLkYdmkvuR_V9AGXNt2tFModmJMxr37qeoIi4XasFJhqHqIyeQT-YbfyxhI41OSqMVoXgxKTBLHN9T0L1vwiF8yJa6t0Mu8ZqXyOr9/s1600/bad_app_asset_9%20_1920x1080%20.jpg"/></a></div>
<p>
<br><a href="https://support.google.com/googleplay/answer/2812853?hl=en">Google Play Protect</a> automatically scans every app on Android devices with Google Play Services, no matter the download source. This built-in protection, enabled by default, provides crucial security against malware and unwanted software. <strong>Google Play Protect scans more than 200 billion apps daily</strong> and performs <a href="https://security.googleblog.com/2023/10/enhanced-google-play-protect-real-time.html">real-time scanning</a> at the code-level on novel apps to combat emerging and hidden threats, like polymorphic malware. <strong>In 2024, Google Play Protect’s real-time scanning identified more than 13 million new malicious apps from outside Google Play<sup>1</sup>.</strong>
</p>
<p>
Google Play Protect is always evolving to combat new threats and protect users from harmful apps that can lead to scams and fraud. Here are some of the new improvements that are now available globally on Android devices with Google Play Services:
</p>
<ul>
<li><strong>Reminder notifications in Chrome on Android to re-enable Google Play Protect: </strong>According to our research, <a href="https://security.googleblog.com/2024/02/piloting-new-ways-to-protect-Android-users-from%20financial-fraud.html">more than 95 percent of app installations</a> from major malware families that exploit sensitive permissions highly correlated to financial fraud came from Internet-sideloading sources like web browsers, messaging apps, or file managers. To help users stay protected when browsing the web, Chrome will now display a reminder notification to re-enable Google Play Protect if it has been turned off. </li>
<li><strong>Additional protection against social engineering attacks: </strong>Scammers may manipulate users into disabling Play Protect during calls to download malicious Internet-sideloaded apps. To prevent this, the Play Protect app scanning toggle is now temporarily disabled during phone or video calls. This safeguard is enabled by default during traditional phone calls as well as during voice and video calls in popular third-party apps.</li>
<li><strong>Automatically revoking app permissions for potentially dangerous apps: </strong>Since Android 11, we’ve taken a proactive approach to data privacy by automatically<a href="https://developer.android.com/about/versions/11/privacy/permissions#auto-reset"> resetting permissions for apps that users haven't used in a while</a>. This ensures apps can only access the data they truly need, and users can always grant permissions back if necessary. To further enhance security, Play Protect now automatically revokes permissions for potentially harmful apps, limiting their access to sensitive data like storage, photos, and camera. Users can restore app permissions at any time, with a confirmation step for added security.</li>
</ul>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh4-K1i9h_9tZnmGFnqPV03xTe0Dau6DsGKL1OWJ4WIr14kUGeEeHsyireyB8vupCTAp-SPNdkMVDbjghEccBrfEyF_DbZXuHHeafVBqOQ2sWHf6eqcZqEXxAUzWLa-P6Y-ACqbLlX1TCO99FRA6s0xpFYgQcUyaXMfG4NOID7FfmxCYIZAAONBWmN-5Yy/s1600/bad_app_UX%20_shadow_text_1200x630%20.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="630" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh4-K1i9h_9tZnmGFnqPV03xTe0Dau6DsGKL1OWJ4WIr14kUGeEeHsyireyB8vupCTAp-SPNdkMVDbjghEccBrfEyF_DbZXuHHeafVBqOQ2sWHf6eqcZqEXxAUzWLa-P6Y-ACqbLlX1TCO99FRA6s0xpFYgQcUyaXMfG4NOID7FfmxCYIZAAONBWmN-5Yy/s1600/bad_app_UX%20_shadow_text_1200x630%20.jpg"/></a></div>
<p>
Google Play Protect’s <a href="https://security.googleblog.com/2024/02/piloting-new-ways-to-protect-Android-users-from%20financial-fraud.html">enhanced fraud protection pilot</a> analyzes and automatically blocks the installation of apps that may use sensitive permissions frequently abused for financial fraud when the user attempts to install the app from an Internet-sideloading source (web browsers, messaging apps, or file managers)<strong>. </strong><br><br>Building on the success of our initial pilot in partnership with the Cyber Security Agency of Singapore (CSA), additional enhanced fraud protection pilots are now active in nine regions – Brazil, Hong Kong, India, Kenya, Nigeria, Philippines, South Africa, Thailand, and Vietnam.
</p>
<p>
<strong>In 2024, Google Play Protect’s enhanced fraud protection pilots have shielded 10 million devices from over 36 million risky installation attempts, encompassing over 200,000 unique apps. </strong><br><br>By piloting these new protections, we can proactively combat emerging threats and refine our solutions to thwart scammers and their increasingly sophisticated fraud attempts. We look forward to continuing to partner with governments, ecosystem partners, and other stakeholders to improve user protections.
</p>
<p>
<h3>App badging to help users find apps they can trust at a glance on Google Play</h3>
</p>
<p>
In 2024, we introduced a new badge for government developers to help users around the world identify official government apps. Government apps are often targets of impersonation due to the highly sensitive nature of the data users provide, giving bad actors the ability to steal identities and commit financial fraud. Badging verified government apps is an important step in helping connect people with safe, high-quality, useful, and relevant experiences. We partner closely with global governments and are already exploring ways to build on this work.
</p>
<p>
We also recently introduced a <a href="https://android-developers.googleblog.com/2025/01/helping-users-find-trusted-apps-on-google-play.html">new badge</a> to help Google Play users discover VPN apps that take extra steps to demonstrate their strong commitment to security. We allow developers who adhere to Play safety and security guidelines and have passed an additional independent Mobile Application Security Assessment (MASA) to display a dedicated badge in the Play Store to highlight their increased commitment to safety.
</p>
<p>
<h3>Collaborating to advance app security standards </h3>
</p>
<p>
In addition to our partnerships with governments, developers, and other stakeholders, we also worked with our industry peers to protect the entire app ecosystem for everyone. The <a href="https://www.appdefensealliance.org/">App Defense Alliance</a>, in partnership with fellow steering committee members Microsoft and Meta, recently launched the ADA Application Security Assessment (ASA) <a href="https://github.com/appdefensealliance/ASA-WG/tree/v1.0">v1.0</a>, a new standard to help developers build more secure mobile, web, and cloud applications. This standard provides clear guidance on protecting sensitive data, defending against cyberattacks, and ultimately, strengthening user trust. This marks a significant step forward in establishing industry-wide security best practices for application development.
</p>
<p>
All developers are encouraged to review and comply with the new mobile security standard. You’ll see this standard in action for all carrier apps pre-installed on future Pixel phone models.<br>
</p>
<p>
<h3>Looking ahead</h3>
</p>
<p>
<br>This year, we’ll continue to protect the Android and Google Play ecosystem, building on these tools and resources in response to user and developer feedback and the changing landscape. As always, we’ll keep empowering developers to build safer apps more easily, streamline their policy experience, and protect their businesses and users from bad actors.
</p>
<hr>
<p>
<sup>1 </sup>Based on Google Play Protect 2024 internal data.
</p>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-13088651681872887642025-01-29T05:00:00.003-05:002025-01-29T12:03:41.745-05:00How we estimate the risk from prompt injection attacks on AI systems<span class="byline-author">Posted by the Agentic AI Security Team at Google DeepMind</span><div><br /></div><div><br /></div><div><span id="docs-internal-guid-38a46586-7fff-ecef-7ee0-c49cdbe3defb"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Modern AI systems, like Gemini, are more capable than ever, helping retrieve data and perform actions on behalf of users. However, data from external sources present new security challenges if untrusted sources are available to execute instructions on AI systems. Attackers can take advantage of this by hiding malicious instructions in data that are likely to be retrieved by the AI system, to manipulate its behavior. This type of attack is commonly referred to as an "indirect prompt injection," a term first coined by Kai Greshake and the NVIDIA team.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To mitigate the risk posed by this class of attacks, we are actively deploying defenses within our AI systems along with measurement and monitoring tools. One of these tools is a robust evaluation framework we have developed to automatically red-team an AI system’s vulnerability to indirect prompt injection attacks. We will take you through our threat model, before describing three attack techniques we have implemented in our evaluation framework.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Threat model and evaluation framework</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 251px; overflow: hidden; width: 624px;"><img height="251" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcBC8D3cO1_qIFrYspkL293CoOEa2NAUC2tEcJwNUFV0l6kTXBEG8C2roZixjn2SODEq7Edu3V7ecDurRT6lzQKgaXGb8HV4EnO-y9vKdBSFqGoQiuOfu6cqhdXR-ggdtgCfbZrQwT8u3ncCc4d1uYUTqqEGEb4he2zDIvIFjG_TaM?key=tya4pyIBHhKpvvMXTAVtWlkL" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our threat model concentrates on an attacker using indirect prompt injection to exfiltrate sensitive information, as illustrated above. The evaluation framework tests this by creating a hypothetical scenario, in which an AI agent can send and retrieve emails on behalf of the user. The agent is presented with a fictitious conversation history in which the user references private information such as their passport or social security number. Each conversation ends with a request by the user to summarize their last email, and the retrieved email in context.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The contents of this email are controlled by the attacker, who tries to manipulate the agent into sending the sensitive information in the conversation history to an attacker-controlled email address. The attack is successful if the agent executes the malicious prompt contained in the email, resulting in the unauthorized disclosure of sensitive information. The attack fails if the agent only follows user instructions and provides a simple summary of the email. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Automated red-teaming</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Crafting successful indirect prompt injections requires an iterative process of refinement based on observed responses. To automate this process, we have developed a red-team framework consisting of several optimization-based attacks that generate prompt injections (in the example above this would be different versions of the malicious email). These optimization-based attacks are designed to be as strong as possible; weak attacks do little to inform us of the susceptibility of an AI system to indirect prompt injections.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Once these prompt injections have been constructed, we measure the resulting attack success rate on a diverse set of conversation histories. Because the attacker has no prior knowledge of the conversation history, to achieve a high attack success rate the prompt injection must be capable of extracting sensitive user information contained in any potential conversation contained in the prompt, making this a harder task than eliciting generic unaligned responses from the AI system. The attacks in our framework include:</span></p><div><span><br /></span></div><div><span><br /></span></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Actor Critic:</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> This attack uses an attacker-controlled model to generate suggestions for prompt injections. These are passed to the AI system under attack, which returns a probability score of a successful attack. Based on this probability, the attack model refines the prompt injection. This process repeats until the attack model converges to a successful prompt injection. </span></p><div><span><br /></span></div><div><span><br /></span></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Beam Search: </span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This attack starts with a naive prompt injection directly requesting that the AI system send an email to the attacker containing the sensitive user information. If the AI system recognizes the request as suspicious and does not comply, the attack adds random tokens to the end of the prompt injection and measures the new probability of the attack succeeding. If the probability increases, these random tokens are kept, otherwise they are removed, and this process repeats until the combination of the prompt injection and random appended tokens result in a successful attack.</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><br /><br /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Tree of Attacks w/ Pruning (TAP): </span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Mehrotra et al. (2024) </span><a href="https://arxiv.org/abs/2312.02119" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">[3]</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> designed an attack to generate prompts that cause an AI system to violate safety policies (such as generating hate speech). We adapt this attack, making several adjustments to target security violations. Like Actor Critic, this attack searches in the natural language space; however, we assume the attacker cannot access probability scores from the AI system under attack, only the text samples that are generated.</span></p><div><span><br /></span></div><div><span><br /></span></div><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We are actively leveraging insights gleaned from these attacks within our automated red-team framework to protect current and future versions of AI systems we develop against indirect prompt injection, providing a measurable way to track security improvements. A single silver bullet defense is not expected to solve this problem entirely. We believe the most promising path to defend against these attacks involves a combination of robust evaluation frameworks leveraging automated red-teaming methods, alongside monitoring, heuristic defenses, and standard security engineering solutions. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><i><br /></i></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><i><br /></i></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><i><br /></i></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><i><span style="font-size: 11pt; white-space-collapse: preserve;">We would like to thank </span><span style="font-size: 14.6667px; white-space-collapse: preserve;">Vijay Bolina, Sravanti Addepalli, Lihao Liang, and Alex Kaskasoli for their prior contributions to this work</span><span style="font-size: 11pt; white-space-collapse: preserve;">.</span></i></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><b>Posted on behalf of the entire Google DeepMind Agentic AI Security team</b></span><b style="font-size: 11pt; white-space-collapse: preserve;"> (listed in alphabetical order):</b></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><i>Aneesh Pappu, Andreas Terzis, Chongyang Shi, Gena Gibson, Ilia Shumailov, Itay Yona, Jamie Hayes, John "Four" Flynn, Juliette Pluto, Sharon Lin, Shuang Song</i></span></p></span></div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-11772039331688088612025-01-23T13:00:00.003-05:002025-01-23T13:01:21.223-05:00Android enhances theft protection with Identity Check and expanded features<span class="byline-author">Posted by Jianing Sandra Guo, Product Manager, Android, Nataliya Stanetsky, Staff Program Manager, Android</span>
<p>
Today, people around the world rely on their mobile devices to help them stay connected with friends and family, manage finances, keep track of healthcare information and more – all from their fingertips. But a stolen device in the wrong hands can expose sensitive data, leaving you vulnerable to identity theft, financial fraud and privacy breaches.
</p>
<p>
This is why we <a href="https://security.googleblog.com/2024/10/android-theft-protection.html">recently launched Android theft protection</a>, a comprehensive suite of features designed to protect you and your data at every stage – before, during, and after device theft. As part of our commitment to help you stay safe on Android, we’re expanding and enhancing these features to deliver even more robust protection to more users around the world.
</p>
<p>
<strong>Identity Check rolling out to Pixel and Samsung One UI 7 devices</strong>
</p>
<p>
We’re officially launching<strong> Identity Check, </strong>first on Pixel and Samsung Galaxy devices eligible for <a href="https://www.samsungmobilepress.com/press-releases/samsung-one-ui-7-enhances-security-and-privacy-in-the-age-of-ai-giving-users-greater-transparency-and-choice/">One UI 7</a><sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup>, to provide better protection for your critical account and device settings. When you turn on Identity Check, your device will require explicit biometric authentication to access certain sensitive resources when you’re outside of trusted locations. Identity Check also enables <a href="https://support.google.com/android/answer/15146908?visit_id=638723797364521505-524711212&p=identity_check&rd=1#identity_check">enhanced protection for Google Accounts</a> on all supported devices and additional security for Samsung Accounts on One UI 7 eligible Galaxy devices, making it much more difficult for an unauthorized attacker to take over accounts signed in on the device.
</p>
<p>
As part of enabling Identity Check, you can designate one or more trusted locations. When you’re outside of these trusted places, biometric authentication will be required to access critical account and device settings, like changing your device PIN or biometrics, disabling theft protection, or accessing Passkeys.
</p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3WKuccDXIn8R-PEKpn51zTXP1SjLi8IruimmVyykwe4iCgrD-sFMGblSHM-sPGqLmkoeoA8QwtgzhyphenhyphensRkMXaN3ox-DnVlf2ula9N8xvBPMyvD-7AGmmpKNJ8JQwehTiu3HV6WfWKdqt1oOoEHUJg0HnUblF_Gdn5Jged125SiYpUxYrgPE_MK0EstDIM/s1600/Identity%20Check%20-%20Android%20Theft%20Protection.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1080" data-original-width="1141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3WKuccDXIn8R-PEKpn51zTXP1SjLi8IruimmVyykwe4iCgrD-sFMGblSHM-sPGqLmkoeoA8QwtgzhyphenhyphensRkMXaN3ox-DnVlf2ula9N8xvBPMyvD-7AGmmpKNJ8JQwehTiu3HV6WfWKdqt1oOoEHUJg0HnUblF_Gdn5Jged125SiYpUxYrgPE_MK0EstDIM/s1600/Identity%20Check%20-%20Android%20Theft%20Protection.png"/></a></div>
Identity Check gives you more peace of mind that your most sensitive device assets are protected against unauthorized access, even if a thief or bad actor manages to learn your device PIN.
</p>
<p>
Identity Check is rolling out now to Pixel devices with Android 15 and will be available on One UI 7 eligible Galaxy devices in the coming weeks. It will roll out to supported Android devices from other manufacturers later this year.
</p>
<p>
<strong>Theft Detection Lock: expanding AI-powered protection to more users </strong>
</p>
<p>
One of the top theft protection features introduced last year was Theft Detection Lock, which uses an on-device AI-powered algorithm to help detect when your phone may be forcibly taken from you. If the machine learning algorithm detects a potential theft attempt on your unlocked device, it locks your screen to keep thieves out.
</p>
<p>
Theft Detection Lock is now fully rolled out to Android 10+ phones<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup> around the world.
</p>
<p>
<strong>Protecting your Android device from theft</strong>
</p>
<p>
We're collaborating with the <a href="https://www.gsma.com/">GSMA</a> and industry experts to combat mobile device theft by sharing information, tools and prevention techniques. Stay tuned for an upcoming GSMA white paper, developed in partnership with the mobile industry, with more information on protecting yourself and your organization from device theft.
</p>
<p>
With the addition of Identity Check and the ongoing enhancements to our existing features, Android offers a robust and comprehensive set of tools to protect your devices and your data from theft. We’re dedicated to providing you with peace of mind, knowing your personal information is safe and secure.
</p>
<p>
<em>You can turn on the new Android theft features by clicking <a href="https://www.android.com/settings/theftprotection">here</a> on a supported Android device. Learn more about our theft protection features by visiting our <a href="https://support.google.com/android/answer/15146908">help center</a>. </em>
</p>
<!-- Footnotes themselves at the bottom. -->
<h2>Notes</h2>
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
Timing, availability and feature names may vary in One UI 7. <a href="#fnref1" rev="footnote">↩</a><li id="fn2">
<p>
With the exclusion for Android Go smartphones <a href="#fnref2" rev="footnote">↩</a>
</ol></div>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-88073956690794308492025-01-16T14:06:00.010-05:002025-01-16T14:09:19.851-05:00OSV-SCALIBR: A library for Software Composition Analysis<span class="byline-author">Posted by Erik Varga, Vulnerability Management, and Rex Pan, Open Source Security Team</span><div><br /></div><div><span id="docs-internal-guid-2b371a4a-7fff-7f6b-7f3e-16189915cbc1"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In December 2022, we </span><a href="https://security.googleblog.com/2022/12/announcing-osv-scanner-vulnerability.html" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">announced OSV-Scanner</span></a><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, a tool to enable developers to easily scan for vulnerabilities in their open source dependencies. Together with the open source community, we’ve continued to build this tool, adding </span><a href="https://opensource.googleblog.com/2024/04/osv-and-helping-developers-fix-known-vulnerabilities.html" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">remediation features</span></a><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, as well as expanding ecosystem support to 11 programming languages and 20 package manager formats. </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Today, we’re excited to release </span><a href="https://github.com/google/osv-scalibr" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">OSV-SCALIBR</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (Software Composition Analysis LIBRary), an extensible library for SCA and file system scanning. OSV-SCALIBR combines Google’s internal vulnerability management expertise into one scanning library with significant new capabilities such as:</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">SCA for installed packages, standalone binaries, as well as source code</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">OSes package scanning on Linux (COS, Debian, Ubuntu, RHEL, and much more), Windows, and Mac</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Artifact and lockfile scanning in major language ecosystems (Go, Java, Javascript, Python, Ruby, and much more)</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Vulnerability scanning tools such as weak credential detectors for Linux, Windows, and Mac</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">SBOM generation in SPDX and CycloneDX, the two most popular document formats</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Optimization for on-host scanning of resource constrained environments where performance and low resource consumption is critical</span></p></li></ul><div><span face="Arial, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span></div><div><span face="Arial, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">OSV-SCALIBR is now the primary SCA engine used within Google for live hosts, code repos, and containers. It’s been used and tested extensively across many different products and internal tools to help generate SBOMs, find vulnerabilities, and help protect our users’ data at Google scale.</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We offer OSV-SCALIBR primarily as an open source Go library today, and we're working on adding its new capabilities into OSV-Scanner as the primary CLI interface.</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h2 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 18pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Using OSV-SCALIBR as a library</span></h2><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">All of OSV-SCALIBR's capabilities are modularized into plugins for software extraction and vulnerability detection which are </span><a href="https://github.com/google/osv-scalibr/blob/main/docs/new_extractor.md" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">very simple to expand</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.You can use OSV-SCALIBR as a library to:</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1.Generate SBOMs from the build artifacts and code repos on your live host:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #e0e0e0 1pt; border-color: rgb(224, 224, 224); border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-style: solid; border-top: solid #e0e0e0 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">import</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"context"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/osv-scalibr"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/osv-scalibr/converter"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/osv-scalibr/extractor/filesystem/list"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/osv-scalibr/fs"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/osv-scalibr/plugin"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">spdx</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/spdx/tools-golang/spdx/v2/v2_3"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">func</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">GenSBOM</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ctx</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">context</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Context</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">) </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">*</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">spdx</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Document</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> {</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">capab</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> := &</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">plugin</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Capabilities</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">OS</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">plugin</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">OSLinux</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">cfg</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:=</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">&</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">scalibr</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ScanConfig</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ScanRoots</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">fs</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">RealFSScanRoots</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"/"</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">),</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">FilesystemExtractors</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">list</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">FromCapabilities(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">capab)</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Capabilities</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: </span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">capab</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">result</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:=</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">scalibr</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">New</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">().</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Scan</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ctx</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">cfg</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">return</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">converter</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ToSPDX23</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">result</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">converter</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">SPDXConfig</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{})</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">2. Scan a git repo for SBOMs:</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Simply replace </span><span face="Consolas, sans-serif" style="color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"/"</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> with the path to your git repo. Also take a look at the </span><a href="https://github.com/google/osv-scalibr/blob/d4ea36720d4e700486fef2ba9b5f2ac2fd8ce6c8/extractor/filesystem/list/list.go#L70" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">various language extractors</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to enable for code scanning.</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">3. Scan a remote container for SBOMs:</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Replace the scan config from the above code snippet with</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #e0e0e0 1pt; border-color: rgb(224, 224, 224); border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-style: solid; border-top: solid #e0e0e0 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">import</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> ...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/go-containerregistry/pkg/authn"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/go-containerregistry/pkg/v1/remote"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"github.com/google/osv-scalibr/artifact/image"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> ...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">filesys</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">_</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:=</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">image</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">NewFromRemoteName</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"alpine:latest"</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">remote</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">WithAuthFromKeychain</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">authn</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">DefaultKeychain</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">),</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">cfg</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:=</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">&</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">scalibr</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ScanConfig</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ScanRoots</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: []</span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">*</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">fs</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ScanRoot</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{{</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">FS</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">filesys</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}},</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">4. Find vulnerabilities on your filesystem or a remote container:</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Extract the PURLs from the </span><a href="https://github.com/google/osv-scalibr/blob/08fdef73ebdffae84479e5c900f6e2c0c2865034/scalibr.go#L157" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">SCALIBR inventory results</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> from the previous steps:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #e0e0e0 1pt; border-color: rgb(224, 224, 224); border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-style: solid; border-top: solid #e0e0e0 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">import</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> ...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> "github.com/google/osv-scalibr/converter"</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">...</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">result</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:=</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">scalibr</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">New</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">().</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Scan</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ctx</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">cfg</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">)</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">for</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">_</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">i</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:=</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">range</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">result</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Inventories</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> {</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">fmt</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Println</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008855; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">converter</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face="Consolas, sans-serif" style="background-color: transparent; color: blue; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ToPURL</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #0055aa; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">i</span><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">))</span></p><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #202124; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">And send them to </span><a href="http://osv.dev" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">osv.dev</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, e.g.</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #e0e0e0 1pt; border-color: rgb(224, 224, 224); border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-style: solid; border-top: solid #e0e0e0 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="background-color: white; line-height: 1.62857; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: transparent; color: #770088; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">$ </span><span face="Consolas, sans-serif" style="background-color: transparent; color: #008800; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">curl -d '{"package": {"purl": "pkg:npm/[email protected]"}}' "https://api.osv.dev/v1/query"</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">See </span><a href="https://github.com/google/osv-scalibr?tab=readme-ov-file#how-to-use" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">the usage docs</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for more details.</span></p><br /><h2 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 18pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">OSV-Scanner + OSV-SCALIBR</span></h2><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Users looking for an out-of-the-box vulnerability scanning CLI tool should check out </span><a href="https://github.com/google/osv-scanner" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">OSV-Scanner</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, which already provides comprehensive language package scanning capabilities using much of the same extraction as OSV-SCALIBR. </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Some of OSV-SCALIBR’s capabilities are not yet available in OSV-Scanner, but we’re currently working on integrating OSV-SCALIBR more deeply into OSV-Scanner. This will make more and more of OSV-SCALIBR’s capabilities available in OSV-Scanner in the next few months, including installed package extraction, weak credentials scanning, SBOM generation, and more.</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Look out soon for an announcement of OSV-Scanner V2 with many of these new features available. OSV-Scanner will become the primary frontend to the OSV-SCALIBR library for users who require a CLI interface. Existing users of OSV-Scanner can continue to use the tool the same way, with backwards compatibility maintained for all existing use cases. </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For installation and usage instructions, have a look at OSV-Scanner’s documentation </span><a href="https://google.github.io/osv-scanner/" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">here</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><h2 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 18pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></h2><h2 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 18pt;"><span face="Arial, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">What’s next</span></h2><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In addition to making all of OSV-SCALIBR’s features available in OSV-Scanner, we're also working on additional new capabilities. Here's some of the things you can expect:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Support for more OS and language ecosystems, both for regular extraction and for </span><a href="https://osv.dev/blog/posts/announcing-guided-remediation-in-osv-scanner/" style="text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Guided Remediation</span></a></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Layer attribution and base image identification for container scanning</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Reachability analysis to reduce false positive vulnerability matches</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">More vulnerability and misconfiguration detectors for Windows</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">More weak credentials detectors</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We hope that this library helps developers and organizations to secure their software and encourages the open source community to contribute back by sharing new plugins on top of OSV-SCALIBR.</span></p><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If you have any questions or if you would like to contribute, don't hesitate to reach out to us at [email protected] or by posting an issue in our </span><a href="https://github.com/google/osv-scalibr/issues" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">issue tracker</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></span></div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-72180193109380717922024-12-10T13:11:00.005-05:002024-12-10T13:11:43.106-05:00Google Cloud expands vulnerability detection for Artifact Registry using OSV<span class="byline-author">Posted by Greg Mucci, Product Manager, Artifact Analysis, Oliver Chang, Senior Staff Engineering, OSV, and Charl de Nysschen, Product Manager OSV</span><div><br /></div><div><span id="docs-internal-guid-e83dd7d8-7fff-dd0f-611a-9785ce55d111"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">D</span><span face=""Google Sans", sans-serif" style="color: #444746; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">evOps teams dedicated to securing their supply chain and predicting potential risks consistently face novel threats. Fortunately, they can now improve their image and container security by harnessing Google-grade vulnerability scanning, which offers expanded open-source coverage. A significant benefit of utilizing Google Cloud Platform is its integrated security tools, including Artifact Analysis. This scanning service leverages the same infrastructure that Google depends on to monitor vulnerabilities within its internal systems and software supply chains.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="color: #444746; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="color: #444746; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Artifact Analysis has recently expanded its scanning coverage to eight additional language packages, four operating systems, and two extensively utilized base images, making it a more robust and versatile tool than ever before. </span><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="background-color: white; color: #444746; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This enhanced coverage was achieved by integrating Artifact Analysis with the Open Source Vulnerabilities (OSV) platform and database. This integration provides industry-leading insights into open source vulnerabilities—a crucial capability as software supply chain attacks continue to grow in frequency and complexity, impacting organizations reliant on open source software.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="background-color: white; color: #444746; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="color: #444746; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">With these recent updates, customers can now successfully scan the vast majority of the images they push to Artifact Registry. These successful scans ensure that any known vulnerabilities are detected, reported, and can be integrated into a broader vulnerability management program, allowing teams to take prompt action</span><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span face=""Google Sans", sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Open source vulnerabilities, with more reach </span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Artifact Analysis pulls vulnerability information directly from OSV, which is the only open source, distributed vulnerability database that gets information directly from open source practitioners. OSV’s database provides a consistent, high quality, high fidelity database of vulnerabilities from authoritative sources who have adopted the </span><a href="https://ossf.github.io/osv-schema/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">OSV schema</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. This ensures the database has accurate information to reliably match software dependencies to known vulnerabilities—previously a difficult process reliant on inaccurate mechanisms such as CPEs (Common Platform Enumerations). </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Over the past three years, OSV has increased its total coverage to 28 language and OS ecosystems. For example, industry leaders such as GitHub, Chainguard, and Ubuntu, as well as open source ecosystems such as Rust and Python are now exporting their vulnerability discoveries in the OSV Schema. This increased coverage also includes </span><a href="https://www.chainguard.dev/chainguard-images" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Chainguard’s</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Wolfi images and </span><a href="https://github.com/GoogleContainerTools/distroless/blob/main/README.md" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Google’s Distroless images</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, which are popular choices for minimal container images used by many developers and organizations. Customers who rely on distroless images can count on Artifact Analysis scanning to support their minimal container image initiatives. Each expansion in OSV’s coverage is incorporated into scanning tools that integrate with the OSV database.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span face=""Google Sans", sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Broader vulnerability detection with Artifact Analysis </span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">As a result of OSV’s expansion, scanners like Artifact Analysis that draw from OSV now alert users to higher quality vulnerability information across a broader set of ecosystems—meaning GCP project owners will be made aware of a </span><a href="https://cloud.google.com/artifact-analysis/docs/container-scanning-overview#feature-support" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">more complete set</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> of vulnerability findings and potential security risks. </span></p><div><span><br /></span></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Existing </span><a href="https://cloud.google.com/artifact-registry/docs/analysis#automatic_scanning" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Artifact Registry scanning</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> customers don't need to take any action to take advantage of this update. Projects that have scanning enabled will immediately benefit from this expanded coverage and vulnerability findings will continue to be available in the Artifact Registry UI, Container Analysis API, and via </span><a href="https://cloud.google.com/artifact-analysis/docs/pub-sub-notifications?hl=en" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">pub/sub</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (for workflows).</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="background-color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Existing </span><a href="https://cloud.google.com/artifact-registry/docs/analysis#on-demand_scanning" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="background-color: white; color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">On Demand scanning</span></a><span face=""Google Sans", sans-serif" style="background-color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> cust</span><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">omers will also benefit from this expanded vulnerability coverage. All the same Operating Systems and Language package coverage that Registry Scanning customers enjoy are available in On Demand Scan. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span face=""Google Sans", sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Beyond Artifact Registry </span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We know that detection is just one of the first steps necessary to manage risks. We’re continually expanding Artifact Analysis capabilities and in 2025 we’ll be integrating Artifact Registry vulnerability findings with Google Cloud’s </span><a href="https://cloud.google.com/security/products/security-command-center?hl=en" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Security Command Center</span></a><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Through Security Command Center customers can maintain a more comprehensive vulnerability management program, and prioritize risk across a number of different dimensions. </span></p></span></div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-64861977220908774662024-12-05T12:53:00.017-05:002024-12-12T16:20:20.010-05:00Announcing the launch of Vanir: Open-source Security Patch Validation<div><span color="rgba(0, 0, 0, 0.54)" face="Roboto, sans-serif" style="font-size: 14px;">Posted by Hyunwook Baek, Duy Truong, Justin Dunlap and Lauren Stan from Android Security and Privacy, and Oliver Chang with the Google Open Source Security Team</span></div><div><span id="docs-internal-guid-27ee44bd-7fff-1fab-ef9f-2fbfa0581f97"><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Today, we are announcing the availability of </span><a href="https://github.com/google/vanir" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Vanir</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, a new open-source security patch validation tool. Introduced at Android Bootcamp in April, Vanir gives Android platform developers the power to quickly and efficiently scan their custom platform code for missing security patches and identify applicable available patches. Vanir significantly accelerates patch validation by automating this process, allowing OEMs to ensure devices are protected with critical security updates much faster than traditional methods. This strengthens the security of the Android ecosystem, helping to keep Android users around the world safe. </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">By open-sourcing Vanir, we aim to empower the broader security community to contribute to and benefit from this tool, enabling wider adoption and ultimately improving security across various ecosystems. While initially designed for Android, Vanir can be easily adapted to other ecosystems with relatively small modifications, making it a versatile tool for enhancing software security across the board. In collaboration with the Google Open Source Security Team, we have incorporated feedback from our early adopters to improve Vanir and make it more useful for security professionals. </span><a href="https://github.com/google/vanir." style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">This tool is now available</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for you to start developing on top of, and integrating into, your systems.</span></p><p style="line-height: 1.656; margin-bottom: 33pt; margin-top: 39pt; text-align: left;"><span style="font-size: 12pt; font-weight: normal; white-space-collapse: preserve;">The Android ecosystem relies on a multi-stage process for vulnerability mitigation. When a new vulnerability is discovered, upstream AOSP developers create and release upstream patches. The downstream device and chip manufacturers then assess the impact on their specific devices and backport the necessary fixes. This process, while effective, can present scalability challenges, especially for manufacturers managing a diverse range of devices and old models with complex update histories. Managing patch coverage across diverse and customized devices often requires considerable effort due to the manual nature of backporting.</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To streamline the vital security workflow, we developed Vanir. Vanir provides a scalable and sustainable solution for security patch adoption and validation, helping to ensure Android devices receive timely protection against potential threats.</span></p><h1 dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 39pt;"><span face="Roboto, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">The power of Vanir</span></h1><h2 dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Source-code-based static analysis </span></h2><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Vanir’s first-of-its-kind approach to Android security patch validation uses source-code-based static analysis to directly compare the target source code against known vulnerable code patterns. Vanir does not rely on traditional metadata-based validation mechanisms, such as version numbers, repository history and build configs, which can be prone to errors. This unique approach enables Vanir to analyze entire codebases with full history, individual files, or even partial code snippets. </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">A main focus of Vanir is to automate the time consuming and costly process of identifying missing security patches in the open source software ecosystem. During the early development of Vanir, it became clear that manually identifying a high-volume of missing patches is not only labor intensive but also can leave user devices inadvertently exposed to known vulnerabilities for a period of time. To address this, Vanir utilizes novel automatic signature refinement techniques and multiple pattern analysis algorithms, inspired by the vulnerable code clone detection algorithms proposed by </span><a href="https://ieeexplore.ieee.org/document/6234404" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Jang et al.</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> [1] and </span><a href="https://ieeexplore.ieee.org/document/7958600" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Kim et al.</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> [2]. These algorithms have low false-alarm rates and can effectively handle broad classes of code changes that might appear in code patch processes. In fact, based on our 2-year operation of Vanir, only 2.72% of signatures triggered false alarms. This allows Vanir to efficiently find missing patches, even with code changes, while minimizing unnecessary alerts and manual review efforts. </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Vanir's source-code-based approach also enables rapid scaling across any ecosystem. It can generate signatures for any source files written in supported languages. Vanir's signature generator automatically generates, tests, and refines these signatures, allowing users to quickly create signatures for new vulnerabilities in any ecosystem simply by providing source files with security patches. </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Android’s successful use of Vanir highlights its efficiency compared to traditional patch verification methods. A single engineer used Vanir to generate signatures for over 150 vulnerabilities and verify missing security patches across its downstream branches – all within just five days.</span></p><h2 dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Vanir for Android</span></h2><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Currently Vanir supports C/C++ and Java targets and covers 95% of Android kernel and userspace CVEs with public security patches. Google Android Security team consistently incorporates the latest CVEs into Vanir’s coverage to provide a complete picture of the Android ecosystem’s patch adoption risk profile. </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Vanir signatures for Android vulnerabilities are published through the </span><a href="https://osv.dev/" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Open Source Vulnerabilities (OSV)</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> database. This allows Vanir users to seamlessly protect their codebases against latest Android vulnerabilities without any additional updates. Currently, there are over </span><a href="https://osv.dev/list?q=&ecosystem=Android" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">2,000 Android vulnerabilities in OSV</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and finishing scanning an entire Android source tree can take 10-20 minutes with a modern PC.</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 273px; overflow: hidden; width: 682px;"><img height="273" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAAKACAYAAADEq7QAAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Qd4VFX6BvB3anpPIKQBIQFCb1LtoKCgK64oCuraK4hrL4gFsCCKvaFgBQEXsWFFFBCU3ktCCSQhCek9k8zM//+dKSSQkAAJmUne+zysMLnlnN+9Qfe++c6nATcKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUo0MwENM1sPpwOBShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFAADED4EFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKNDsBBiDN7pZyQhSgAAUoQAEKUIACFKAABShAAQpQgAIUoAAFKEABCjAA4TNAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFKBAsxNgANLsbiknRAEKUIACFKAABShAAQpQgAIUoAAFKEABClCAAhSgAAMQPgMUoAAFKEABClCAAhSgAAUoQAEKuIpAOwADAXQFEAUgAIDVVQbHcVCAAhSgAAUocEoCZgB5APYB2ATgLwAFp3SmkzyIAchJgnF3ClCAAhSgAAUoQAEKUIACFKAABRpMQAKOeACXAbgHQEiDnZknogAFKEABClDAlQX2AJgJYDmAVADFjTFYBiCNocpzUoACFKAABShAAQpQgAIUoAAFKHAiAQk+LgRw3f//FOjFAPxjYmIwePBgdOjQAREREQgKCoKnpyf0ej0lKUABClCAAhRwYwGTyYSSkhJkZWXh0KFD2L17N3744QfHjFIAyB++BLAKQHlDTpUBSENq8lwUoAAFKEABClCAAhSgAAUoQAEK1CUgFR8PARgJIKJXr16444470KdPH0RGRsLb2xteXl7w8PCARsPXFnVh8usUoAAFKEABdxCwWCwoKytTQUhBQYEKQtauXYuHHpL/JFBbMoDPALwLQEKRBtn4XxINwsiTUIACFKAABShAAQpQgAIUoAAFKFAPgYsAzJXgQ/ZduHAhRo4cCYPBwEqPeuBxFwpQgAIUoEBzEqioqEB2djY+/vhjPProozI16fslVSC3A9jZEHNlANIQijwHBShAAQpQgAIUoAAFKEABClCAAicSMAIYA2AOAMM999yDSZMmIS4ujmoUoAAFKEABClAA69evx4wZM/Dll7ISFg4D+DeA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rEFIzNijqYPpb38sB/nSGXXNUQAZdUvKCZEACZAACZAACZAACZAACZAACRwyAcmHfheArwHwAvgsgGWH3BpPJAESIIExQoACyBhZ6OE6TREaOmtaeyNARACZdP4Uk46KZYwToAAyxi8ATp8ESIAESIAESIAESIAESIAESKAPgR8D+BYAMZD9KoBgLnEWEiABEiCB/RKgAMILZEgJiADSUd2KlTcGU2DlXDUHGRdMpQAypKsyTDqnADJMFoLDIAESIAESIAESIAESIAESIAESGGIC3wUgAkg1gGsB/HOIx8PuSYAESGDEEKAAMmKWapQOVAGBNh+aN9bC9tuIyUxEdEY8TcNH6XIf1LQogBwULlYmARIgARIgARIgARIgARIgARIYdQQiQymvfgagfufjBgDPjLpZckIkQAIkcAQJUAA5gnDZ9AAJGPPxkOn6vjw8BtgUq40iAhRARtFiciokQAIkQAIkQAIkQAIkQAIkQAKHQEBMzsX3IzUkhDwEIHAI7fAUEiABEhizBCiAjNml58RJYJgToAAyzBeIwyMBEiABEiABEiABEiABEiABEjiCBI4L+Xwkh7w/7gVAw9QjCJxNkwAJjE4CFEBG57pyViQw8gkodCptnfjOFU+vGvmT4QxIgARIgARIgARIgARIgARIgARIYMAEjgHwOoBYAHeG/D8ofgwYHyuSAAmQwC4CgyaAzHjmUneSVt+F1t/b+cbsJmQSIAESOEwCbbaFk9697NnVh9kOTycBEiABEiABEiABEiABEiABEiCBkUJgIYD/BSAiyH0hAaRxpAye4yQBEiCB4UZg0ASQJW8scfqq025SSv8QQNRwmyjHQwIkMOII1FiwTn37iqc3jriRc8AkQAIkQAIkQAIkQAIkQAIkQAIkcPAEMgH8HsA5AJ4HcM1O74+6g2+GZ5AACZAACYQJDJoAIg2e+OSln4XC/QDiiZgESIAEDouAwnqnM3DOm598ruqw2uHJJEACJEACJEACJEACJEACJEACJDAyCPwTwMcBLANwGYBtI2PYHCUJkAAJDF8CgyyAfPI4KOtxAHnDd8ocGQmQwIggoPUzjQ712aLLnu0ZEePlIEmABEiABEiABEiABEiABEiABEjg0AhEA/glgC8DeCcU+bH50JriWSRAAiRAAn0JDKoAcvwzlyZbNv6igqF6LCRAAiRwqAS6odT3l17+jPwByEICJEACJEACJEACJEACJEACJEACo5WApJH/OoC7AXhCIogYoLOQAAmQAAkMAoFBFUBkPCc8dfkNFuzfDMLY2AQJkMAYJaCAEgvWp9+64ukPxygCTpsESIAESIAESIAESIAESIAESGBsELg8ZHaeDuCinebnLwDQY2PqnCUJkAAJHHkCgy6AyJBPfOrSMgA5R3747IEESGCUErjXmV53y5unvukfpfPjtEiABEiABEiABEiABEiABEiABEhgJoC3dwogSQC+EjJAJxUSIAESIIFBJHBEBJBTHr/s1ICl/wFFM/RBXCs2RQJjg4DGUtvt+sy7n3yifGxMmLMkARIgARIgARIgARIgARIgARIYgwSmAPg7gEIA9+yc/x0A6IE5Bi8ETpkESODIEjgiAsilz1zqqNb6B1qr/wEguQxZSIAESGAgBGq0hUuWXfbs0oFUZh0SIAESIAESIAESIAESIAESIAESGIEEJgOQ9PGS8upJAN/aaXy+dQTOg0MmARIggWFP4IgIIDLrhc9dPM7d4/wZFL7IzIXD/jrgAElgOBDoUBpfe+dTz/55OAyGYyABEiABEiABEiABEiABEiABEiCBI0DACeAuALfsNDyvBnAsxY8jQJlNkgAJkECIwBETQMKEFz952W1Q+psKSCB1EiABEtgLARvAeh2wv7vsyr/9m4RIgARIgARIgARIgARIgARIgARIYBQTuBnALwE0iI0ugE2jeK6cGgmQAAkMOYEjLoDIDE966pIrNNSnNXAyhZAhX3MOgASGE4GtGuo5y3Y89M6nn1w7nAbGsZAACZAACZAACZAACZAACZAACZDAIBM4CcCLALoB3ATg8UFun82RAAmQAAnsRuCoCCDS58lPXjjZdriPhY3zAPMYz9UgARIYswRWAHjZsvFfy4nlb172bNuYJcGJkwAJkAAJkAAJkAAJkAAJkAAJjAUCswE8BkB+SgqsnwDoGAsT5xxJgARIYCgJHDUBJDxJMUjfFtEdrTuj0iwEptnKmqC00kMJgX2TAAkceQLasv1Kq/IepTfGtMc0vXn1n7uh6BB05MmzBxIgARIgARIgARIgARIgARIggSEmIDcB/w7AxQD+CuALAFqHeEzsngRIgATGBIGjLoCMCaqcJAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkALgA/2hnt8W0AZQCOA1BPMCRAAiRAAkeHAAWQo8OZvZAACZAACZAACZAACZAACZAACZAACZAACYw9ApcA+GMo4uNqAK+OPQScMQmQAAkMHQEKIEPHnj2TAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmMXgKZAN7dmf4qDcAtAO4DYI/e6XJmJEACJDD8CFAAGX5rwhGRAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmMbAITATwN4MSQ/4cIIG0je0ocPQmQAAmMPAIUQEbemnHEJEACJEACJEACJEACJEACJEACJEACJEACw5dALIDbQr4f7wO4AkD58B0uR0YCJEACo5cABZDRu7acGQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQwNEncAGAhwHEAThj52Pp0R8CeyQBEiABEhACFEB4HZAACZAACZAACZAACZAACZAACZAACZAACZDA4BGo2CmATAZwPYAHBq9ZtkQCJEACJHCwBCiAHCwx1icBEiABEiABEiABEiABEiABEiABEiABEiCBPQlEAXgUwCUA/hfAN3ean3cSFAmQAAmQwNARoAAydOzZMwmQAAmQAAmQAAmQAAmQAAmQAAmQwBgksEKvcDmr4tJ0hD9VWdpt21akciBCQXGfZkReD07U19biu9d98+Tlb79/S25hXv037rjlvlPOXrIigADXdESuKQc9mgloaG0FdJdtObuU8ncon7/uufTndtyp7rRH87zH6tz4JjxWV57zJgESIAESIAESIAESIAESIAESIAESOGoEVm3fMh1O/8cs255rA2nKUola6wStlUspuAHzYBmJBJTC+pVr1fe+8q34Kk9F5C///JueUz52WrPlcNjQeiTOiGMmgVFLQBuhWdsK8AHotjW6LQeaYesWBJRXO/RytyPitVnj8itHLYQxNjEKIGNswTldEiABEiABEiABEiABEiABEiABEiCBI0vgDY8nMs7dnqYdap7Loa6wtToN0GlHtle2PhQELMtCU0MT7r39Hrzw1HO48sufw3d+ehv8Ph80xY+hWBL2SQKHT0B2zJX2ImA9B23/23aoDa0p0+pOVcp/+I2zhaNNgALI0SbO/kiABEiABEiABEiABEiABEiABEiABEYlgVXbNmRplz7Rsq2TbaVPUcCUUTlRTqqXgMPpwN8eeRo/vPl2nHjmybj7f3+OhMQE2DYz6fAyIYFRRGAVoF+xlVpq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VGc/v1LzNdf8LCMBxPzWlCwiAkSACBABIkAEiAARIAJEgAgQASJABIyAwKm0y6FSAUMlEklnragNBMA8Q2yNYGo0BSJABIgAEbg7gTwRSBe0uCEI2CcVpb+EeTaLIVimS4AEENNdO5o5ESACRIAIEAEiQASIABEgAkSACBABImAiBE5nXWsuaDWtBSBQhNZL4GKIzFsQtBaiCGsANgJEiYmYQ9MkAkSACJgsARGCBgJKoUUxIJQC2jQAaYJMSBC12lipRnaptWfzWJM1kCZ+GwESQOiBIAJEgAgQASJABIgAESACRIAIEAEiQASIQB0SiBQjLZR5ShtBY2OrLFdKLKVymVailQmCQOc0dbgONBQRIAINk4AoiqJEK1FL5Cp1uVaqVkvkxaXOSSXdhe7qhknEvK2mL1bzXl+yjggQASJABIgAESACRIAIEAEiQASIABEgAkSACBABIkAEiECDJEACSINcdjKaCBABIkAEiAARIAJEgAgQASJABIgAESACRIAIEAEiQASIgHkTIAHEvNeXrCMCRIAIEAEiQASIABEgAkSACBABIkAEiAARIAJEgAgQASLQIAmQANIgl52MJgJEgAgQASJABIgAESACRIAIEAEiQASIABEgAkSACBABImDeBEgAMe/1JeuIABEgAkSACBABIkAEiAARIAJEgAgQASJABIgAESACRIAINEgCJIA0yGUno4kAESACRIAIEAEiQASIABEgAkSACBABIkAEiAARIAJEgAiYNwESQMx7fck6IkAEiAARIAJEgAgQASJABIgAESACRIAIEAEiQASIABEgAg2SAAkgDXLZyWgiQASIABEgAkSACBABIkAEiAARIAJEgAgQASJABIgAESAC5k2ABBDzXl+yjggQASJABIgAESACRIAIEAEiQASIABEgAkSACBABIkAEiECDJEACSINcdjKaCBABIkAEiAARIAJEgAgQASJABIgAESACRIAIEAEiQASIgHkTIAHEvNeXrCMCRIAIEAEiQASIABEgAkSACBABIkAEiAARIAJEgAgQASLQIAn8H44nNnlKFVYBAAAAAElFTkSuQmCC" style="margin-left: 0px; margin-top: 0px;" width="682" /></span></span></p><h2 dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 37pt;"><span face="Roboto, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Flexible integration, adoption and expansion.</span></h2><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Vanir is developed not only as a standalone application but also as a Python library. Users who want to integrate automated patch verification processes with their continuous build or test chain may easily achieve it by wiring their build integration tool with Vanir scanner libraries. For instance, Vanir is integrated with a continuous testing pipeline in Google, ensuring all security patches are adopted in ever-evolving Android codebase and their first-party downstream branches.</span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Vanir is also fully open-sourced, and under BSD-3 license. As Vanir is not fundamentally limited to the Android ecosystem, you may easily adopt Vanir for the ecosystem that you want to protect by making relatively small modifications in Vanir. In addition, since Vanir’s underlying algorithm is not limited to security patch validation, you may modify the source and use it for different purposes such as licensed code detection or code clone detection. The Android Security team welcomes your contributions to Vanir for any direction that may expand its capability and scope. You can also contribute to Vanir by providing vulnerability data with Vanir signatures to OSV.</span></p><h1 dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 39pt;"><span face="Roboto, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Vanir Results</span></h1><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Since early last year, we have partnered with several Android OEMs to test the tool’s effectiveness. Internally we have been able to integrate the tool into our build system continuously testing against over 1,300 vulnerabilities. Currently Vanir covers 95% of all Android, Wear, and Pixel vulnerabilities with public fixes across Android Kernel and Userspace. It has a 97% accuracy rate, which has saved our internal teams over 500 hours to date in patch fix time.</span></p><h1 dir="ltr" style="line-height: 1.656; margin-bottom: 33pt; margin-top: 39pt;"><span face="Roboto, sans-serif" style="font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Next steps</span></h1><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We are happy to announce that Vanir is now available for public use. Vanir is not technically limited to Android, and we are also actively exploring problems that Vanir may help address, such as general C/C++ dependency management via </span><a href="https://github.com/google/osv-scanner/issues/1227" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">integration with OSV-scanner</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. If you are interested in using or contributing to Vanir, please visit </span><a href="http://github.com/google/vanir" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">github.com/google/vanir</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Please join our </span><a href="https://groups.google.com/g/vanir-help" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">public community</span></a><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to submit your feedback and questions on the tool. </span></p><p dir="ltr" style="line-height: 1.656; margin-bottom: 27pt; margin-top: 19pt;"><span face="Roboto, sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We look forward to working with you on Vanir!</span></p></span></div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-16534465585353041002024-11-20T11:55:00.000-05:002024-11-20T11:55:46.416-05:00Leveling Up Fuzzing: Finding more vulnerabilities with AI<span class="byline-author">Posted by Oliver Chang, Dongge Liu and Jonathan Metzman, Google Open Source Security Team</span><div><br /></div><div style="text-align: left;"><span id="docs-internal-guid-7cc925ed-7fff-6fe3-a606-da130a2f9469"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Recently, OSS-Fuzz reported </span><a href="https://github.com/google/oss-fuzz-gen?tab=readme-ov-file#bugs-discovered" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">26 new vulnerabilities</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to open source project maintainers, including one vulnerability in the critical OpenSSL library (</span><a href="https://openssl-library.org/news/secadv/20241016.txt" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CVE-2024-9143</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">) that underpins much of internet infrastructure. The reports themselves aren’t unusual—we’ve reported and helped maintainers fix over 11,000 vulnerabilities in the 8 years of the project. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">But these particular vulnerabilities represent a milestone for automated vulnerability finding: each was found with AI, using AI-generated and enhanced fuzz targets. The OpenSSL CVE is one of the first vulnerabilities in a critical piece of software that was discovered by LLMs, adding another real-world example to a recent Google discovery of </span><a href="https://googleprojectzero.blogspot.com/2024/10/from-naptime-to-big-sleep.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">an exploitable stack buffer underflow in the widely used database engine SQLite</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This blog post discusses the results and lessons over a year and a half of work to bring AI-powered fuzzing to this point, both in introducing AI into fuzz target generation and expanding this to simulate a developer’s workflow.</span><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> These efforts continue our explorations of how AI can transform vulnerability discovery and strengthen the arsenal of defenders everywhere.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">The story so far</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In August 2023, the OSS-Fuzz team announced </span><a href="https://security.googleblog.com/2023/08/ai-powered-fuzzing-breaking-bug-hunting.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">AI-Powered Fuzzing</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, describing our effort to leverage large language models (LLM) to improve fuzzing coverage to find more vulnerabilities automatically—before malicious attackers could exploit them. Our approach was to use the coding abilities of an LLM to generate more fuzz targets, which are similar to unit tests that exercise relevant functionality to search for vulnerabilities. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The ideal </span><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">solution would be to completely automate the manual process of developing a fuzz target end to end:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><ol style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Drafting an initial fuzz target.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Fixing any compilation issues that arise. </span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Running the fuzz target to see how it performs, and fixing any obvious mistakes causing runtime issues.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Running the corrected fu</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">zz target for a longer period of time, and triaging any crashes to determine the root cause.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Fixing vulnerabilities. </span></p></li></ol><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In August 2023, w</span><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">e </span><a href="https://security.googleblog.com/2023/08/ai-powered-fuzzing-breaking-bug-hunting.html" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">covered our efforts</span></a><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to use an LLM to handle the first two steps. We were able to use an </span><a href="https://google.github.io/oss-fuzz/research/llms/target_generation/" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">iterative process to generate a fuzz target</span></a><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> with a simple prompt including hardcoded examples and compilation errors. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In January 2024, we </span><a href="https://security.googleblog.com/2024/01/scaling-security-with-ai-from-detection.html" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">open sourced</span></a><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> the </span><a href="http://github.com/google/oss-fuzz-gen" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">framework</span></a><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> that we were building to enable an LLM to generate fuzz targets. By that point, LLMs were reliably generating targets that exercised more interesting code coverage across 160 projects. But there was still a long tail of projects where we couldn’t get a single working AI-generated fuzz target.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To address this, we’ve been improving the first two steps, as well as implementing steps 3 and 4.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">New results: More code coverage and discovered vulnerabilities</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We’re now able to automatically gain more coverage in </span><a href="https://github.com/google/oss-fuzz-gen?tab=readme-ov-file#current-top-coverage-improvements-by-project" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">272 C/C++ projects on OSS-Fuzz</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (up from 160), adding 370k+ lines of new code coverage. The top coverage improvement in a single project was an increase from 77 lines to 5434 lines (a 7000% increase).</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This led to the discovery of </span><a href="https://github.com/google/oss-fuzz-gen?tab=readme-ov-file#bugs-discovered" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">26 new vulnerabilities</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> in projects on OSS-Fuzz that already had hundreds of thousands of hours of fuzzing. The highlight is </span><a href="https://openssl-library.org/news/secadv/20241016.txt" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CVE-2024-9143</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> in the critical and well-tested OpenSSL library. We reported this vulnerability on September 16 and a fix was published on October 16. As far as we can tell, this vulnerability has likely been present for two decades and wouldn’t have been discoverable with existing fuzz targets written by humans.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Another example was a bug in the project </span><a href="https://github.com/DaveGamble/cJSON/issues/800" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">cJSON</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, where even though an existing human-written harness existed to fuzz a specific function, we still discovered a new vulnerability in that same function with an AI-generated target. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">One reason that such bugs could remain undiscovered for so long is that line coverage is not a guarantee that a function is free of bugs. Code coverage as a metric isn’t able to measure all possible code paths and states—different flags and configurations may trigger different behaviors, unearthing different bugs. These examples underscore the need to continue to generate new varieties of fuzz targets even for code that is already fuzzed, as has also been shown by Project Zero in the past (</span><a href="https://googleprojectzero.blogspot.com/2024/10/effective-fuzzing-dav1d-case-study.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">1</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://googleprojectzero.blogspot.com/2021/12/this-shouldnt-have-happened.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">2</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">).</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">New improvements</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To achieve these results, we’ve been focusing on two major improvements:</span></p><br /><ol style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Automatically generate more relevant context in our prompts.</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> The more complete and relevant information we can provide the LLM about a project, the less likely it would be to hallucinate the missing details in its response. This meant providing more accurate, project-specific context in prompts, such as function, type definitions, cross references, and existing unit tests for each project. To generate this information automatically, we </span><a href="https://introspector.oss-fuzz.com/api-doc" style="text-decoration-line: none;"><span style="color: #1155cc; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">built new infrastructure</span></a><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to index projects across OSS-Fuzz. </span></p></li></ol><div><span style="font-family: Arial, sans-serif;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span></div><br /><ol start="2" style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">LLMs turned out to be highly effective at</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;"> emulating a typical developer’s entire workflow of writing, testing, and iterating on the fuzz target, as well as triaging the crashes found</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">. Thanks to this, it was possible to further automate more parts of the fuzzing workflow. This additional iterative feedback in turn also resulted in higher quality and greater number of correct fuzz targets. </span></p></li></ol><div><span style="font-family: Arial, sans-serif;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span></div><div><span style="font-family: Arial, sans-serif;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span></div><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">The workflow in action</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our LLM can now execute the first four steps of the developer’s process (with the fifth soon to come). </span></p><br /><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;"><br /></span></span></div><div style="text-align: left;"><span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;">1. Drafting an initial fuzz target</span><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">A developer might check the source code, existing documentation and unit tests, as well as usages of the target function when to draft an initial fuzz target. An LLM can fulfill this role here, if we provide a prompt with this information and ask it to come up with a fuzz target. </span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Prompt: </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Your goal is to write a fuzzing harness for the provided function-under-test signature using <code>LLVMFuzzerTestOneInput</code>. It is important that the provided solution compiles and actually calls the function-under-test specified by the function signature:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><function signature></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">unsigned char * buffer_append_base64_decode(buffer *, const char *, size_t, base64_charset)</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></function signature></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Here is the source code of the function being tested:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><code></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">unsigned char* buffer_append_base64_decode(buffer *out, const char* in, size_t in_length, base64_charset charset) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> const size_t reserve = 3*(in_length/4) + 3;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> unsigned char * const result = (unsigned char *)</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> buffer_string_prepare_append(out, reserve);</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> const size_t out_pos =</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> li_base64_dec(result, reserve, in, in_length, charset);</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> buffer_commit(out, out_pos);</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> return (out_pos || !in_length) ? result : NULL;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></code></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Here is the source code for functions which reference the function being tested:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><code></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">… </span></p></td></tr></tbody></table></div><br /><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;"><br /></span></span></div><div style="text-align: left;"><span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;">2. Fixing any compilation issues that arise. </span><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Once a developer has a candidate target, they would try to compile it and look at any compilation issues that arise. Again, we can prompt an LLM with details of the compilation errors so it can provide fixes. </span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Prompt: </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Below is the error to fix:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The code has the following build issues:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><error></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">server_fuzzer.cc:12:46: error: only virtual member functions can be marked 'override'</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> 12 | bool OnData(const char* data, size_t size) override {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> | ^~~~~~~~</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">server_fuzzer.cc:22:39: error: no type named 'MultiPartFile' in namespace 'httplib'</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> 22 | const httplib::MultiPartFile& file) override {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> | ~~~~~~~~~^</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">server_fuzzer.cc:12:27: warning: unused parameter 'data' [-Wunused-parameter]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> 12 | bool OnData(const char* data, size_t size) override {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> | ^</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">server_fuzzer.cc:37:5: error: use of undeclared 'operator()'</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> 37 | operator()(request_data.data(), receiver);</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> | ^</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">server_fuzzer.cc:27:23: warning: private field 'provider_' is not used [-Wunused-private-field]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> 27 | FuzzedDataProvider& provider_;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> | ^</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></error></span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Example of compilation errors that an LLM was able to fix</span></p><br /><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;"><br /></span></span></div><div style="text-align: left;"><span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;">3. Running the fuzz target to see how it performs, and fixing any obvious mistakes causing runtime issues.</span><br /><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Once all compilation errors are fixed, a developer would try running the fuzz target for a short period of time to see if there were any mistakes that led it to instantly crash, suggesting an error with the target rather than a bug discovered in the project.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The following is an example of an LLM fixing a semantic issue with the fuzzing setup: </span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">LLM Response:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><explanation></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The issue is that `sqlite3_blob_open` requires the table to exist before you can open a blob on it. The fix ensures that the table exists by executing a `CREATE TABLE IF NOT EXISTS` statement before calling `sqlite3_blob_open`. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Here's a breakdown of the changes:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1. **Create Table Query:** A string `createTableQuery` is constructed to hold the SQL statement for creating the table. It uses the fuzzed values for the table and column names.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">2. **Prepare Statement:** `sqlite3_prepare_v2` is used to prepare the SQL statement from `createTableQuery`. This compiles the SQL into a byte-code program that SQLite can execute.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">3. **Execute Statement:** `sqlite3_step` executes the prepared statement. Since it's a `CREATE TABLE` statement, it doesn't return any data, but it creates the table if it doesn't exist.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">4. **Finalize Statement:** `sqlite3_finalize` destroys the prepared statement object when it's no longer needed.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">By adding these steps before calling `sqlite3_blob_open`, we ensure that the table exists, preventing the null pointer access issue. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></explanation></span></p><br /></td></tr></tbody></table></div><br /><br /><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;">4. Running the corrected fuzz target for a longer period of time, and triaging any crashes.</span><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">At this point, the fuzz target is ready to run for an extended period of time on a suitable fuzzing infrastructure, such as </span><a href="https://google.github.io/clusterfuzz/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">ClusterFuzz</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Any discovered crashes would then need to be triaged, to determine the root causes and whether they represented legitimate vulnerabilities (or bugs in the fuzz target). An LLM can be prompted with the relevant context (stacktraces, fuzz target source code, relevant project source code) to perform this triage. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Prompt: Given the following crash report, fuzz driver code and relevant project function code, analyze the cause of the crash.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">First, only answer “Crash is caused by bug in fuzz driver” or “Crash is caused by bug in project”. Second, offer a succinct and to-the-point analysis.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Below is crash report:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><log></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">AddressSanitizer: heap-use-after-free on address 0x502000000630 at pc 0x560036939242 bp 0x7ffd65dca850 sp 0x7ffd65dca010</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">READ of size 1 at 0x502000000630 thread T0</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">SCARINESS: 40 (1-byte-read-heap-use-after-free)</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> #0 0x560036939241 in __asan_memcpy /src/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:63:3</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> #1 0x56003697d30b in EmitLiteral<false> /src/snappy/snappy.cc:661:5</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> #2 0x56003697d30b in snappy::internal::CompressFragment(char const*, unsigned long, char*, unsigned short*, int) /src/snappy/snappy.cc:954:10</span></p><br /></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In this example, the LLM correctly determines this is a bug in the fuzz target, rather than a bug in the project being fuzzed. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">LLM Response: Crash is caused by bug in fuzz driver.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #666666; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The fuzz driver creates a vector of `iovec` structures, each pointing to a chunk of memory owned by the `FuzzedDataProvider`. However, the `data_chunk` vector, which holds the actual data pointed to by `iov_base`, is deallocated at the end of each fuzzer iteration when it goes out of scope. This leaves the `iov_base` pointers dangling. When `snappy::CompressFromIOVec` tries to access the memory pointed to by these dangling pointers, a heap-use-after-free occurs. </span></p></td></tr></tbody></table></div><br /><br /><span style="font-family: Arial, sans-serif; font-size: 11pt; font-weight: 700; white-space-collapse: preserve;">5. Fixing vulnerabilities. </span><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The goal is to fully automate this entire workflow by having the LLM generate a suggested patch for the vulnerability. We don’t have anything we can share here today, but we’re collaborating with various researchers to make this a reality and look forward to sharing results soon. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><h1 dir="ltr" style="line-height: 1.3800000000000001; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Up next</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Improving automated triaging: </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">to get to a point where we’re confident about not requiring human review. This will help automatically report new vulnerabilities to project maintainers. There are likely more than the 26 vulnerabilities we’ve already reported upstream hiding in our results.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Agent-based architecture: </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">which means letting the LLM autonomously plan out the steps to solve a particular problem by providing it with access to tools that enable it to get more information, as well as to check and validate results. By providing LLM with interactive access to real tools such as debuggers, we’ve found that the LLM is more likely to arrive at a correct result.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Integrating our research into OSS-Fuzz as a feature:</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to achieve a more fully automated end-to-end solution for vulnerability discovery and patching. We hope OSS-Fuzz will be useful for other researchers to evaluate AI-powered vulnerability discovery ideas and ultimately become a tool that will enable defenders to find more vulnerabilities before they get exploited. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><br /><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For more information, check out our open source framework at </span><a href="https://github.com/google/oss-fuzz-gen" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">oss-fuzz-gen</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. We’re hoping to continue to collaborate on this area with other researchers. Also, be sure to check out the </span><a href="https://blog.oss-fuzz.com/posts/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">OSS-Fuzz blog</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for more technical updates. </span></span></div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-49672587153868728232024-11-15T12:42:00.015-05:002024-11-15T18:54:05.053-05:00Retrofitting spatial safety to hundreds of millions of lines of C++<span class="byline-author">Posted by Alex Rebert and Max Shavrick, Security Foundations, and Kinuko Yasuda, Core Developer<br /><br /></span>
<p>
Attackers regularly exploit <a href="https://research.google/pubs/secure-by-design-googles-perspective-on-memory-safety/">spatial memory safety vulnerabilities</a>, which occur when code accesses a memory allocation outside of its intended bounds, to compromise systems and sensitive data. These vulnerabilities represent a major security risk to users.
</p>
<p>
Based on an analysis of <a href="https://googleprojectzero.blogspot.com/p/0day.html">in-the-wild exploits tracked by Google's Project Zero</a>, spatial safety vulnerabilities represent 40% of in-the-wild memory safety exploits over the past decade:
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQt1XoSwUrAiUmN6tbntYLZ-IsBBV-e2aAKIKJJcavncM9t6IwD4LVlse0OSiA5ecs52_wkiaUml_9MoncUNOU8wxajv3dPonrtVlV31TJW6bKBs6mPNec7jb12rX18VRI0VwhETljd2QEp0kQ4oFQZBNq0pwoH-EedxhThqfwD73s0dqZALf_nGPkPMdK/s1600/graph.png" style="display: block; padding: .1em 0; text-align: center; "><img alt="" style="max-width:400px;" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQt1XoSwUrAiUmN6tbntYLZ-IsBBV-e2aAKIKJJcavncM9t6IwD4LVlse0OSiA5ecs52_wkiaUml_9MoncUNOU8wxajv3dPonrtVlV31TJW6bKBs6mPNec7jb12rX18VRI0VwhETljd2QEp0kQ4oFQZBNq0pwoH-EedxhThqfwD73s0dqZALf_nGPkPMdK/s1600/graph.png"/></a></div>
<p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center; font-style: italic; font-size: 10pt;">Breakdown of memory safety CVEs <a href="https://googleprojectzero.blogspot.com/p/0day.html">exploited in the wild</a> by vulnerability class.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<p>Google is taking a <a href="https://security.googleblog.com/2024/10/safer-with-google-advancing-memory.html">comprehensive approach to memory safety</a>. A key element of our strategy focuses on <a href="https://blog.google/technology/safety-security/tackling-cybersecurity-vulnerabilities-through-secure-by-design/">Safe Coding</a> and using memory-safe languages in new code. This leads to an exponential decline in memory safety vulnerabilities and quickly improves the overall security posture of a codebase, as demonstrated by our <a href="https://security.googleblog.com/2024/09/eliminating-memory-safety-vulnerabilities-Android.html" >post about Android's journey to memory safety</a>.
</p>
<p>However, this transition will take multiple years as we adapt our development practices and infrastructure. Ensuring the safety of our billions of users therefore requires us to go further: we're also retrofitting secure-by-design principles to our existing C++ codebase wherever possible.</p>
<p >To that end, we're working towards bringing spatial memory safety into as many of our C++ codebases as possible, including Chrome and the monolithic codebase powering our services.</p>
<p>We’ve begun by enabling hardened libc++, which adds bounds checking to standard C++ data structures, eliminating a significant class of spatial safety bugs. While C++ will not become fully memory-safe, these improvements reduce risk as discussed in more detail in our <a href="https://security.googleblog.com/2024/03/secure-by-design-googles-perspective-on.html">perspective on memory safety</a>, leading to more reliable and secure software.</p>
<p>This post explains how we're retrofitting hardened libc++ across our codebases and showcases the positive impact it's already having, including preventing exploits, reducing crashes, and improving code correctness.</p>
<h1 style="font-size: 1.2em">Bounds-checked data structures: The foundation for spatial safety</h1>
<p>One of our primary strategies for improving spatial safety in C++ is to implement bounds checking for common data structures, starting with hardening the C++ standard library (in our case, LLVM’s libc++). <a href="https://libcxx.llvm.org/Hardening.html">Hardened libc++</a>, recently added by open source contributors, introduces a set of security checks designed to catch vulnerabilities such as out-of-bounds accesses in production.</p>
<p>For example, hardened libc++ ensures that every access to an element of a <span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std::vector</span> stays within its allocated bounds, preventing attempts to read or write beyond the valid memory region. Similarly, hardened libc++ checks that a <span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std::optional</span> isn't empty before allowing access, preventing access to uninitialized memory.</p>
<p>This approach mirrors what's already standard practice in many modern programming languages like Java, Python, Go, and Rust. They all incorporate bounds checking <span style="font-style: italic;">by default</span>, recognizing its crucial role in preventing memory errors. C++ has been a notable exception, but efforts like hardened libc++ aim to close this gap in our infrastructure. It’s also worth noting that similar hardening is available in other C++ standard libraries, such as <a href="https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html#precondition-checks-for-c-standard-library-calls" style="text-decoration-line: none;">libstdc++</a>.</p>
<h1 style="font-size: 1.2em">Raising the security baseline across the board</h1>
<p>Building on the successful deployment of hardened libc++ <a href="https://crbug.com/40228527">in Chrome</a> in 2022, we've now made it default across our server-side production systems. This improves spatial memory safety across our services, including key performance-critical components of products like Search, Gmail, Drive, YouTube, and Maps. While a very small number of components remain opted out, we're actively working to reduce this and <a href="https://www.philvenables.com/post/raise-the-baseline-by-reducing-the-cost-of-control">raise the bar for security across the board</a>, even in applications with lower exploitation risk.</p>
<p>The performance impact of these changes was surprisingly low, despite Google's modern C++ codebase making heavy use of libc++. <span style="font-weight: 700;">Hardening libc++ resulted in an average 0.30% performance impact across our services (yes, only a third of a percent).
<p>This is due to both the compiler's ability to eliminate redundant checks during optimization, and the efficient design of hardened libc++. While a handful of performance-critical code paths still require targeted use of explicitly unsafe accesses, these instances are carefully reviewed for safety. Techniques like <a href="https://en.wikipedia.org/wiki/Profile-guided_optimization">profile-guided optimizations</a> further improved performance, but even without those advanced techniques, the overhead of bounds checking remains minimal.</p>
<p>We actively monitor the performance impact of these checks and work to minimize any unnecessary overhead. For instance, we identified and fixed an unnecessary check, which led to a 15% reduction in overhead (reduced from 0.35% to 0.3%), and contributed the <a href="https://github.com/llvm/llvm-project/pull/105863">fix back to the LLVM project</a> to share the benefits with the broader C++ community.</p>
<p>While hardened libc++'s overhead is minimal for individual applications in most cases, deploying it at Google's scale required a substantial commitment of computing resources. This investment underscores our dedication to enhancing the safety and security of our products.</p>
<h1 style="font-size: 1.2em">From tests to production</h1>
<p>Enabling libc++ hardening wasn't a simple flip of a switch. Rather, it required a multi-stage rollout to avoid accidentally disrupting users or creating an outage:<p>
<ol>
<li><b>Testing:</b> We first enabled hardened libc++ in our tests over a year ago. This allowed us to identify and fix hundreds of previously undetected bugs in our code and tests.</li>
<li><b>Baking:</b> We let the hardened runtime "bake" in our testing and pre-production environments, giving developers time to adapt and address any new issues that surfaced. We also conducted extensive performance evaluations, ensuring minimal impact to our users' experience.</li>
<li><b>Gradual Production Rollout:</b> We then rolled out hardened libc++ to production over several months, starting with a small set of services and gradually expanding to our entire infrastructure. We closely monitored the rollout, promptly addressing any crashes or performance regressions.</li>
</ol>
<h1 style="font-size: 1.2em">Quantifiable impact</h1>
<p>In just a few months since enabling hardened libc++ by default, we've already seen benefits.</p>
<p><b>Preventing exploits:</b> Hardened libc++ has already disrupted an internal red team exercise and would have prevented another one that happened before we enabled hardening, demonstrating its effectiveness in thwarting exploits. The safety checks have uncovered over 1,000 bugs, and would prevent 1,000 to 2,000 new bugs yearly at our current rate of C++ development.</p>
<p><b>Improved reliability and correctness:</b> The process of identifying and fixing bugs uncovered by hardened libc++ led to a 30% reduction in our baseline segmentation fault rate across production, indicating improved code reliability and quality. Beyond crashes, the checks also caught errors that would have otherwise manifested as unpredictable behavior or data corruption.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAbFpPb_3_3AG2wAhkOUDqhBPZlprOdUvmOXQ41S7iYOXBIFfSQxHI5CSJ1-An1tINdVCVVNIkGJqXdPvVMadjy8ALd1lJ5INI8lV4udaUIxY3CV9ypjYZpHuWKE6dpAqCAKu0W8XUorr65Lr6ztyg0Pa087ikX8fwyYaPpoJScQEUqjKrO3ePG5q4fcWg/s1600/graph2.png" style="display: block; padding: .1em 0; text-align: center; "><img alt="" border="0" data-original-height="1070" data-original-width="3318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAbFpPb_3_3AG2wAhkOUDqhBPZlprOdUvmOXQ41S7iYOXBIFfSQxHI5CSJ1-An1tINdVCVVNIkGJqXdPvVMadjy8ALd1lJ5INI8lV4udaUIxY3CV9ypjYZpHuWKE6dpAqCAKu0W8XUorr65Lr6ztyg0Pa087ikX8fwyYaPpoJScQEUqjKrO3ePG5q4fcWg/s1600/graph2.png"/></a></div>
<p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center; font-style: italic; font-size: 10pt;">Moving average of segfaults across our fleet over time, before and after enablement.</p>
<p><b>Easier debugging:</b> Hardened libc++ enabled us to identify and fix multiple bugs that had been lurking in our code for more than a decade. The checks transform many difficult-to-diagnose memory corruptions into immediate and easily debuggable errors, saving developers valuable time and effort. </p>
<h1 style="font-size: 1.2em">Bridging the gap with memory-safe languages</h1>
<p>While libc++ hardening provides immediate benefits by adding bounds checking to standard data structures, it's only one piece of the puzzle when it comes to spatial safety.</p>
<p>We're expanding bounds checking to other libraries and working to migrate our code to <a href="https://clang.llvm.org/docs/SafeBuffers.html">Safe Buffers</a>, requiring all accesses to be bounds checked. For spatial safety, both hardened data structures, including their iterators, and Safe Buffers are necessary.</p>
<p>Beyond improving the safety of our C++, we're also focused on making it easier to interoperate with memory-safe languages. Migrating our C++ to Safe Buffers shrinks the gap between the languages, which simplifies interoperability and potentially even an eventual <a href="https://www.darpa.mil/news-events/2024-07-31a">automated translation</a>.</p>
<h1 style="font-size: 1.2em">Building a safer C++ ecosystem</h1>
<p>Hardened libc++ is a practical and effective way to enhance the safety, reliability, and debuggability of C++ code with minimal overhead. Given this, we strongly encourage organizations using C++ to enable their standard library's hardened mode universally by default.</p>
<p>At Google, enabling hardened libc++ is only the first step in our journey towards a spatially safe C++ codebase. By expanding bounds checking, <a href="https://bughunters.google.com/blog/6368559657254912/llvm-s-rfc-c-buffer-hardening-at-google">migrating to Safe Buffers</a>, and actively collaborating with the broader C++ community, we aim to create a future where spatial safety is the norm.</p>
<h2>Acknowledgements</h2>
<p>We’d like to thank Emilia Kasper, Chandler Carruth, Duygu Isler, Matthew Riley, and Jeff Vander Stoep for their helpful feedback. We also extend our thanks to the libc++ community for developing the hardening mode that made this work possible.</p>
<!-- Footnotes themselves at the bottom. -->
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
Based on manual analysis of CVEs from July 15, 2014 to Dec 14, 2023. Note that we could not classify 11% of CVEs.. <a href="#fnref1" rev="footnote">↩</a>
</p>
</li>
</ol>
</div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-13906618495468088132024-11-13T12:59:00.001-05:002024-11-13T12:59:56.670-05:00Safer with Google: New intelligent, real-time protections on Android to keep you safe<span class="byline-author">Posted by Lyubov Farafonova, Product Manager and Steve Kafka, Group Product Manager, Android</span>
<p>
User safety is at the heart of everything we do at Google. Our mission to make technology helpful for everyone means building features that protect you while keeping your privacy top of mind. From <a href="https://blog.google/products/gmail/gmail-security-authentication-spam-protection/">Gmail’s defenses</a> that stop more than 99.9% of spam, phishing and malware, to <a href="https://security.googleblog.com/2024/10/5-new-protections-on-google-messages.html">Google Messages’ advanced security</a> that protects users from 2 billion suspicious messages a month and beyond, we're constantly developing and expanding protection features that help keep you safe.
</p>
<p>
We're introducing two new real-time protection features that enhance your safety, all while safeguarding your privacy: Scam Detection in Phone by Google to protect you from scams and fraud, and Google Play Protect live threat detection with real-time alerts to protect you from malware and dangerous apps.
</p>
<p>
These new security features are available first on Pixel, and are coming soon to more Android devices.
</p>
<p>
<h3><strong>More intelligent AI-powered protection against scams</strong></h3>
</p>
<p>
Scammers steal over <a href="https://www.newswire.com/news/global-losses-to-scammers-exceed-1-trillion-as-1-in-4-lose-money-to-22145725">$1 trillion dollars</a> a year from people, and phone calls are their favorite way to do it. Even more alarming, scam calls are evolving, becoming <a href="https://www.thecut.com/article/amazon-scam-call-ftc-arrest-warrants.html">increasingly more sophisticated</a>, damaging and harder to identify. That’s why we’re using the best of Google AI to identify and stop scams before they can do harm with Scam Detection.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO1uV5Xu6fc-JDzLuqalOaPLR9zCpmdkR8fpXVl120zEFi5kXkXVo6XIx5mxvKb3kFQQvKE3k5xvVcVB-Bu7HwNQ8glkjc9mNHEma5QYKtZc8-Bbh-RR7lK_oR-IjhnBBZZo1pg_qK35miAiMRJc0gXNZbnXDT79NdzQ5go3RvClMmv_Nt5cLyU2-v5t4u/s1600/image1%20%285%29.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="504" data-original-width="840" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO1uV5Xu6fc-JDzLuqalOaPLR9zCpmdkR8fpXVl120zEFi5kXkXVo6XIx5mxvKb3kFQQvKE3k5xvVcVB-Bu7HwNQ8glkjc9mNHEma5QYKtZc8-Bbh-RR7lK_oR-IjhnBBZZo1pg_qK35miAiMRJc0gXNZbnXDT79NdzQ5go3RvClMmv_Nt5cLyU2-v5t4u/s1600/image1%20%285%29.png"/></a></div>
</p>
<p>
<strong>Real-time protection, built with your privacy in mind.</strong><br>
</p>
<ul>
<li><strong>Real-time defense, right on your device:</strong> Scam Detection uses powerful on-device AI to notify you of a potential scam call happening in real-time by detecting conversation patterns commonly associated with scams. For example, if a caller claims to be from your bank and asks you to urgently transfer funds due to an alleged account breach, Scam Detection will process the call to determine whether the call is likely spam and, if so, can provide an audio and haptic alert and visual warning that the call may be a scam. </li>
<li><strong>Private by design, you’re always in control:</strong> We’ve built Scam Detection to protect your privacy and ensure you’re always in control of your data. Scam Detection is off by default, and you can decide whether you want to activate it for future calls. At any time, you can turn it off for all calls in the Phone app Settings, or during a particular call. The AI detection model and processing are fully on-device, which means that no conversation audio or transcription is stored on the device, sent to Google servers or anywhere else, or retrievable after the call.</li>
<li><strong>Cutting-edge AI protection, now on more Pixel phones:</strong> <a href="https://deepmind.google/technologies/gemini/nano/">Gemini Nano</a>, our advanced on-device AI model, powers Scam Detection on Pixel 9 series devices. As part of our commitment to bring powerful AI features to even more devices, this AI-powered protection is available to Pixel 6+ users thanks to other robust Google on-device machine learning models. <br></li>
</ul>
<p>
We’re now rolling out Scam Detection to English-speaking Phone by Google public beta users in the U.S. with a Pixel 6 or newer device. <br>
</p>
<p>
To provide feedback on your experience, please click on Phone by Google App -> Menu -> Help & Feedback -> Send Feedback. We look forward to learning from this beta and your feedback, and we’ll share more about Scam Detection in the months ahead.
</p>
<p>
<h3><strong>More real-time alerts to protect you from bad apps </strong></h3>
<p> Google Play Protect works non-stop to protect you in <a href="https://security.googleblog.com/2023/10/enhanced-google-play-protect-real-time.html">real-time</a> from malware and unsafe apps. Play Protect analyzes behavioral signals related to the use of sensitive permissions and interactions with other apps and services.<br><br>With live threat detection, if a harmful app is found, you'll now receive a real-time alert, allowing you to take immediate action to protect your device. By looking at actual activity patterns of apps, live threat detection can now find malicious apps that try extra hard to hide their behavior or lie dormant for a time before engaging in suspicious activity.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE8-vUuJySoAsx2T3pxiekXCeV3gwGP4sT4tIlVSgzOIaqQzeZRmQ5-c557Pz43l4bAbJ49CVL1lQm7ilp_xNObhMf0x5v1Qn9ivnx7DfU_wnTVX639q0-_Wv0nrX_FFJYY1KKvyKGZAJyZo3U3HfudNKBn-sYTeWpnFWuw1I89FhRPkDnLMA0aY557OX7/s1999/image2%20%281%29.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="600" data-original-height="1999" data-original-width="952" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE8-vUuJySoAsx2T3pxiekXCeV3gwGP4sT4tIlVSgzOIaqQzeZRmQ5-c557Pz43l4bAbJ49CVL1lQm7ilp_xNObhMf0x5v1Qn9ivnx7DfU_wnTVX639q0-_Wv0nrX_FFJYY1KKvyKGZAJyZo3U3HfudNKBn-sYTeWpnFWuw1I89FhRPkDnLMA0aY557OX7/s600/image2%20%281%29.png"/></a></div>
<p>
At launch, live threat detection will focus on stalkerware, code that may collect personal or sensitive data for monitoring purposes without user consent, and we will explore expanding its detection to other types of harmful apps in the future. All of this protection happens on your device in a privacy preserving way through <a href="https://security.googleblog.com/2022/12/trust-in-transparency-private-compute.html">Private Compute Core</a>, which allows us to protect users without collecting data.
</p>
<p>
Live threat detection with real-time alerts in Google Play Protect are now available on Pixel 6+ devices and will be coming to additional phone makers in the coming months.
</p>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-73497717310891056722024-10-22T12:59:00.001-04:002024-10-22T12:59:32.233-04:005 new protections on Google Messages to help keep you safe<span class="byline-author">Posted by Jan Jedrzejowicz, Director of Product, Android and Business Communications; Alberto Pastor Nieto, Sr. Product Manager Google Messages and RCS Spam and Abuse; Stephan Somogyi, Product Lead, User Protection; Branden Archer, Software Engineer</span>
<p>
Every day, over a billion people use <a href="http://messages.google.com">Google Messages</a> to communicate. That’s why we’ve made security a top priority, building in powerful on-device, AI-powered filters and advanced security that protects users from 2 billion suspicious messages a month. With end-to-end encrypted<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> RCS conversations, you can communicate privately with other Google Messages RCS users. And we’re not stopping there. We're committed to constantly developing new controls and features to make your conversations on Google Messages even more secure and private.
</p>
<p>
<strong>As part of cybersecurity awareness month, we're sharing five new protections to help keep you safe while using Google Messages on Android:</strong>
</p>
<ol>
<li><strong>Enhanced detection protects you from package delivery and job scams. </strong> Google Messages is adding new protections against scam texts that may seem harmless at first but can eventually lead to fraud. For <a href="https://support.google.com/messages/answer/9131090?hl=en#:~:text=Sign%20up%20for%20beta%20testing,Follow%20the%20instructions.">Google Messages beta users</a><sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup>, we’re rolling out enhanced scam detection, with improved analysis of scammy texts, starting with a focus on package delivery and job seeking messages. When Google Messages suspects a potential scam text, it will automatically move the message into your spam folder or warn you. Google Messages uses on-device machine learning models to classify these scams, so your conversations stay private and the content is never sent to Google unless you report spam. We’re rolling this enhancement out now to Google Messages beta users who have spam protection enabled.</li>
<li><strong>Intelligent warnings alert you about potentially dangerous links</strong>. In the past year, we’ve been piloting more protections for Google Messages users when they receive text messages with potentially dangerous links. In India, Thailand, Malaysia and Singapore, Google Messages warns users when they get a link from unknown senders and blocks messages with links from suspicious senders. We’re in the process of expanding this feature globally later this year.</li>
<li><strong>Controls to turn off messages from unknown international senders</strong>. In some cases, scam text messages come from international numbers. Soon, you will be able to automatically hide messages from international senders who are not existing contacts so you don’t have to interact with them. If enabled, messages from international non-contacts will automatically be moved to the “Spam & blocked” folder. This feature will <a href="https://www.channelnewsasia.com/singapore/google-pilot-new-android-anti-scam-features-block-sms-play-protect-4682046?cid=telegram_cna_social_28112017_cna">roll out first as a pilot in Singapore</a> later this year before we look at expanding to more countries.</li>
<li><strong>Sensitive Content Warnings give you control over seeing and sending images that may contain nudity. </strong>At Google, we aim to provide users with <a href="https://safety.google/content-safety/?_gl=1*1qxnom0*_up*MQ..&gclid=Cj0KCQjwjNS3BhChARIsAOxBM6qmnJ7G3JputxEJU-vd2Z8iW6YaLITy6xrXeDhK6TpCv7wEDf64JdAaAmaOEALw_wcB&gclsrc=aw.ds">a variety of ways to protect themselves against unwanted content</a>, while keeping them in control of their data. This is why we’re introducing Sensitive Content Warnings for Google Messages.<br><br>Sensitive Content Warnings is an optional feature that blurs images that may contain nudity before viewing, and then prompts with a “speed bump” that contains help-finding resources and options, including to view the content. When the feature is enabled, and an image that may contain nudity is about to be sent or forwarded, it also provides a speed bump to remind users of the risks of sending nude imagery and preventing accidental shares.<br><br>All of this happens on-device to protect your privacy and keep end-to-end encrypted message content private to only sender and recipient. Sensitive Content Warnings doesn’t allow Google access to the contents of your images, nor does Google know that nudity may have been detected. This feature is opt-in for adults, managed via Android Settings, and is opt-out for users under 18 years of age. Sensitive Content Warnings will be rolling out to Android 9+ devices including Android Go devices<sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup> with Google Messages in the coming months.</li>
<li><strong>More confirmation about who you’re messaging. </strong>To help you avoid sophisticated messaging threats where an attacker tries to impersonate one of your contacts, we’re working to add a contact verifying feature to Android. This new feature will allow you to verify your contacts' public keys so you can confirm you’re communicating with the person you intend to message. We’re creating a unified system for public key verification across different apps, which you can verify through QR code scanning or number comparison. This feature will be launching next year for Android 9+ devices, with support for messaging apps including Google Messages.
<p>
These are just some of the new and upcoming features that you can use to better protect yourself when sending and receiving messages. <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.messaging">Download Google Messages</a> from the Google Play Store to enjoy these protections and controls and learn more about Google Messages <a href="https://www.android.com/google-messages/">here</a>.
</p>
<p>
</p>
<!-- Footnotes themselves at the bottom. -->
<h2>Notes</h2>
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
End-to-end encryption is currently available between Google Messages users. Availability of RCS varies by region and carrier. <a href="#fnref1" rev="footnote">↩</a><li id="fn2">
<p>
Availability of features may vary by market and device. Sign up for beta testing and a data plan may be required. <a href="#fnref2" rev="footnote">↩</a><li id="fn3">
<p>
Requires 2 GB of RAM. <a href="#fnref3" rev="footnote">↩</a>
</ol></div>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-47878190700444115352024-10-15T13:44:00.001-04:002024-10-15T13:44:17.528-04:00Safer with Google: Advancing Memory Safety<span class="byline-author">Posted by Alex Rebert, Security Foundations, and Chandler Carruth, Jen Engel, Andy Qin, Core Developers</span>
<p>
Error-prone interactions between software and memory<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> are <a href="http://phrack.org/archives/issues/49/14.txt">widely understood</a> to create safety issues in software. It is estimated that about 70% of severe vulnerabilities<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup> in memory-unsafe codebases are due to memory safety bugs. Malicious actors exploit these vulnerabilities and continue to create real-world harm. In 2023, Google’s threat intelligence teams conducted an industry-wide study and observed a <a href="https://storage.googleapis.com/gweb-uniblog-publish-prod/documents/Year_in_Review_of_ZeroDays.pdf">close to all-time high number of vulnerabilities exploited in the wild</a>. Our internal analysis estimates that 75% of CVEs used in <a href="https://googleprojectzero.blogspot.com/p/0day.html">zero-day exploits</a> are memory safety vulnerabilities.
</p>
<p>
At Google, we have been mindful of these issues for over two decades, and are on a journey to continue advancing the state of memory safety in the software we consume and produce. Our <a href="https://blog.google/technology/safety-security/tackling-cybersecurity-vulnerabilities-through-secure-by-design/">Secure by Design</a> commitment emphasizes integrating security considerations, including robust memory safety practices, throughout the entire software development lifecycle. This proactive approach fosters a safer and more trustworthy digital environment for everyone.
</p>
<p>
This post builds upon our previously reported <a href="https://research.google/pubs/secure-by-design-googles-perspective-on-memory-safety/">Perspective on Memory Safety</a>, and introduces our strategic approach to memory safety.
</p>
<p>
<strong>Our journey so far</strong>
</p>
<p>
Google's journey with memory safety is deeply intertwined with the evolution of the software industry itself. In our early days, we recognized the importance of balancing performance with safety. This led to the early adoption of memory-safe languages like Java and Python, and the creation of Go. Today these languages comprise a large portion of our code, providing memory safety among other benefits. Meanwhile, the rest of our code is predominantly written in C++, previously the optimal choice for high-performance demands.
</p>
<p>
We recognized the inherent risks associated with memory-unsafe languages and developed tools like <a href="https://en.wikipedia.org/wiki/Code_sanitizer">sanitizers</a>, which detect memory safety bugs dynamically, and fuzzers like <a href="https://github.com/google/AFL">AFL</a> and <a href="https://releases.llvm.org/8.0.0/docs/LibFuzzer.html">libfuzzer</a>, which proactively test the robustness and security of a software application by repeatedly feeding unexpected inputs. By open-sourcing these tools, we've empowered developers worldwide to reduce the likelihood of memory safety vulnerabilities in C and C++ codebases. Taking this commitment a step further, we provide continuous fuzzing to open-source projects through <a href="https://security.googleblog.com/2016/12/announcing-oss-fuzz-continuous-fuzzing.html">OSS-Fuzz</a>, which helped get over <a href="https://security.googleblog.com/2023/02/taking-next-step-oss-fuzz-in-2023.html">8800 vulnerabilities identified and subsequently fixed across 850 projects</a>.
</p>
<p>
Today, with the emergence of high-performance memory-safe languages like Rust, coupled with a deeper understanding of the limitations of purely detection-based approaches, we are focused primarily on preventing the introduction of security vulnerabilities at scale.
</p>
<p>
<strong>Going forward: Google's two-pronged approach</strong>
</p>
<p>
Google's long-term strategy for tackling memory safety challenges is multifaceted, recognizing the need to address both existing codebases and future development, while maintaining the pace of business.
</p>
<p>
Our long-term objective is to progressively and consistently integrate memory-safe languages into Google's codebases while phasing out memory-unsafe code in new development. Given the amount of C++ code we use, we anticipate a residual amount of mature and stable memory-unsafe code will remain for the foreseeable future.
</p> <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSRbsz3UFa32nAEek2cEOIN-IM5XN6df3vibnuP7nmzJoYLMAfkHgjlAcbCbjGmV0THU_CMtP9vgs3EHHe7zwRqeuXbQoxA_EGrqDMLDRJShnakXuMxesVqDJaq2xPWcpyqCcRpvW3-ZWJiZu2LXtyEs23CvI4jOBkw89T1iSVWHl-j4OYMsC0EN0E4dFh/s3355/memory%20safety%20graphic.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="2340" data-original-width="3355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSRbsz3UFa32nAEek2cEOIN-IM5XN6df3vibnuP7nmzJoYLMAfkHgjlAcbCbjGmV0THU_CMtP9vgs3EHHe7zwRqeuXbQoxA_EGrqDMLDRJShnakXuMxesVqDJaq2xPWcpyqCcRpvW3-ZWJiZu2LXtyEs23CvI4jOBkw89T1iSVWHl-j4OYMsC0EN0E4dFh/s600/memory%20safety%20graphic.png"/></a></div>
<p style="text-align: center">
<em>Graphic of memory-safe language growth as memory-unsafe code is hardened and gradually decreased over time.</em>
</p>
<p>
<strong>Migration to Memory-Safe Languages (MSLs)</strong>
</p>
<p>
The first pillar of our strategy is centered on further increasing the adoption of memory-safe languages. These languages drastically drive down the risk of memory-related errors through features like garbage collection and borrow checking, embodying the same Safe Coding<sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup> principles that successfully eliminated other vulnerability classes like cross-site scripting (XSS) at scale. Google has already embraced MSLs like Java, Kotlin, Go, and Python for a large portion of our code.
</p>
<p>
Our next target is to ramp up memory-safe languages with the necessary capabilities to address the needs of even more of our low-level environments where C++ has remained dominant. For example, we are investing to expand Rust usage at Google beyond Android and other mobile use cases and into our server, application, and embedded ecosystems. This will unlock the use of MSLs in low-level code environments where C and C++ have typically been the language of choice. In addition, we are exploring more seamless interoperability with C++ through <a href="https://github.com/carbon-language/carbon-lang">Carbon</a>, as a means to accelerate even more of our transition to MSLs.
</p>
<p>
In Android, which runs on billions of devices and is one of our most critical platforms, we've already made strides in adopting MSLs, including Rust, in sections of our network, firmware and graphics stacks. We specifically focused on adopting memory safety in <em>new code</em> instead of rewriting mature and stable memory-unsafe C or C++ codebases. As we've previously <a href="https://security.googleblog.com/2024/09/eliminating-memory-safety-vulnerabilities-Android.html">discussed</a>, this strategy is driven by vulnerability trends as memory safety vulnerabilities were typically introduced shortly before being discovered.
</p>
<p>
As a result, the number of memory safety vulnerabilities reported in Android has decreased dramatically and quickly, dropping from more than 220 in 2019 to a projected 36 by the end of this year, demonstrating the effectiveness of this strategic shift. Given that memory-safety vulnerabilities are particularly severe, the reduction in memory safety vulnerabilities is leading to a <a href="https://security.googleblog.com/2022/12/memory-safe-languages-in-android-13.html#:~:text=With%20the%20drop%20in%20memory%20safety%20vulnerabilities%2C%20we%E2%80%99re%20seeing%20a%20corresponding%20drop%20in%20vulnerability%20severity.">corresponding drop in vulnerability severity</a>, representing a reduction in security risk.
</p>
<p>
<strong>Risk Reduction for Memory-Unsafe Code </strong>
</p>
<p>
While transitioning to memory-safe languages is the long-term strategy, and one that requires investment now, we recognize the immediate responsibility we have to protect the safety of our billions of users during this process. This means we cannot ignore the reality of a large codebase written in memory-unsafe languages (MULs) like C and C++.
</p>
<p>
Therefore the second pillar of our strategy focuses on risk reduction & containment of this portion of our codebase. This incorporates:
</p>
<ul>
<li><strong>C++ Hardening:</strong> We are retrofitting safety at scale in our memory-unsafe code, based on our <a href="https://bughunters.google.com/blog/5896512897417216/a-recipe-for-scaling-security">experience eliminating web vulnerabilities</a>. While we won't make C and C++ memory safe, we are eliminating sub-classes of vulnerabilities in the code we own, as well as reducing the risks of the remaining vulnerabilities through exploit mitigations.
<p>
We have allocated a portion of our computing resources specifically to <a href="https://libcxx.llvm.org/Hardening.html">bounds-checking the C++ standard library</a> across our workloads. While bounds-checking overhead is small for individual applications, deploying it at Google's scale requires significant computing resources. This underscores our deep commitment to enhancing the safety and security of our products and services. Early results are promising, and we'll share more details in a future post.
</p>
<p>
In Chrome, we have also been rolling out <a href="https://security.googleblog.com/2024/01/miracleptr-protecting-users-from-use.html">MiraclePtr</a> over the past few years, which effectively mitigated 57% of use-after-free vulnerabilities in privileged processes, and has been <a href="https://blog.google/technology/safety-security/a-review-of-zero-day-in-the-wild-exploits-in-2023/">linked</a> to a decrease of in-the-wild exploits.
</p></li>
<li><strong>Security Boundaries: </strong>We are continuing<sup id="fnref4"><a href="#fn4" rel="footnote">4</a></sup> to strengthen critical components of our software infrastructure through expanded use of<a href="https://www.chromium.org/Home/chromium-security/site-isolation/"> isolation techniques</a> like sandboxing and privilege reduction, limiting the potential impact of vulnerabilities. For example, earlier this year, we shipped the beta release of our <a href="https://v8.dev/blog/sandbox">V8 heap sandbox</a> and included it in <a href="https://bughunters.google.com/about/rules/chrome-friends/5745167867576320/chrome-vulnerability-reward-program-rules#v8-sandbox-bypass-rewards">Chrome's Vulnerability Reward Program</a>.<br></li>
<li><strong>Bug Detection</strong>: We are investing in bug detection tooling and innovative research such as <a href="https://googleprojectzero.blogspot.com/2024/06/project-naptime.html">Naptime</a> and making ML-guided fuzzing as effortless and wide-spread as testing. While we are increasingly shifting towards memory safety by design, these tools and techniques remain a critical component of proactively identifying and reducing risks, especially against vulnerability classes currently lacking strong preventative controls.
<p>
In addition, we are actively working with the semiconductor and research communities on emerging hardware-based approaches to improve memory safety. This includes our work to <a href="https://source.android.com/docs/security/test/memory-safety/arm-mte">support</a> and <a href="https://googleprojectzero.blogspot.com/2023/08/summary-mte-as-implemented.html">validate the efficacy</a> of <a href="https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/enhancing-memory-safety">Memory Tagging Extension</a> (MTE). Device implementations are starting to roll out, including within Google’s corporate environment. We are also conducting ongoing research into <a href="https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/">Capability Hardware Enhanced RISC Instructions (CHERI)</a> architecture which can provide finer grained memory protections and safety controls, particularly appealing in security-critical environments like embedded systems.
</p>
<p>
<strong>Looking ahead</strong>
</p>
<p>
We believe it’s important to embrace the opportunity to achieve memory safety at scale, and that it will have a positive impact on the safety of the broader digital ecosystem. This path forward requires continuous investment and innovation to drive safety and velocity, and we remain committed to the broader community to walk this path together.
</p>
<p>
We will provide future publications on memory safety that will go deeper into specific aspects of our strategy.
</p>
<!-- Footnotes themselves at the bottom. -->
<h2>Notes</h2>
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
Anderson, J. <em>Computer Security Technology Planning Study Vol II.</em> ESD-TR-73-51, Vol. II, Electronic Systems Division, Air Force Systems Command, Hanscom Field, Bedford, MA 01730 (Oct. 1972).
<p>
<a href="https://seclab.cs.ucdavis.edu/projects/history/papers/ande72.pdf">https://seclab.cs.ucdavis.edu/projects/history/papers/ande72.pdf</a> <a href="#fnref1" rev="footnote">↩</a><li id="fn2">
<p>
<a href="https://www.memorysafety.org/docs/memory-safety/#how-common-are-memory-safety-vulnerabilities">https://www.memorysafety.org/docs/memory-safety/#how-common-are-memory-safety-vulnerabilities</a> <a href="#fnref2" rev="footnote">↩</a><li id="fn3">
<p>
Kern, C. 2024. <em>Developer Ecosystems for Software Safety</em>. Commun. ACM 67, 6 (June 2024), 52–60. <a href="https://doi.org/10.1145/3651621">https://doi.org/10.1145/3651621</a> <a href="#fnref3" rev="footnote">↩</a><li id="fn4">
<p>
Barth, Adam, et al. “The security architecture of the chromium browser." Technical report. Stanford University, 2008.
<p>
<a href="https://seclab.stanford.edu/websec/chromium/chromium-security-architecture.pdf">https://seclab.stanford.edu/websec/chromium/chromium-security-architecture.pdf</a> <a href="#fnref4" rev="footnote">↩</a>
</ol></div>Kimberly Samrahttp://www.blogger.com/profile/17209446531010386292[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-61138318030961546622024-10-15T11:59:00.004-04:002024-10-15T12:40:16.323-04:00Bringing new theft protection features to Android users around the world<span class="byline-author">Posted by Jianing Sandra Guo, Product Manager and Nataliya Stanetsky, Staff Program Manager, Android</span>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD7y8V_clxWfBWOLp8NIhN7_s1wHFePbdJmwuSOgwzGR_f4ft_na9QPwfjgaufchGjAExgO4ghNjP2ylPswMxaQpuTOP20UY62qgI6-kF8dFaTExum3P6GOU0fDBox4J_FD268UGcYpYyPSSaSafQGqW-Zqikav2F5N8drYKw1uy9ZuRQKNLf3GivFr65p/s1600/Android_Theft%20Protection_Blog%20Header_2096x1182_v3.2%20%281%29.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1183" data-original-width="2097" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD7y8V_clxWfBWOLp8NIhN7_s1wHFePbdJmwuSOgwzGR_f4ft_na9QPwfjgaufchGjAExgO4ghNjP2ylPswMxaQpuTOP20UY62qgI6-kF8dFaTExum3P6GOU0fDBox4J_FD268UGcYpYyPSSaSafQGqW-Zqikav2F5N8drYKw1uy9ZuRQKNLf3GivFr65p/s1600/Android_Theft%20Protection_Blog%20Header_2096x1182_v3.2%20%281%29.png"/></a></div>
<p>
Janine Roberta Ferreira was driving home from work in São Paulo when she stopped at a traffic light. A man suddenly appeared and broke the window of her unlocked car, grabbing her phone. She struggled with him for a moment before he wrestled the phone away and ran off. The incident left her deeply shaken. Not only was she saddened at the loss of precious data, like pictures of her nephew, but she also felt vulnerable knowing her banking information was on her phone that was just stolen by a thief.
</p>
<p>
Situations like Janine’s highlighted the need for a comprehensive solution to phone theft that exceeded existing tools on any platform. Phone theft is a widespread concern in many countries – <a href="https://forumseguranca.org.br/wp-content/uploads/2022/07/07-anuario-2022-os-crimes-patrimoniais-no-brasil-entre-novas-e-velhas-dinamicas.pdf">97 phones are robbed or stolen every hour in Brazil</a>. The GSM Association <a href="https://www.gsma.com/solutions-and-impact/connectivity-for-good/public-policy/wp-content/uploads/2022/10/Safety-privacy-and-security-across-the-mobile-ecosystem.pdf">reports</a> millions of devices stolen every year, and the numbers continue to grow.
</p>
<p>
With our phones becoming increasingly central to storing sensitive data, like payment information and personal details, losing one can be an unsettling experience. That’s why we developed and thoroughly <a href="https://blog.google/intl/pt-br/produtos/android-chrome-play/recursos-do-android-contra-roubo-de-celular-chegam-ao-brasil/">beta tested</a>, a full suite of features designed to protect you and your data at every stage – before, during, and after device theft. <br><strong><em><br>These advanced theft protection features are now available to users around the world through <a href="https://blog.google/products/android/android-15/" target="_blank">Android 15</a> and a Google Play Services update (Android 10+ devices). </em></strong>
<div class="separator" style="clear: both; text-align: center;"><iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="8zYNNLxy9L0" width="600" height="498" src="https://www.youtube.com/embed/8zYNNLxy9L0"></iframe></div>
</p>
<h1><strong>AI-powered protection for your device the moment it is stolen </strong></h1>
<p>
<strong>Theft Detection Lock</strong> uses powerful AI to proactively protect you at the moment of a theft attempt. By using on-device machine learning, Theft Detection Lock is able to analyze various device signals to detect potential theft attempts. If the algorithm detects a potential theft attempt on your unlocked device, it locks your screen to keep thieves out.
</p>
<p>
To protect your sensitive data if your phone is stolen, Theft Detection Lock uses device sensors to identify theft attempts. We’re working hard to bring this feature to as many devices as possible. This feature is rolling out gradually to ensure compatibility with various devices, starting today with Android devices that cover 90% of active users worldwide. Check your theft protection settings page periodically to see if your device is currently supported.
</p>
<p>
In addition to Theft Detection Lock, <strong>Offline Device Lock</strong> protects you if a thief tries to take your device offline to extract data or avoid a remote wipe via Android’s <strong>Find My Device</strong>. If an unlocked device goes offline for prolonged periods, this feature locks the screen to ensure your phone can’t be used in the hands of a thief.
</p>
<p>
If your Android device does become lost or stolen, <strong>Remote Lock </strong>can quickly help you secure it. Even if you can’t remember your Google account credentials in the moment of theft, you can use any device to visit <a href="http://Android.com/lock">Android.com/lock</a> and lock your phone with just a verified phone number. Remote Lock secures your device while you regain access through Android’s Find My Device – which lets you secure, locate or remotely wipe your device. As a security best practice, we always recommend <a href="https://support.google.com/googleone/answer/9149304?hl=en&co=GENIE.Platform%3DAndroid">backing up your device</a> on a continuous basis, so remotely wiping your device is not an issue.
</p>
<p>
<em>These features are now available on most Android 10+ devices</em><sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup><em> via a Google Play Services update and must be enabled in settings. </em>
</p>
<h1><strong>Advanced security to deter theft before it happens </strong></h1>
<p>
Android 15 introduces new security features to deter theft before it happens by making it harder for thieves to access sensitive settings, apps, or reset your device for resale: <br>
</p>
<ul>
<li>Changes to sensitive settings like Find My Device now require your PIN, password, or biometric authentication. </li>
<li>Multiple failed login attempts, which could be a sign that a thief is trying to guess your password, will lock down your device, preventing unauthorized access. </li>
<li>And enhanced factory reset protection makes it even harder for thieves to reset your device without your Google account credentials, significantly reducing its resale value and protecting your data. </li>
</ul>
<p>
Later this year, we’ll launch <strong>Identity Check</strong>, an opt-in feature that will add an extra layer of protection by requiring biometric authentication when accessing critical Google account and device settings, like changing your PIN, disabling theft protection, or accessing Passkeys from an untrusted location. This helps prevent unauthorized access even if your device PIN is compromised.
</p>
<h1><strong>Real-world protection for billions of Android users</strong></h1>
<p>
By integrating advanced technology like AI and biometric authentication, we're making Android devices less appealing targets for thieves to give you greater peace of mind. These theft protection features are just one example of how Android is working to provide real-world protection for everyone. We’re dedicated to working with our partners around the world to continuously improve Android security and help you and your data stay safe.
</p>
<p>
<em>You can turn on the new Android theft features by clicking <a href="https://www.android.com/settings/theftprotection">here</a> on a supported Android device. Learn more about our theft protection features by visiting our <a href="https://support.google.com/android/answer/15146908">help center</a>. </em>
</p>
<!-- Footnotes themselves at the bottom. -->
<h2>Notes</h2>
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
Android Go smartphones, tablets and wearables are not supported <a href="#fnref1" rev="footnote">↩</a>
</ol></div>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-88578053100439718952024-10-10T12:00:00.056-04:002024-10-10T12:00:46.411-04:00Using Chrome's accessibility APIs to find security bugs<span class="byline-author">Posted by Adrian Taylor, Security Engineer, Chrome</span>
<html>
<head>
<style>
.code {
font-family: "Courier New", Courier, monospace;
font-size: 11.8px;
font-weight: bold;
background-color: #f4f4f4;
padding: 2px;
border: 1px solid #ccc;
border-radius: 2px;
white-space: pre-wrap;
display: inline-block;
line-height: 12px;
}
.highlight {
color: red;
}
</style>
</head>
<body>
<p>
</p>
<p>
</p>
<p>
Chrome’s user interface (UI) code is complex, and sometimes has bugs.
</p>
<p>
Are those bugs security bugs? Specifically, if a user’s clicks and actions result in memory corruption, is that something that an attacker can exploit to harm that user?
</p>
<p>
Our <a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/severity-guidelines.md">security severity guidelines</a> say “yes, sometimes.” For example, an attacker could very likely convince a user to click an autofill prompt, but it will be much harder to convince the user to step through a whole flow of different dialogs.
</p>
<p>
Even if these bugs aren’t the <em>most</em> easily exploitable, it takes a great deal of time for our security shepherds to make these determinations. User interface bugs are often flakey (that is, not reliably reproducible). Also, even if these bugs aren’t necessarily deemed to be exploitable, they may still be annoying crashes which bother the user.
</p>
<p>
It would be great if we could find these bugs automatically.
</p>
<p>
If only the whole tree of Chrome UI controls were exposed, somehow, such that we could enumerate and interact with each UI control automatically.
</p>
<p>
Aha! Chrome exposes all the UI controls to assistive technology. Chrome goes to great lengths to ensure its entire UI is exposed to screen readers, braille devices and other such assistive tech. This tree of controls includes all the toolbars, menus, and the <a href="https://developer.chrome.com/blog/full-accessibility-tree">structure of the page itself</a>. This structural definition of the browser user interface is already sometimes used in other contexts, for example by some password managers, demonstrating that investing in accessibility has <a href="https://en.wikipedia.org/wiki/Curb_cut_effect">benefits for all users</a>. We’re now taking that investment and leveraging it to find security bugs, too.
</p>
<p>
Specifically, we’re now “fuzzing” that accessibility tree - that is, interacting with the different UI controls semi-randomly to see if we can make things crash. This technique has a <a href="https://folklore.org/Monkey_Lives.html?sort=date?sort=date">long pedigree</a>.
</p>
<p>
Screen reader technology is a bit different on each platform, but on Linux the tree can be explored using <a href="https://help.gnome.org/users/accerciser/stable/introduction.html.en">Accerciser</a>.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1khLwvGCcYXCQyAu_uoySj2l91vrsHL3c3ijAHLy0IxhQugeivScGtpFZfvF6NU6ZgLxPCpMZBJFZFv4dDLVoE5c6eiX0TeaRlA3o6Y4gCrvbcetw9LOuixctJWtPiRgZOnqXwjuZ29z9TjYmCUVEAse1nDozxeX8iAdnZzc0pW6R33yXr8aJ1JQCAajR/s1600/image1.png" style="display: block; padding: 1em 0; text-align: center;"><img alt="" border="0" data-original-height="985" data-original-width="1678" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1khLwvGCcYXCQyAu_uoySj2l91vrsHL3c3ijAHLy0IxhQugeivScGtpFZfvF6NU6ZgLxPCpMZBJFZFv4dDLVoE5c6eiX0TeaRlA3o6Y4gCrvbcetw9LOuixctJWtPiRgZOnqXwjuZ29z9TjYmCUVEAse1nDozxeX8iAdnZzc0pW6R33yXr8aJ1JQCAajR/s1600/image1.png" /></a></div>
<p>
<center><em>Screenshot of Accerciser showing the tree of UI controls in Chrome</em></center>
</p>
<p>
All we have to do is explore the same tree of controls with a fuzzer. How hard can it be?
</p>
<p>
<em>“We do this not because it is easy, but because we thought it would be easy” - Anon.</em>
</p>
<p>
Actually we never thought this would be easy, and a few different bits of tech have had to fall into place to make this possible. Specifically,
</p>
<ul>
<li>There are lots of combinations of ways to interact with Chrome. Truly randomly clicking on UI controls probably won’t find bugs - we would like to leverage <a href="https://google.github.io/clusterfuzz/reference/coverage-guided-vs-blackbox/#coverage-guided-fuzzing">coverage-guided fuzzing</a> to help the fuzzer select combinations of controls that seem to reach into new code within Chrome.
<li>We need any such bugs to be genuine. We therefore need to fuzz the actual Chrome UI, or something very similar, rather than exercising parts of the code in an unrealistic unit-test-like context. That’s where our <a href="https://source.chromium.org/chromium/chromium/src/+/main:chrome/test/fuzzing/in_process_fuzzer.h">InProcessFuzzer</a> framework comes into play - it runs fuzz cases within a Chrome browser_test; essentially a real version of Chrome.
<li>But such browser_tests have a high startup cost. We need to amortize that cost over thousands of test cases by running a batch of them within each browser invocation. <a href="https://github.com/google/fuzztest/tree/main/centipede">Centipede</a> is designed to do that.
<li>But each test case won’t be idempotent. Within a given invocation of the browser, the UI state may be successively modified by each test case. We intend to add <a href="https://issues.chromium.org/issues/344606392">concatenation</a> to centipede to resolve this.
<li>Chrome is a noisy environment with lots of timers, which may well confuse coverage-guided fuzzers. Gathering coverage for such a large binary is slow in itself. So, we don’t know if coverage-guided fuzzing will successfully explore the UI paths here.
</li>
</li></li></li></li></ul>
<p>
All of these concerns are common to the other fuzzers which run in the browser_test context, most notably our <a href="https://source.chromium.org/chromium/chromium/src/+/main:chrome/test/fuzzing/renderer_fuzzing/renderer_in_process_mojolpm_fuzzer.cc">new IPC fuzzer</a> (blog posts to follow). But the UI fuzzer presented some specific challenges.
</p>
<p>
Finding UI bugs is only useful if they’re actionable. Ideally, that means:
</p>
<ul>
<li>Our fuzzing infrastructure gives a thorough set of diagnostics.
<li>It can bisect to find when the bug was introduced and when it was fixed.
<li>It can minimize complex test cases into the smallest possible reproducer.
<li>The test case is descriptive and says which UI controls were used, so a human may be able to reproduce it.
</li>
</li></li></li></ul>
<p>
These requirements together mean that the test cases should be stable across each Chrome version - if a given test case reproduces a bug with Chrome 125, hopefully it will do so in Chrome 124 and Chrome 126 (assuming the bug is present in both). Yet this is tricky, since Chrome UI controls are deeply nested and often anonymous.
</p>
<p>
Initially, the fuzzer picked controls simply based on their ordinal at each level of the tree (for instance “control 3 nested in control 5 nested in control 0”) but such test cases are unlikely to be stable as the Chrome UI evolves. Instead, we settled on an approach where the controls are named, when possible, and otherwise identified by a combination of role and ordinal. This yields test cases like this:
</p>
<div class="code">
action {
path_to_control {
named {
name: "Test - Chromium"
}
}
path_to_control {
anonymous {
role: "panel"
}
}
path_to_control {
anonymous {
role: "panel"
}
}
path_to_control {
anonymous {
role: "panel"
}
}
path_to_control {
named {
name: "Bookmarks"
}
}
take_action {
action_id: 12
}
}
</div>
<p>
Fuzzers are unlikely to stumble across these control names by chance, even with the instrumentation applied to string comparisons. In fact, this by-name approach turned out to be only 20% as effective as picking controls by ordinal. To resolve this we added a custom mutator which is smart enough to put in place control names and roles which are known to exist. We randomly use this mutator or the standard libprotobuf-mutator in order to get the best of both worlds. This approach has proven to be about 80% as quick as the original ordinal-based mutator, while providing stable test cases.
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikryEL6TdqAfO4CPD026MmtuA1mv7Vo17czluiVu1sC0nNbhnUCIPRC1QAPPG06YLVnDOV799l_uPPGWF2ljZhen-qqsRDmF2eU7Ww15EXaUquI-qFIaDgp77jprgkJ-_CJrJC05bCJOIfiBa5KWvHTb4WRLmmBZHzNz8DxVPkR_EBdMZKUv1mfM7TgKfN/s1600/image2.png" style="display: block; padding: 1em 0; text-align: center;"><img alt="" border="0" data-original-height="742" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikryEL6TdqAfO4CPD026MmtuA1mv7Vo17czluiVu1sC0nNbhnUCIPRC1QAPPG06YLVnDOV799l_uPPGWF2ljZhen-qqsRDmF2eU7Ww15EXaUquI-qFIaDgp77jprgkJ-_CJrJC05bCJOIfiBa5KWvHTb4WRLmmBZHzNz8DxVPkR_EBdMZKUv1mfM7TgKfN/s1600/image2.png" /></a></div>
<p>
<center><em>Chart of code coverage achieved by minutes fuzzing with different strategies</em></center>
<p>
So, does any of this work?
</p>
<p>
We don’t know yet! - and you can follow along as we find out. The fuzzer found a couple of <a href="https://issues.chromium.org/issues/348021995">potential</a> <a href="https://issues.chromium.org/issues/348328060">bugs</a> (currently access restricted) in the accessibility code itself but hasn’t yet explored far enough to discover bugs in Chrome’s fundamental UI. But, at the time of writing, this has only been running on our ClusterFuzz infrastructure for a few hours, and isn’t yet working on our <a href="https://analysis.chromium.org/coverage/p/chromium/file?host=chromium.googlesource.com&project=chromium/src&ref=refs/heads/main&revision=d4e6019588463e5cf95111345e52771c4aaf4b4c&path=//chrome/test/fuzzing/atspi_in_process_fuzzer.cc&platform=fuzz&test_suite_type=any&modifier_id=0">coverage dashboard</a>. If you’d like to follow along, keep an eye on our coverage dashboard as it expands to cover UI code.
</p></body></html>Googlehttp://www.blogger.com/profile/11822708545141062574[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-32776830907628111592024-10-03T12:59:00.000-04:002024-10-03T12:59:54.503-04:00Pixel's Proactive Approach to Security: Addressing Vulnerabilities in Cellular Modems<span class="byline-author">Posted by Sherk Chung, Stephan Chen, Pixel team, and Roger Piqueras Jover, Ivan Lozano, Android team</span>
<p>
Pixel phones have earned a well-deserved reputation for being security-conscious. In this blog, we'll take a peek under the hood to see how Pixel mitigates common exploits on cellular basebands.
</p>
<p>
Smartphones have become an integral part of our lives, but few of us think about the complex software that powers them, especially the cellular baseband – the processor on the device responsible for handling all cellular communication (such as LTE, 4G, and 5G). Most smartphones use cellular baseband processors with tight performance constraints, making security hardening difficult. Security researchers have increasingly exploited this attack vector and routinely demonstrated the possibility of exploiting basebands used in popular smartphones.
</p>
<p>
The good news is that Pixel has been deploying security hardening mitigations in our basebands for years, and Pixel 9 represents the most hardened baseband we've shipped yet. Below, we’ll dive into why this is so important, how specifically we’ve improved security, and what this means for our users.
</p>
<p>
<strong>The Cellular Baseband</strong>
</p>
<p>
The cellular baseband within a smartphone is responsible for managing the device's connectivity to cellular networks. This function inherently involves processing external inputs, which may originate from untrusted sources. For instance, malicious actors can <a href="https://i.blackhat.com/BH-US-23/Presentations/US-23-Karimi-Over-the-Air-Under-the-Radar.pdf">employ false base stations to inject fabricated or manipulated network packets</a>. In certain protocols like IMS (IP Multimedia Subsystem), this can be executed remotely from any global location using an IMS client.
</p>
<p>
The firmware within the cellular baseband, similar to any software, is susceptible to bugs and errors. In the context of the baseband, these software vulnerabilities pose a significant concern due to the heightened exposure of this component within the device's attack surface. There is ample evidence <a href="https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Over-The-Air-Baseband-Exploit-Gaining-Remote-Code-Execution-On-5G-Smartphones.pdf">demonstrating the exploitation of software bugs in modem basebands to achieve remote code execution</a>, highlighting the critical risk associated with such vulnerabilities.
</p>
<p>
<strong>The State of Baseband Security</strong>
</p>
<p>
Baseband security has emerged as a prominent area of research, with <a href="https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-Over-The-Air-Baseband-Exploit-Gaining-Remote-Code-Execution-On-5G-Smartphones.pdf">demonstrations of software bug exploitation</a> featuring in numerous security conferences. Many of these conferences now also incorporate <a href="https://www.offensivecon.org/trainings/2023/baseband-exploitation.html">training</a> <a href="https://www.hexacon.fr/trainer/ribeiro_burke/">sessions</a> dedicated to baseband firmware emulation, analysis, and exploitation techniques.
</p>
<p>
Recent reports by security researchers have noted that most basebands lack exploit mitigations commonly deployed elsewhere and considered best practices in software development. Mature <a href="https://source.android.com/docs/security/test/sanitizers">software hardening techniques that are commonplace in the Android operating system</a>, for example, are often absent from cellular firmwares of many popular smartphones.
</p>
<p>
There are clear indications that exploit vendors and cyber-espionage firms abuse these vulnerabilities to breach the privacy of individuals without their consent. For example, 0-day exploits in the cellular baseband are being used <a href="https://securitylab.amnesty.org/latest/2023/10/technical-deep-dive-into-intellexa-alliance-surveillance-products/">to deploy the Predator malware in smartphones</a>. Additionally, exploit marketplaces <a href="https://zerodium.com/program.html">explicitly list baseband exploits</a>, often with relatively low payouts, suggesting a potential abundance of such vulnerabilities. These vulnerabilities allow attackers to gain unauthorized access to a device, execute arbitrary code, escalate privileges, or extract sensitive information.
</p>
<p>
Recognizing these industry trends, Android and Pixel have proactively updated their <a href="https://bughunters.google.com/about/rules/android-friends/6171833274204160/android-and-google-devices-security-reward-program-rules">Vulnerability Rewards Program</a> in recent years, placing a greater emphasis on <a href="https://source.android.com/docs/security/overview/updates-resources#severity">identifying and addressing exploitable bugs in connectivity firmware</a>.
</p>
<p>
<strong>Building a Fortress: Proactive Defenses in the Pixel Modem</strong>
</p>
<p>
In response to the rising threat of baseband security attacks, Pixel has incrementally incorporated many of the following proactive defenses over the years, with the Pixel 9 phones (Pixel 9, Pixel 9 Pro, Pixel 9 Pro XL and Pixel 9 Pro Fold) showcasing the latest features:
</p>
<ul>
<li><strong>Bounds Sanitizer:</strong> Buffer overflows occur when a bug in code allows attackers to cram too much data into a space, causing it to spill over and potentially corrupt other data or execute malicious code. Bounds Sanitizer automatically adds checks around a specific subset of memory accesses to ensure that code does not access memory outside of designated areas, preventing memory corruption.
<li><strong>Integer Overflow Sanitizer:</strong> Numbers matter, and when they get too large an “overflow” can cause them to be incorrectly interpreted as smaller values. The reverse can happen as well, a number can overflow in the negative direction as well and be incorrectly interpreted as a larger value. These overflows can be exploited by attackers to cause unexpected behavior. Integer Overflow Sanitizer adds checks around these calculations to eliminate the risk of memory corruption from this class of vulnerabilities.
<li><strong>Stack Canaries:</strong> Stack canaries are like tripwires set up to ensure code executes in the expected order. If a hacker tries to exploit a vulnerability in the stack to change the flow of execution without being mindful of the canary, the canary "trips," alerting the system to a potential attack.
<li><strong>Control Flow Integrity (CFI): </strong>Similar to stack canaries, CFI makes sure code execution is constrained along a limited number of paths. If an attacker tries to deviate from the allowed set of execution paths, CFI causes the modem to restart rather than take the unallowed execution path.
<li><strong>Auto-Initialize Stack Variables:</strong> When memory is designated for use, it’s not normally initialized in C/C+ as it is expected the developer will correctly set up the allocated region. When a developer fails to handle this correctly, the uninitialized values can leak sensitive data or be manipulated by attackers to gain code execution. Pixel phones automatically initialize stack variables to zero, preventing this class of vulnerabilities for stack data.
</li>
</ul>
<p>
We also leverage a number of bug detection tools, such as <a href="https://clang.llvm.org/docs/AddressSanitizer.html">address sanitizer</a>, during our testing process. This helps us <a href="https://security.googleblog.com/2023/12/hardening-cellular-basebands-in-android.html">identify software bugs and patch them prior to shipping devices to our users</a>.
</p>
<p>
<strong>The Pixel Advantage: Combining Protections for Maximum Security</strong>
</p>
<p>
Security hardening is difficult and our work is never done, but when these security measures are combined, they significantly increase Pixel 9’s resilience to baseband attacks.
</p>
<p>
Pixel's proactive approach to security demonstrates a commitment to protecting its users across the entire software stack. Hardening the cellular baseband against remote attacks is just one example of how Pixel is constantly working to stay ahead of the curve when it comes to security.
</p>
<p>
<em>Special thanks to our colleagues who supported our cellular baseband hardening efforts: Dominik Maier, Shawn Yang, Sami Tolvanen, Pirama Arumuga Nainar, Stephen Hines, Kevin Deus, Xuan Xing, Eugene Rodionov, Stephan Somogyi, Wes Johnson, Suraj Harjani, Morgan Shen, Valery Wu, Clint Chen, Cheng-Yi He, Estefany Torres, Hungyen Weng, Jerry Hung, Sherif Hanna</em>
</p>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-21695622165428416262024-10-03T12:03:00.000-04:002024-10-03T12:03:16.344-04:00Evaluating Mitigations & Vulnerabilities in Chrome<span class="byline-author">Posted by Alex Gough, Chrome Security Team</span>
<p>
The Chrome Security Team is constantly striving to make it safer to browse the web. We invest in mechanisms to make classes of security bugs impossible, mitigations that make it more difficult to exploit a security bug, and sandboxing to reduce the capability exposed by an isolated security issue. When choosing where to invest it is helpful to consider how bad actors find and exploit vulnerabilities. In this post we discuss several axes along which to evaluate the potential harm to users from exploits, and how they apply to the Chrome browser.
</p>
<p>
Historically the Chrome Security Team has made major investments and driven the web to be safer. We pioneered browser <a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md">sandboxing</a>, <a href="https://security.googleblog.com/2021/07/protecting-more-with-site-isolation.html">site isolation</a> and the <a href="https://blog.chromium.org/2023/08/towards-https-by-default.html">migration to an encrypted web</a>. Today we’re investing in <a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html">Rust for memory safety</a>, hardening our existing C++ code-base, and improving detection with <a href="https://chromium.googlesource.com/chromium/src.git/+/HEAD/docs/gwp_asan.md">GWP-asan</a> and <a href="https://docs.google.com/document/d/1PE2tykvGqBJW3UpNcnOUwDHkkRAuNyfM5EHWDTNQ2VQ/edit?tab=t.0#heading=h.b966ynmd5x2b">lightweight use-after-free</a> (UAF) detection. Considerations of user-harm and attack utility shape our vulnerability <a href="https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/severity-guidelines.md">severity guidelines</a> and payouts for bugs reported through our <a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/security/vrp-faq.md">Vulnerability Rewards Program</a>. In the longer-term the Chrome Security Team advocates for operating system improvements like less-capable lightweight processes, less-privileged GPU and NPU containers, improved application isolation, and support for hardware-based isolation, memory safety and flow control enforcement.
</p>
<p>
When contemplating a particular security change it is easy to fall into a trap of security nihilism. It is tempting to reject changes that do not make exploitation impossible but only make it more difficult. However, the scale we are operating at can still make incremental improvements worthwhile. Over time, and over the population that uses Chrome and browsers based on Chromium, these improvements add up and impose real costs on attackers.
</p>
<h3>Threat Model for Code Execution</h3>
<p>
Our primary security goal is to make it safe to click on links, so people can feel confident browsing to pages they haven’t visited before. This document focuses on vulnerabilities and exploits that can lead to code execution, but the approach can be applied when mitigating other risks.
</p>
<p>
Attackers usually have some ultimate goal that can be achieved by executing their code outside of Chrome’s sandboxed or restricted processes. Attackers seek information or capabilities that we do not intend to be available to websites or extensions in the sandboxed renderer process. This might include executing code as the user or with system privileges, reading the memory of other processes, accessing credentials or opening local files. In this post we focus on attackers that start with JavaScript or the ability to send packets to Chrome and end up with something useful. We restrict discussion to memory-safety issues as they are a focus of current hardening efforts.
</p>
<h1 style="text-align: left;">User Harm ⇔ Attacker Utility</h1>
<p>
Chrome Security can scalably reduce risks to users by reducing attackers’ freedom of movement. Anything that makes some class of attackers’ ultimate goals more difficult, or (better) impossible, has value. People using Chrome have multiple, diverse adversaries. We should avoid thinking only about a single adversary, or a specific targeted user, the most advanced-persistent attackers or the most sophisticated people using the web. Chrome’s security protects a spectrum of people from a spectrum of attackers and risks. Focussing on a single bug, vector, attacker or user ignores the scale at which both Chrome and its attackers are operating. Reducing risks or increasing costs for even a fraction of threat scenarios helps someone, somewhere, be safer when using the web.
</p>
<p>
There are still better exploits for attackers and we should recognise and prioritize efforts that meaningfully prevent or fractionally reduce the availability or utility of the best bugs and escalation mechanisms.
</p>
<h3>Good Bugs and Bad Bugs</h3>
<p>
All bugs are bad bugs but some bugs are more amenable to exploitation. High value bugs and escalation mechanisms for attackers have some or all of the following attributes:
</p>
<div style="text-align: left;"><b>Reliable</b></div>
<p>
An exploit that sometimes crashes, or that when launched only sometimes allows for exploitation, is less useful than one that can be mechanically triggered in all cases. Crashes might lead to detection by the target or by defenders that collect the crashes. Attackers might not always have more than one chance to launch their attacks. Bugs that only surface when different threads must do things in a certain order require more use of resources or time to trigger. If attackers are willing to risk detection by causing a crash they can retry their attacks as Chrome uses a multi-process architecture for cross-domain iframes. Conversely, bugs that only occur when the main browser process shuts down are more difficult to trigger as attackers get a single attempt per session.
</p>
<div style="text-align: left;"><b>Low-interaction</b></div>
<p>
Chrome exists so that people can visit websites and click on links so we take that as our baseline for minimal interaction. Exploits that only work if a user performs an action, even if that action might be expected, are more risky for an attacker. This is because the code expressing the bug must be resident on a system for longer, the exploit likely has a lower yield as the action won’t always happen, and the bug is less silent as the user might become suspicious if they seem to be performing actions they are not used to performing.
</p>
<div style="text-align: left;"><b>Ubiquitous</b></div>
<p>
A bug that exists on several platforms and can be exploited the same way everywhere will be more useful than one which is only exploitable on one platform or needs to be ported to several platforms. Bugs that manifest on limited hardware types, or in fewer configurations, are only useful if the attacker has targets using them. Every bug an attacker has to integrate into their exploitation flow requires some ongoing maintenance and testing, so the fewer bugs needed the better. For Chrome some bugs only manifest on Linux, while others are present on all of our platforms. Chrome is one of the most ubiquitous software products today, but some of its libraries are even more widely used, so attackers may invest extra effort in finding and exploiting bugs in third party code that Chrome uses. Bugs that require a user to install an extension or rely on particular hardware configurations are less useful than ones reachable from any web page.
</p>
<div style="text-align: left;"><b>Fast</b></div>
<p>
Attacks that require more than a few seconds to set up or execute are less likely to succeed and more likely to be caught. It is more difficult to test and develop a reliable exploit using a slow bug as the compile-test-debug cycle will be stretched.
</p>
<div style="text-align: left;"><b>Scriptable</b></div>
<p>
Bugs that require an exploit to perform grooming or state manipulation to succeed are more valuable if their environment can be scripted. The closer the scripting is to the bug, the easier it is to control the context in which the bug will be triggered. Bugs deep in a codec, or a race in a thread the attacker does not control, are more difficult to script. Scriptable bugs are more easily integrated into an exploitation flow, while bugs that are not scriptable might only be useful if they can be integrated with a related <a href="https://langsec.org/papers/Bratus.pdf">weird machine</a>. Bugs that are adjacent to a scripting engine like JavaScript are easier to trigger - making some bugs in third party libraries more serious in Chrome than they might be in other contexts. Bugs in a tightly coupled API like WebGPU are easy to script. Chrome extensions can manipulate Chrome’s internal state and user-interface (for example, they can open, close and rearrange tabs), making some user-interaction scriptable.
</p>
<div style="text-align: left;"><b>Easy to Test</b></div>
<p>
Attackers need long-term confidence in their exploits, and will want to test them against changing versions of Chrome and the operating system running Chrome. Bugs that can be automatically reproduced in a test environment can be tested easily. Bugs that can only be triggered with user interaction, or after complex network calls, or that require interaction with third-party services are harder to test. They need a complex test environment, or a patched version of Chrome that mimics the environment in a way that triggers the bug. Maintaining this sort of system takes time and resources, making such bugs less attractive. Note that being scriptable relates to the environment of the bug. Scriptable environments lend themselves to easier testing.
</p>
<div style="text-align: left;"><b>Silent</b></div>
<p>
Bugs that cause side effects that can be detected are less useful than those which operate without alerting a user, modifying system state, emitting events, or causing repeatable and detectable network traffic. Side effects include metrics, crashes or slowdowns, pop ups & prompts, system logs and artifacts like downloaded files. Side effects might not alert a specific target of an attack as it happens but might lead to later identification of targeted systems. A bug that several groups know about could be detected without the attacker’s knowledge, even if it seems to succeed.
</p>
<div style="text-align: left;"><b>Long-lived</b></div>
<p>
Attackers will prefer bugs that are not likely to be fixed or found by others. Analyzing and integrating a bug into an exploitation suite likely involves significant up-front work, and attackers will prefer bugs that are likely to last a long time. Many attackers sell exploits as a subscription service, and their economic model might be disrupted if they need to find bugs at a higher rate. Bugs recently introduced into a product, or that might be found with widely known fuzzing techniques, are likely to be found (and possibly fixed) faster.
</p>
<div style="text-align: left;"><b>Targeted</b></div>
<p>
Attackers will try to protect their exploits from discovery and will prefer bugs that can be triggered only when they are confident they will only be exposed to chosen targets. It is relatively easy to fingerprint a web user using cookies, network knowledge and features of the web platform. Removing classes of delivery mechanisms (e.g. no unencrypted HTTP) can make it more difficult to target every exploit.
</p>
<div style="text-align: left;"><b>Easy to escalate</b></div>
<p>
Modern browsers do have several mitigations that make it more difficult to exploit some bugs or bug classes. Attackers usually must take the primitives offered by a bug, then control them to achieve a sub-goal like executing arbitrary system calls. Some bugs won’t chain well to a follow-on stage, or might need significant integration effort or tooling to allow a follow-on stage to proceed. The utility of some bugs is related to how well they couple with later escalation or lateral movement mechanisms. Some bugs by themselves are not useful — but can be combined with other bugs to make them reliable or feasible. Many info leaks fit into this category. A stable read-what-where primitive or a way to probe which memory is allocated makes an arbitrary write easier to execute. If a particular escalation technique crops up often in exploit chains or examples it is worth seeing if it can be remediated.
</p>
<div style="text-align: left;"><b>Easy to find</b></div>
<p>
This may be counter-intuitive but a bug that is easy to find can be useful until Chrome finds and fixes it and potential targets update. Chrome’s source code is publicly available and attackers can look for recent security or stability fixes and exploit them until the fixes are rolled out (N-days). Fuzzing finds the shallow bugs but does not hit those with even simple state requirements that are still amenable to manual discovery. An attacker may choose to specialize in finding bugs in a particular area that does not otherwise receive much security attention. Finally attackers might introduce the bug themselves in a library (a supply-chain attack).
</p>
<div style="text-align: left;"><b>Difficult to find</b></div>
<p>
Some bugs might be easy to find for an attacker because they created the bug, or difficult to find because they are in an under-studied area of the code base, or behind state that is difficult to fuzz. This makes the bug, once found, more valuable as it is likely to be long-lived as other actors will be less likely to find it. Attackers willing to reverse engineer and target closed-source components of Chrome may have access to vulnerabilities that the wider security community are unlikely to discover.
</p>
<h1 style="text-align: left;">Attacker Goals & Economics</h1>
<p>
Some attackers have a business model, others have a budget. Coarsely we worry about attackers that want to make money, and attackers that want to spy on people. Bugs and escalation mechanisms are useful to either group if they are well suited to their way of working. We can evaluate mitigations against different attacker's differing economic models. An unsophisticated actor targeting unsophisticated users might use a widely delivered unreliable attack with a low yield (e.g. encouraging people to run a malicious download). They only need to win a small fraction of the time. Other groups may do limited bug discovery but instead take short-lived, already-fixed bugs and integrate them into exploit kits. Some attackers could be modeled as having an infinite budget but they will still choose the cheapest most reliable mechanism to achieve their goals. The deprecation of Flash and the subsequent move to exploiting v8 perhaps best illustrates this.
</p>
<p>
When deploying mitigations or removing attack-surface we are ultimately trying to hinder adversaries from achieving their goals. Some attackers might make different decisions if the economics of their operations are changed by reducing the yield of the bugs that enable their activities. Some actors may be willing to devote substantial resources to maintaining a capability to target people using the web - and we can only speculate about their response to changes we introduce. For these sophisticated attackers, removing whole classes of vulnerabilities or escalation mechanisms will be more effective.
</p>
<h1 style="text-align: left;">Avoid linear thinking</h1>
<p>
We perceive successful exploits as chains — linear steps that start with a bug, proceed through various escalation stages, and achieve an attacker’s immediate goal of code execution or data access outside the sandboxed renderer process. We even ask for such chains through our Vulnerability Rewards Programme. For example, a JS type confusion allows for an out of bounds read/write in the v8 sandbox, a v8 sandbox escape bug allows read/write in the renderer, overwriting a JIT write/execute region allows for arbitrary code execution, and calls to system or browser APIs lead to a browser sandbox escape. The attacker starts with the ability to serve JavaScript to a Chrome user, and ends up with unconstrained code execution on the user’s device, presumably to later use this to meet their higher-level goals. Even useful models of layered defense tend to focus on limited paths that trigger an incident (like the single arrow often drawn piercing <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1298298/">slices of swiss-cheese</a>).
</p>
<p>
In reality the terrain presented to the universe of attackers is a complex web of latent possibilities, some known to some, and many yet to be discovered. This is more than ‘attackers think in graphs’, as we must acknowledge that a defensive intervention can succeed even if it does not prevent every attacker from reaching every possible person they wish to exploit.
</p>
<h1 style="text-align: left;"><b>
Conclusion
</b></h1>
<p>
It is tempting to reject a mitigation or removal of attack surface on the basis that attackers can simply find another way to achieve their goals. However this mindset presumes the most sophisticated attackers and their most desired targets. Our frame of analysis should be wider. We must recognize that many attackers have limited capability and expertise. Some may graft N-days onto red team tools. Some may have an expert or an exploit pipeline that performs well on a small subset of the Chrome codebase, but need training or more resources to obtain useful bugs if their current domain is taken away. Some will sell exploit kits that need rewriting if an escalation mechanism is removed. Previously reliable exploits might become less reliable, or take longer. Making life more difficult for attackers helps protect people using Chrome.
</p>
<p>
Although we argue that we should not “give up” on mitigations for escalation paths, it is still clearly more important to implement mitigations that make it impossible or difficult to trigger wide classes of initial vulnerabilities, or bypass a significant fraction of mitigations. Reported attacks always start with an initial vulnerability so it is tempting to invest all of our effort there, but this neglects beneficial interventions later in the attack mesh. Reductions in attacker utility translate to increases in attacker costs and reduction in aggregate risk.
</p>
<p>
A mitigation or bug-reduction mechanism that affects any of the axes of utility outlined above has some value to some of the people using Chrome.
</p>
<h2>Resources</h2>
<ul>
<li><a href="https://googleprojectzero.blogspot.com/2015/06/what-is-good-memory-corruption.html">Project Zero: What is a "good" memory corruption vulnerability?</a>
</li><li><a href="https://blog.isosceles.com/an-introduction-to-exploit-reliability/">An Introduction to Exploit Reliability</a> & <a href="https://blog.isosceles.com/what-is-a-good-linux-kernel-bug/">What is a "good" Linux Kernel bug?</a> (Isosceles)
</li><li><a href="https://securitycryptographywhatever.com/2024/06/24/mdowd/">Zero Day Markets with Mark Dowd</a> (Security Cryptography Whatever podcast)
</li><li>Escaping the Sandbox (Chrome and Adobe Pdf Reader) on Windows, Zer0Con 2024, Zhiniang Peng, R4nger, Q4n
</li><li><a href="https://www.cisa.gov/resources-tools/resources/exploring-memory-safety-critical-open-source-projects">Exploring Memory Safety in Critical Open Source Projects</a> (CISA.gov)</li></ul>Googlehttp://www.blogger.com/profile/11822708545141062574[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-52907244330587341992024-09-25T12:59:00.002-04:002024-10-01T13:32:38.484-04:00Eliminating Memory Safety Vulnerabilities at the Source<span class="byline-author">Posted by Jeff Vander Stoep - Android team, and Alex Rebert - Security Foundations<br /><br /></span>
<p>
Memory safety vulnerabilities remain a pervasive threat to software security. At Google, we believe the path to eliminating this class of vulnerabilities at scale and building high-assurance software lies in <a href="https://blog.google/technology/safety-security/tackling-cybersecurity-vulnerabilities-through-secure-by-design/">Safe Coding</a>, a secure-by-design approach that prioritizes transitioning to memory-safe languages.
</p>
<p>
This post demonstrates why focusing on Safe Coding for new code quickly and counterintuitively reduces the overall security risk of a codebase, finally breaking through the stubbornly high plateau of memory safety vulnerabilities and starting an exponential decline, all while being scalable and cost-effective.
</p>
<p>
We’ll also share updated data on how the percentage of memory safety vulnerabilities in Android dropped from 76% to 24% over 6 years as development shifted to memory safe languages.
</p>
<h1>Counterintuitive results</h1>
<p>
Consider a growing codebase primarily written in memory-unsafe languages, experiencing a constant influx of memory safety vulnerabilities. What happens if we gradually transition to memory-safe languages for new features, while leaving existing code mostly untouched except for bug fixes?
</p>
<p>
We can simulate the results. After some years, the code base has the following makeup<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> as new memory unsafe development slows down, and new memory safe development starts to take over:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW_r-wkHYN6aB63fR5lu4p-qEIF-pNFRKcs_nAywuoJzETX4rvHd-MeazQZPlncOi8u485JHpYM59O-3nPOaPDaMjH5LLCqxHHb4edQV44EUgB7zjNI7EXKNA-zeFJHSc2IfYXq0KfE4ANyQhyphenhyphenzDHUq-ZMX4canzYr-1g1rBAhj2shn4zYoBSGJ1X9Fgkt/s1600/image9.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="742" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW_r-wkHYN6aB63fR5lu4p-qEIF-pNFRKcs_nAywuoJzETX4rvHd-MeazQZPlncOi8u485JHpYM59O-3nPOaPDaMjH5LLCqxHHb4edQV44EUgB7zjNI7EXKNA-zeFJHSc2IfYXq0KfE4ANyQhyphenhyphenzDHUq-ZMX4canzYr-1g1rBAhj2shn4zYoBSGJ1X9Fgkt/s1600/image9.png"/></a></div>
</p>
<p>
In the final year of our simulation, despite the growth in memory-unsafe code, the number of memory safety vulnerabilities drops significantly, a seemingly counterintuitive result not seen with other strategies:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhriISdaRMIrklNyxjeUgzdXXpuLm65UZ3BPXdpViHyy_NaHQ7rwlelqkT1Z70GRAf9144yuh4ADtes82mNOONZcbEFYivTIUrXvvWCZNvT2rDyK4ZkOU00qk_oaCTpSfVZTty4z4UqM6-Xr1tYjZbTJIvNTX0DBsRotJ0iTEztvZEoR7SSuQE1dde2p1jf/s1600/image3.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="742" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhriISdaRMIrklNyxjeUgzdXXpuLm65UZ3BPXdpViHyy_NaHQ7rwlelqkT1Z70GRAf9144yuh4ADtes82mNOONZcbEFYivTIUrXvvWCZNvT2rDyK4ZkOU00qk_oaCTpSfVZTty4z4UqM6-Xr1tYjZbTJIvNTX0DBsRotJ0iTEztvZEoR7SSuQE1dde2p1jf/s1600/image3.png"/></a></div>
</p>
<p>
This reduction might seem paradoxical: how is this possible when the quantity of new memory unsafe code actually grew?
</p>
<h1>The math </h1>
<p>
The answer lies in an important observation: <strong>vulnerabilities decay exponentially</strong>. They have a half-life. The distribution of vulnerability lifetime follows an exponential distribution given an average vulnerability lifetime λ:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUTrTPtyvulXnZlxMEWF6rkSxoHRrNHjqhJ09jSUD_yf_3z-THg4n8oCY6b7YtEUIstSWNSOq8g4fPKLqu35A0n7lewRc1slBx07vI6KC341ItdBGJjmN0Zeq-L4Gc9f_mj2Gt9jtppMce2oI0U09dsFCIP49NECCe6XZMJdMu_kAU1G4Bsc2Xe-8VBCSg/s1600/Screenshot%202024-09-24%2011.00.53%20PM.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="47" data-original-width="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUTrTPtyvulXnZlxMEWF6rkSxoHRrNHjqhJ09jSUD_yf_3z-THg4n8oCY6b7YtEUIstSWNSOq8g4fPKLqu35A0n7lewRc1slBx07vI6KC341ItdBGJjmN0Zeq-L4Gc9f_mj2Gt9jtppMce2oI0U09dsFCIP49NECCe6XZMJdMu_kAU1G4Bsc2Xe-8VBCSg/s1600/Screenshot%202024-09-24%2011.00.53%20PM.png"/></a></div>
</p>
<p>
A large-scale study of vulnerability lifetimes<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup> published in 2022 in Usenix Security confirmed this phenomenon. Researchers found that the vast majority of vulnerabilities reside in new or recently modified code:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiY1Fp0sUM3d7vOI11Kdae3wdsekNW_GqUdUL6LnhpjSS2cyKxvp_Dr4_N8AGVAf5VDmOAUbcMpXLLH2aYcfeszpY3hr1ttvRclMb3IWMvh9npCkY9Pc5v3jvcnJom80scnkfVBbikWLN-AcfFXSO03gEPiGDE6XSEftV6DBbUYD5HX1BQLnO0bB5-iGb0/s1600/image7.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="684" data-original-width="1999" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiY1Fp0sUM3d7vOI11Kdae3wdsekNW_GqUdUL6LnhpjSS2cyKxvp_Dr4_N8AGVAf5VDmOAUbcMpXLLH2aYcfeszpY3hr1ttvRclMb3IWMvh9npCkY9Pc5v3jvcnJom80scnkfVBbikWLN-AcfFXSO03gEPiGDE6XSEftV6DBbUYD5HX1BQLnO0bB5-iGb0/s1600/image7.png"/></a></div>
</p>
<p>
This confirms and generalizes our <a href="https://security.googleblog.com/2021/04/rust-in-android-platform.html">observation, published in 2021</a>, that the density of Android’s memory safety bugs decreased with the age of the code, primarily residing in recent changes.
</p>
<p>
This leads to two important takeaways:
</p>
<ul>
<li><strong>The problem is overwhelmingly with new code</strong>, necessitating a fundamental change in how we develop code.
<li><strong>Code matures and gets safer with time, exponentially</strong>, making the returns on investments like rewrites diminish over time as code gets older.
</li>
</ul>
<p>
For example, based on the average vulnerability lifetimes, 5-year-old code has a 3.4x (using lifetimes from the study) to 7.4x (using lifetimes observed in Android and Chromium) lower vulnerability density than new code.
</p>
<p>
In real life, as with our simulation, when we start to prioritize prevention, the situation starts to rapidly improve.
</p>
<h1>In practice on Android</h1>
<p>
The Android team began prioritizing transitioning new development to memory safe languages around 2019. This decision was driven by the increasing cost and complexity of managing memory safety vulnerabilities. There’s much left to do, but the results have already been positive. Here’s the big picture in 2024, looking at total code:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1OlXyuvF9q6o3VG9Rh4OSgrEvvlJZ0D_O5uW5lp-NhF8hSxDkY98ftEfwYvFQrAGp-ftnehqJ2RU17KDyfhgI3KjeFsmJyqGmL7n_Ip1SXAnza-NSqgrsJ47HOTluyzKAb_LCpwGHtVybKg9LNgRorEKWS2LIpqrnmcPIxLRPfW9ECK_XqSQ5fjrU2WhH/s1600/image5.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="742" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1OlXyuvF9q6o3VG9Rh4OSgrEvvlJZ0D_O5uW5lp-NhF8hSxDkY98ftEfwYvFQrAGp-ftnehqJ2RU17KDyfhgI3KjeFsmJyqGmL7n_Ip1SXAnza-NSqgrsJ47HOTluyzKAb_LCpwGHtVybKg9LNgRorEKWS2LIpqrnmcPIxLRPfW9ECK_XqSQ5fjrU2WhH/s1600/image5.png"/></a></div>
<p>
<br>
</p>
<p>
Despite the majority of code still being unsafe (but, crucially, getting progressively older), we’re seeing a large and continued decline in memory safety vulnerabilities. The results align with what we simulated above, and are even better, potentially as a result of our parallel efforts to improve the safety of our memory unsafe code. We first <a href="https://security.googleblog.com/2022/12/memory-safe-languages-in-android-13.html">reported</a> this decline in 2022, and we continue to see the total number of memory safety vulnerabilities dropping<sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup>. Note that the data for 2024 is extrapolated to the full year (represented as 36, but currently at 27 after the <a href="https://source.android.com/docs/security/bulletin/2024-09-01">September security bulletin</a>).
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilTxSxGJLA-FakEzfrwOMTFJ8S03bJDn6Y61pKhtEAYV0oGXi1T_kVL48uU0ojZD9IwSXIQKL-duOtU1m4uEMsxNpvC3U9N_aynQ1XkrIkyFNve9Zj3FlbxJgcdrZaCSeKKJhYpEQM_NiMQDZduorxc8hgNJccpTX_VX3XYYV3uaQCwny7duVVDMNAHWHp/s1600/image8.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="742" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilTxSxGJLA-FakEzfrwOMTFJ8S03bJDn6Y61pKhtEAYV0oGXi1T_kVL48uU0ojZD9IwSXIQKL-duOtU1m4uEMsxNpvC3U9N_aynQ1XkrIkyFNve9Zj3FlbxJgcdrZaCSeKKJhYpEQM_NiMQDZduorxc8hgNJccpTX_VX3XYYV3uaQCwny7duVVDMNAHWHp/s1600/image8.png"/></a></div>
</p>
<p>
The percent of vulnerabilities caused by memory safety issues continues to correlate closely with the development language that’s used for new code. Memory safety issues, which accounted for 76% of Android vulnerabilities in 2019, and are currently 24% in 2024, well below the 70% industry norm, and continuing to drop.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoFvbQ1AN4OQOiRSBNqRKGhHAsaJNSJNOQ9ixLn0ClESW2S_zQttsaTuPY06gvxrY2d9QUUCoWNFzypHX6RB4mhOyhM8fbjJjDL6uascUpVYl7hgisMWcc0lcKRrWCPKc7XXoIxzj_Hr-7nOF6N3glP05w0wsvfdGmAENLha8yZYL7mPOmPqg1Q187oiQi/s1600/image6.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="742" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoFvbQ1AN4OQOiRSBNqRKGhHAsaJNSJNOQ9ixLn0ClESW2S_zQttsaTuPY06gvxrY2d9QUUCoWNFzypHX6RB4mhOyhM8fbjJjDL6uascUpVYl7hgisMWcc0lcKRrWCPKc7XXoIxzj_Hr-7nOF6N3glP05w0wsvfdGmAENLha8yZYL7mPOmPqg1Q187oiQi/s1600/image6.png"/></a></div>
</p>
<p>
As we noted in a <a href="https://security.googleblog.com/2022/12/memory-safe-languages-in-android-13.html">previous post, </a>memory safety vulnerabilities tend to be significantly more severe, more likely to be remotely reachable, more versatile, and more likely to be maliciously exploited than other vulnerability types. As the number of memory safety vulnerabilities have dropped, the overall security risk has dropped along with it.
</p>
<h1>Evolution of memory safety strategies</h1>
<p>
Over the past decades, the industry has pioneered significant advancements to combat memory safety vulnerabilities, with each generation of advancements contributing valuable tools and techniques that have tangibly improved software security. However, with the benefit of hindsight, it’s evident that we have yet to achieve a truly scalable and sustainable solution that achieves an acceptable level of risk:
</p>
<p>
<strong>1st generation: reactive patching.</strong> The initial focus was mainly on fixing vulnerabilities reactively. For problems as rampant as memory safety, this incurs ongoing costs on the business and its users. Software manufacturers have to invest significant resources in responding to frequent incidents. This leads to constant security updates, leaving users vulnerable to unknown issues, and frequently albeit temporarily vulnerable to known issues, which are getting exploited <a href="https://cloud.google.com/blog/topics/threat-intelligence/time-to-exploit-trends-2021-2022/">ever faster</a>.
</p>
<p>
<strong>2nd generation: proactive mitigating. </strong>The next approach consisted of reducing risk in vulnerable software, including a series of exploit mitigation strategies that raised the costs of crafting exploits. However, these mitigations, such as stack canaries and control-flow integrity, typically impose a recurring cost on products and development teams, often putting security and other product requirements in conflict:
</p>
<ul>
<li>They come with performance overhead, impacting execution speed, battery life, tail latencies, and memory usage, sometimes preventing their deployment.
<li>Attackers are seemingly infinitely creative, resulting in a cat-and-mouse game with defenders. In addition, the bar to develop and weaponize an exploit is regularly being lowered through <a href="https://docs.pwntools.com/en/stable/">better tooling</a> and other <a href="https://googleprojectzero.blogspot.com/2024/06/project-naptime.html">advancements</a>.
</li>
</ul>
<p>
<strong>3rd generation: proactive vulnerability discovery.</strong> The following generation focused on detecting vulnerabilities. This includes <a href="https://github.com/google/sanitizers">sanitizers</a>, often paired with fuzzing like <a href="https://llvm.org/docs/LibFuzzer.html">libfuzzer</a>, many of which were built by Google. While helpful, these methods address the symptoms of memory unsafety, not the root cause. They typically require constant pressure to get teams to fuzz, triage, and fix their findings, resulting in low coverage. Even when applied thoroughly, fuzzing does not provide high assurance, as evidenced by vulnerabilities found in extensively fuzzed code.
</p>
<p>
Products across the industry have been significantly strengthened by these approaches, and we remain committed to responding to, mitigating, and proactively hunting for vulnerabilities. Having said that, it has become increasingly clear that those approaches are not only insufficient for reaching an acceptable level of risk in the memory-safety domain, but incur ongoing and increasing costs to developers, users, businesses, and products. As highlighted by numerous government agencies, including CISA, in their <a href="https://www.cisa.gov/sites/default/files/2023-10/SecureByDesign_1025_508c.pdf">secure-by-design report</a>, "only by incorporating secure by design practices will we break the vicious cycle of constantly creating and applying fixes."
</p>
<h1>The fourth generation: high-assurance prevention</h1>
<p>
The shift towards memory safe languages represents more than just a change in technology, it is a fundamental shift in how to approach security. This shift is not an unprecedented one, but rather a significant expansion of a proven approach. An approach that has already demonstrated remarkable <a href="https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42934.pdf">success</a> in eliminating other vulnerability classes like XSS.
</p>
<p>
The foundation of this shift is <a href="https://dl.acm.org/doi/10.1145/3651621">Safe Coding</a>, which enforces security invariants directly into the development platform through language features, static analysis, and API design. The result is a secure by design ecosystem providing continuous assurance at scale, safe from the risk of accidentally introducing vulnerabilities.
</p>
<p>
The shift from previous generations to Safe Coding can be seen in the quantifiability of the assertions that are made when developing code. Instead of focusing on the interventions applied (mitigations, fuzzing), or attempting to use past performance to predict future security, Safe Coding allows us to make strong assertions about the code's properties and what can or cannot happen based on those properties.
</p>
<p>
Safe Coding's scalability lies in its ability to reduce costs by:
</p>
<ul>
<li><strong>Breaking the arms race:</strong> Instead of an endless arms race of defenders attempting to raise attackers’ costs by also raising their own, Safe Coding leverages our control of developer ecosystems to break this cycle by focusing on proactively building secure software from the start.
<li><strong>Commoditizing high assurance memory safety:</strong> Rather than precisely tailoring interventions to each asset's assessed risk, all while managing the cost and overhead of reassessing evolving risks and applying disparate interventions, Safe Coding establishes a <a href="https://www.philvenables.com/post/raise-the-baseline-by-reducing-the-cost-of-control">high baseline of commoditized security</a>, like memory-safe languages, that affordably reduces vulnerability density across the board. Modern memory-safe languages (especially Rust) extend these principles beyond memory safety to other bug classes.
<li><strong>Increasing productivity</strong>: Safe Coding improves code correctness and developer productivity by shifting bug finding further left, before the code is even checked in. We see this shift showing up in important metrics such as rollback rates (emergency code revert due to an unanticipated bug). The Android team has observed that the rollback rate of Rust changes is less than half that of C++.
</li>
</ul>
<h1>From lessons to action</h1>
<h2>Interoperability is the new rewrite</h2>
<p>
Based on what we’ve learned, it's become clear that we do not need to throw away or rewrite all our existing memory-unsafe code. Instead, Android is focusing on making interoperability safe and convenient as a primary capability in our memory safety journey. Interoperability offers a practical and incremental approach to adopting memory safe languages, allowing organizations to leverage existing investments in code and systems, while accelerating the development of new features.
</p>
<p>
We recommend focusing investments on improving interoperability, as we are doing with Rust ↔︎ C++ and Rust ↔︎ <a href="https://github.com/rust-diplomat/diplomat/pull/629">Kotlin</a>. To that end, earlier this year, Google provided a <a href="https://security.googleblog.com/2024/02/improving-interoperability-between-rust-and-c.html">$1,000,000 grant</a> to the Rust Foundation, in addition to developing interoperability tooling like <a href="https://github.com/google/crubit">Crubit</a> and <a href="https://github.com/google/autocxx">autocxx</a>.
</p>
<h2>Role of previous generations</h2>
<p>
As Safe Coding continues to drive down risk, what will be the role of mitigations and proactive detection? We don’t have definitive answers in Android, but expect something like the following:
</p>
<ul>
<li><strong>More selective use of proactive mitigations</strong>: We expect less reliance on exploit mitigations as we transition to memory-safe code, leading to not only safer software, but also more efficient software. For instance, after removing the now unnecessary sandbox, <a href="https://groups.google.com/a/chromium.org/g/chromium-dev/c/UhwVDk4HZFA">Chromium's Rust QR code generator</a> is 20 times faster.
<li><strong>Decreased use, but increased effectiveness of proactive detection</strong>: We anticipate a decreased reliance on proactive detection approaches like fuzzing, but increased effectiveness, as achieving comprehensive coverage over small well-encapsulated code snippets becomes more feasible.
</li>
</ul>
<h1>Final thoughts</h1>
<p>
Fighting against the math of vulnerability lifetimes has been a losing battle. Adopting Safe Coding in new code offers a paradigm shift, allowing us to leverage the inherent decay of vulnerabilities to our advantage, <em>even in large existing systems</em>. The concept is simple: once we turn off the tap of new vulnerabilities, they decrease exponentially, making all of our code safer, increasing the <a href="https://docs.google.com/presentation/d/16LZ6T-tcjgp3T8_N3m0pa5kNA1DwIsuMcQYDhpMU7uU/edit#slide=id.g3e7cac054a_0_89">effectiveness of security design</a>, and alleviating the scalability challenges associated with existing memory safety strategies such that they can be applied more effectively in a targeted manner.
</p>
<p>
This approach has proven successful in eliminating entire vulnerability classes and its effectiveness in tackling memory safety is increasingly evident based on more than half a decade of consistent results in Android.
</p>
<p>
We'll be sharing more about our secure-by-design efforts in the coming months.
</p>
<h1>Acknowledgements</h1>
<p>
Thanks Alice Ryhl for coding up the simulation. Thanks to Emilia Kasper, Adrian Taylor, Manish Goregaokar, Christoph Kern, and Lars Bergstrom for your helpful feedback on this post.
</p>
<!-- Footnotes themselves at the bottom. -->
<h2>Notes</h2>
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
Simulation was based on numbers similar to Android and other Google projects. The code base doubles every 6 years. The average lifetime for vulnerabilities is 2.5 years. It takes 10 years to transition to memory safe languages for new code, and we use a sigmoid function to represent the transition. Note that the use of the sigmoid function is why the second chart doesn’t initially appear to be exponential. <a href="#fnref1" rev="footnote">↩</a><li id="fn2">
<p>
Alexopoulos et al. <a href="https://www.usenix.org/conference/usenixsecurity22/presentation/alexopoulos">"How Long Do Vulnerabilities Live in the Code? A Large-Scale Empirical Measurement Study on FOSS Vulnerability Lifetimes"</a>. USENIX Security 22. <a href="#fnref2" rev="footnote">↩</a><li id="fn3">
<p>
Unlike our simulation, these are vulnerabilities from a real code base, which comes with higher variance, as you can see in the slight increase in 2023. Vulnerability reports were unusually high that year, but in line with expectations given code growth, so while the percentage of memory safety vulnerabilities continued to drop, the absolute number increased slightly. <a href="#fnref3" rev="footnote">↩</a>
</ol></div>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-57634204819719679492024-09-24T12:00:00.000-04:002024-09-24T12:00:16.218-04:00Google & Arm - Raising The Bar on GPU Security<span class="byline-author">Posted by Xuan Xing, Eugene Rodionov, Jon Bottarini, Adam Bacchus - Android Red Team;
Amit Chaudhary, Lyndon Fawcett, Joseph Artgole - Arm Product Security Team
</span>
<h3>Who cares about GPUs?</h3>
<p>
You, me, and the entire ecosystem! GPUs (graphics processing units) are critical in delivering rich visual experiences on mobile devices. However, the GPU software and firmware stack has become a way for attackers to gain permissions and entitlements (privilege escalation) to Android-based devices. There are plenty of issues in this category that can affect all major GPU brands, for example, <a href="https://nvd.nist.gov/vuln/detail/CVE-2023-4295">CVE-2023-4295</a>, <a href="https://nvd.nist.gov/vuln/detail/CVE-2023-21106">CVE-2023-21106</a>, <a href="https://nvd.nist.gov/vuln/detail/CVE-2021-0884">CVE-2021-0884</a>, and more. Most exploitable GPU vulnerabilities are in the implementation of the GPU kernel mode modules. These modules are pieces of code that load/unload during runtime, extending functionality without the need to reboot the device.
</p>
<p>
Proactive testing is good hygiene as it can lead to the detection and resolution of new vulnerabilities before they’re exploited. It’s also one of the most complex investigations to do as you don’t necessarily know where the vulnerability will appear (that’s the point!). By combining the expertise of Google’s engineers with IP owners and OEMs, we can ensure the Android ecosystem retains a strong measure of integrity.
</p>
<h3>Why investigate GPUs?</h3>
<p>
When researching vulnerabilities, GPUs are a popular target due to:
</p>
<ol>
<li><strong>Functionality vs. Security Tradeoffs</strong>
<p>
Nobody wants a slow, unresponsive device; any hits to GPU performance could result in a noticeably degraded user experience. As such, the GPU software stack in Android relies on an <strong>in-process HAL model</strong> where the API & user space drivers communicating with the GPU kernel mode module are running directly within the context of apps, thus avoiding IPC (interprocess communication). This opens the door for potentially untrusted code from a third party app being able to directly access the interface exposed by the GPU kernel module. If there are any vulnerabilities in the module, the third party app has an avenue to exploit them. As a result, a potentially untrusted code running in the context of the third party application is able to directly access the interface exposed by the GPU kernel module and exploit potential vulnerabilities in the kernel module.
</p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVb2Z92K3Iu0Eouk9WRIelR9flB1_0IJU1_HBpg-fJuuc3HUZen3aDt1P_C_JkSSqhEPSk6ivro3DVZwi1NXTBszbOSLKVzzU103x-c9EFryOUc71iWkl1JK2oHPC6R2M3-jFdWQfEiOQxYsl9bL2XWputk8mTpmHaG17BQIMhLM-Wj2xOnWy5un9qzP6G/s1600/arm%20blog.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="648" data-original-width="861" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVb2Z92K3Iu0Eouk9WRIelR9flB1_0IJU1_HBpg-fJuuc3HUZen3aDt1P_C_JkSSqhEPSk6ivro3DVZwi1NXTBszbOSLKVzzU103x-c9EFryOUc71iWkl1JK2oHPC6R2M3-jFdWQfEiOQxYsl9bL2XWputk8mTpmHaG17BQIMhLM-Wj2xOnWy5un9qzP6G/s1600/arm%20blog.png"/></a></div>
<li><strong>Variety & Memory Safety</strong>
<p>
Additionally, the implementation of GPU subsystems (and kernel modules specifically) from major OEMs are increasingly complex. Kernel modules for most GPUs are typically written in memory unsafe languages such as C, which are susceptible to memory corruption vulnerabilities like buffer overflow.
</p>
</li>
</ol>
<h3>Can someone do something about this?</h3>
<p>
Great news, we already have! Who’s we? The Android Red Team and Arm! We’ve worked together to run an engagement on the Mali GPU (more on that below), but first, a brief introduction:
</p>
<p>
<strong>Android Red Team</strong>
</p>
<p>
The Android Red Team performs time-bound security assessment engagements on all aspects of the Android open source codebase and conducts regular security reviews and assessments of internal Android components. Throughout these engagements, the Android Red Team regularly collaborates with 3rd party software and hardware providers to analyze and understand proprietary and “closed source” code repositories and relevant source code that are utilized by Android products with the sole objective to identify security risks and potential vulnerabilities before they can be exploited by adversaries outside of Android. This year, the Android Red Team collaborated directly with our industry partner, Arm, to conduct the Mali GPU engagement and further secure millions of Android devices.
</p>
<p>
<strong>Arm Product Security and GPU Teams</strong>
</p>
<p>
Arm has a central product security team that sets the policy and practice across the company. They also have dedicated product security experts embedded in engineering teams. Arm operates a systematic approach which is designed to prevent, discover, and eliminate security vulnerabilities. This includes a Security Development Lifecycle (SDL), a Monitoring capability, and Incident Response. For this collaboration the Android Red Teams were supported by the embedded security experts based in Arm’s GPU engineering team.
</p>
<h3>Working together to secure Android devices</h3>
<p>
Google’s Android Security teams and Arm have been working together for a long time. Security requirements are never static, and challenges exist with all GPU vendors. By frequently sharing expertise, the Android Red Team and Arm were able to accelerate detection and resolution. Investigations of identified vulnerabilities, potential remediation strategies, and hardening measures drove detailed analyses and the implementation of fixes where relevant.
</p>
<p>
Recent research focused on the Mali GPU because it is the most popular GPU in today's Android devices. Collaborating on GPU security allowed us to:
</p>
<ol>
<li><strong>Assess the impact on the broadest segment of the Android Ecosystem</strong>: The Arm Mali GPU is one of the most used GPUs by original equipment manufacturers (OEMs) and is found in many popular mobile devices. By focusing on the Arm Mali GPU, the Android Red Team could assess the security of a GPU implementation running on millions of Android devices worldwide.
<li><strong>Evaluate the reference implementation and vendor-specific changes: </strong>Phone manufacturers often modify the upstream implementation of GPUs. This tailors the GPU to the manufacturer's specific device(s). These modifications and enhancements are always challenging to make, and can sometimes introduce security vulnerabilities that are not present in the original version of the GPU upstream. In this specific instance, the Google Pixel team actively worked with the Android Red Team to better understand and secure the modifications they made for Pixel devices.
</li>
</ol>
<h3>Improvements</h3>
<p>
Investigations have led to significant improvements, leveling up the security of the GPU software/firmware stack across a wide segment of the Android ecosystem.
</p>
<h2>Testing the kernel driver</h2>
<p>
One key component of the GPU subsystem is its kernel mode driver. During this engagement, both the Android Red Team and Arm invested significant effort looking at the Mali kbase kernel driver. Due to its complexity, fuzzing was chosen as the primary testing approach for this area. Fuzzing automates and scales vulnerability discovery in a way not possible via manual methods. With help from Arm, the Android Red Team added more syzkaller fuzzing descriptions to match the latest Mali kbase driver implementation.
</p>
<p>
The team built a few customizations to enable fuzzing the Mali kbase driver in the cloud, without physical hardware. This provided a huge improvement to fuzzing performance and scalability. With the Pixel team’s support, we also were able to set up fuzzing on actual Pixel devices. Through the combination of cloud-based fuzzing, Pixel-based fuzzing, and manual review, we were able to uncover two memory issues in Pixel’s customization of driver code (CVE-2023-48409 and CVE-2023-48421).
</p>
<p>
Both issues occurred inside of the gpu_pixel_handle_buffer_liveness_update_ioctl function, which is implemented by the Pixel team as part of device specific customization. These are both memory issues caused by integer overflow problems. If exploited carefully alongside other vulnerabilities, these issues could lead to kernel privilege escalation from user space. Both issues were fixed and the patch was released to affected devices in <a href="https://source.android.com/docs/security/bulletin/pixel/2023-12-01">Pixel security bulletin 2023-12-01</a>.
</p>
<h2>Testing the firmware</h2>
<p>
Firmware is another fundamental building block of the GPU subsystem. It’s the intermediary working with kernel drivers and GPU hardware. In many cases, firmware functionality is directly/indirectly accessible from the application. So “application ⇒ kernel ⇒ firmware ⇒ kernel” is a known attack flow in this area. Also, in general, firmware runs on embedded microcontrollers with limited resources. Commonly used security kernel mitigations (ASLR, stack protection, heap protection, certain sanitizers, etc.) might not be applicable to firmware due to resource constraints and performance impact. This can make compromising firmware easier, in some cases, than directly compromising kernel drivers from user space. To test the integrity of existing firmware, the Android Red Team and Arm worked together to perform both fuzzing and formal verification along with manual analysis. This multi-pronged approach led to the discovery of CVE-2024-0153, which had a patch released in <a href="https://source.android.com/docs/security/bulletin/2024-07-01">the July 2024 Android Security Bulletin</a>.
</p>
<p>
CVE-2024-0153 happens when GPU firmware handles certain instructions. When handling such instructions, the firmware copies register content into a buffer. There are size checks before the copy operation. However, under very specific conditions, an out-of-bounds write happens to the destination buffer, leading to a buffer overflow. When carefully manipulated, this overflow will overwrite some other important structures following the buffer, causing code execution inside of the GPU firmware.
</p>
<p>
The conditions necessary to reach and potentially exploit this issue are very complex as it requires a deep understanding of how instructions are executed. With collective expertise, the Android Red Team and Arm were able to verify the exploitation path and leverage the issue to gain limited control of GPU firmware. This eventually circled back to the kernel to obtain privilege escalation. Arm did an excellent job to respond quickly and remediate the issue. Altogether, this highlights the strength of collaboration between both teams to dive deeper.
</p>
<h3>Time to Patch</h3>
<p>
It’s known that attackers exploit GPU vulnerabilities in the wild, and time to patch is crucial to reduce risk of exploitation and protect users. As a result of this engagement, nine new Security Test suite (<a href="https://source.android.com/docs/security/test/sts-sdk">STS</a>) tests were built to help partners automatically check their builds for missing Mali kbase patches. (Security Test Suite is software provided by Google to help partners automate the process of checking their builds for missing security patches.)
</p>
<h3>What’s Next?</h3>
<p>
The Arm Product Security Team is actively involved in security-focused industry communities and collaborates closely with its ecosystem partners. The engagement with the Android Red Team, for instance, provides valuable enablement that drives best practices and product excellence. Building on this collaborative approach, Arm is complementing its product security assurance capabilities with a bug bounty program. This investment will expand Arm’s efforts to identify potential vulnerabilities. For more information on Arm's product security initiatives, please visit this <a href="https://www.arm.com/products/product-security" target="_blank">product security page</a>.
</p>
<p>
The Android Red Team and Arm continue to work together to proactively raise the bar on GPU security. With thorough testing, rapid fixing, and updates to the security test suite, we’re improving the ecosystem for Android users. The Android Red Team looks forward to replicating this working relationship with other ecosystem partners to make devices more secure.
</p>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-20006126117123155572024-09-13T12:04:00.000-04:002024-09-13T12:04:12.571-04:00A new path for Kyber on the web<span class="byline-author">Posted by David Adrian, David Benjamin, Bob Beck & Devon O'Brien, Chrome Team</span>
<p>
We previously posted about <a href="https://blog.chromium.org/2023/08/protecting-chrome-traffic-with-hybrid.html">experimenting</a> with a hybrid post-quantum key exchange, and <a href="https://blog.chromium.org/2024/05/advancing-our-amazing-bet-on-asymmetric.html">enabling it</a> for 100% of Chrome Desktop clients. The hybrid key exchange used both the pre-quantum X25519 algorithm, and the new post-quantum algorithm Kyber. At the time, the NIST standardization process for Kyber had not yet finished.
</p>
<p>
Since then, the Kyber algorithm has been standardized with minor technical changes and renamed to the <a href="https://security.googleblog.com/2024/08/post-quantum-cryptography-standards.html">Module Lattice Key Encapsulation Mechanism</a> (ML-KEM). We have implemented ML-KEM in Google’s cryptography library, <a href="https://boringssl.googlesource.com/boringssl">BoringSSL</a>, which allows for it to be deployed and utilized by services that depend on this library.
</p>
<p>
The changes to the final version of ML-KEM make it incompatible with the previously deployed version of Kyber. As a result, the codepoint in TLS for hybrid post-quantum key exchange is changing from 0x6399 for Kyber768+X25519, to 0x11EC for <a href="https://datatracker.ietf.org/doc/draft-kwiatkowski-tls-ecdhe-mlkem/02/">ML-KEM768+X25519</a>. To handle this, we will be making the following changes in Chrome 131<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup>:
</p>
<ul>
<li>Chrome will switch from supporting Kyber to ML-KEM
<li>Chrome will offer a key share prediction for hybrid ML-KEM (codepoint 0x11EC)
<li>The PostQuantumKeyAgreementEnabled flag and <a href="https://chromeenterprise.google/policies/#PostQuantumKeyAgreementEnabled">enterprise policy</a> will apply to both Kyber and ML-KEM
<li>Chrome will no longer support hybrid Kyber (codepoint 0x6399)
</li>
</ul>
<p>
Chrome will not support Kyber and ML-KEM at the same time. We made this decision for several reasons:
</p>
<ol>
<li>Kyber was always experimental, so we think continuing to support it risks ossification on non-standard algorithms.
<li>Post-quantum cryptography is <a href="https://dadrian.io/blog/posts/pqc-signatures-2024/">too big</a> to be able to offer two post-quantum key share predictions at the same time.
<li>Server operators can temporarily support both algorithms at the same time to maintain post-quantum security with a broader set of clients, as they update over time.
</li>
</ol>
<p>
We do not want to regress any clients’ post-quantum security, so we are waiting until Chrome 131 to make this change so that server operators have a chance to update their implementations.
</p>
<p>
Longer term, we hope to avoid the chicken-and-egg problem for post-quantum key share predictions through our <a href="https://datatracker.ietf.org/doc/draft-ietf-tls-key-share-prediction/">emerging IETF draft for key share prediction</a>. This allows servers to broadcast what algorithms they support in DNS, so that clients can predict a key share that a server is known to support. This avoids the risk of an extra round trip, which can be particularly costly when using large post-quantum algorithms.
</p>
<p>
We’re excited to continue to improve security for Chrome users, against both current and future computers.
</p>
<!-- Footnotes themselves at the bottom. -->
<h2>Notes</h2>
<div class="footnotes">
<hr>
<ol><li id="fn1">
<p>
Chrome Canary, Dev, and Beta may see these changes prior to Chrome 131. <a href="#fnref1" rev="footnote">↩</a>
</ol></div>Googlehttp://www.blogger.com/profile/11822708545141062574[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-9812094245518169122024-09-04T12:02:00.001-04:002024-09-04T12:02:42.699-04:00Deploying Rust in Existing Firmware Codebases<p style="text-align: left;"><span class="byline-author">Posted by Ivan Lozano and Dominik Maier, Android Team</span> <p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Android's use of safe-by-design principles drives our adoption of memory-safe languages like Rust, making exploitation of the OS increasingly difficult with every release. To provide a secure foundation, we’re extending hardening and the use of </span><a href="https://security.googleblog.com/2023/10/bare-metal-rust-in-android.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">memory-safe languages to low-level firmware</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (including in </span><a href="https://cs.android.com/android/platform/superproject/main/+/main:trusty/user/app/keymint/lib.rs;drc=4176f2465d7dc81c398730cb579c0a4949a9a832" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Trusty apps</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">).</span></p><br /><p dir="ltr" style="line-height: 1.3800000000000001; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In this blog post, we'll show you how to gradually introduce </span><a href="https://security.googleblog.com/2021/04/rust-in-android-platform.html#:~:text=But%20what%20about%20all%20that%20existing%20C%2B%2B%3F" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Rust into your existing firmware</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, prioritizing new code and the most security-critical code. You'll see how easy it is to boost security with drop-in Rust replacements, and we'll even demonstrate how the Rust toolchain can handle specialized bare-metal targets.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Drop-in Rust replacements for C code are not a novel idea and have been used in other cases, such as </span><a href="https://mail.gnome.org/archives/desktop-devel-list/2017-January/msg00001.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">librsvg’s adoption of Rust</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> which involved </span><a href="https://web.archive.org/web/20170928062853/https://people.gnome.org/~federico/blog/docs/fmq-porting-c-to-rust.pdf" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">replacing C functions with Rust functions</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> in-place. We seek to demonstrate that this approach is viable for firmware, providing a path to memory-safety in an efficient and effective manner.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Memory Safety for Firmware</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Firmware serves as the interface between hardware and higher-level software. Due to the lack of software security mechanisms that are standard in higher-level software, vulnerabilities in firmware code can be dangerously exploited by malicious actors. Modern phones contain many coprocessors responsible for handling various operations, and each of these run their own firmware. Often, firmware consists of large legacy code bases written in memory-unsafe languages such as C or C++. Memory unsafety is the leading cause of vulnerabilities in </span><a href="https://source.android.com/docs/security/test/memory-safety" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://www.chromium.org/Home/chromium-security/memory-safety/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Chrome</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and many other code bases.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Rust provides a memory-safe alternative to C and C++ with comparable performance and code size. Additionally it supports interoperability with C with no overhead. The Android team has discussed </span><a href="https://security.googleblog.com/2023/10/bare-metal-rust-in-android.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Rust for bare-metal firmware previously</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and has </span><a href="https://google.github.io/comprehensive-rust/bare-metal.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">developed training specifically for this domain</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Incremental Rust Adoption</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our incremental approach focusing on replacing new and highest risk existing code (for example, code which processes external untrusted input) can provide maximum security benefits with the least amount of effort. Simply writing any new code in Rust reduces the number of new vulnerabilities and over time can lead to a reduction in </span><a href="https://security.googleblog.com/2021/04/rust-in-android-platform.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">the number of outstanding vulnerabilities</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">You can replace existing C functionality by writing a thin Rust shim that translates between an existing Rust API and the C API the codebase expects. The C API is replicated and exported by the shim for the existing codebase to link against. The shim serves as </span><a href="https://doc.rust-lang.org/nomicon/ffi.html#calling-rust-code-from-c" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">a wrapper</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> around the Rust library API, bridging the existing C API and the Rust API. This is a common approach when rewriting or replacing existing libraries with a Rust alternative.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Challenges and Considerations</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">There are several challenges you need to consider before introducing Rust to your firmware codebase. In the following section we address the general state of </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Rust (that is, bare-metal Rust code), how to find the right off-the-shelf crate (a rust library), porting an std crate to </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, using Bindgen to produce FFI bindings, how to approach allocators and panics, and how to set up your toolchain.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">The Rust Standard Library and Bare-Metal Environments</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Rust's standard library consists of three crates: </span><a href="https://doc.rust-lang.org/core/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">core</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://doc.rust-lang.org/alloc/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">alloc</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and </span><a href="https://doc.rust-lang.org/std/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">std</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. The </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">core</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate is always available. The </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate requires an allocator for its functionality. The </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate assumes a full-blown operating system and is commonly not supported in bare-metal environments. A third-party crate indicates it doesn’t rely on </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> through the crate-level </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">#![no_std] </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">attribute. This crate is said to be </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> compatible. The rest of the blog will focus on these.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Choosing a Component to Replace</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When choosing a component to replace, focus on self-contained components with robust testing. Ideally, the components functionality can be provided by an open-source implementation readily available which supports bare-metal environments.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Parsers which handle standard and commonly used data formats or protocols (such as, XML or DNS) are good initial candidates. This ensures the initial effort focuses on the challenges of integrating Rust with the existing code base and build system rather than the particulars of a complex component and simplifies testing. This approach eases introducing more Rust later on.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Choosing a Pre-Existing Crate (Rust Library)</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Picking the right open-source crate (Rust library) to replace the chosen component is crucial. Things to consider are:</span></p><ul style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Is the crate well maintained, for example, are open issues being addressed and does it use recent crate versions?</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">How widely used is the crate? This may be used as a quality signal, but also important to consider in the context of using crates later on which may depend on it.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Does the crate have acceptable documentation?</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Does it have acceptable test coverage?</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Additionally, the crate should ideally be </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> compatible, meaning the standard library is either unused or can be disabled. While a wide range of </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> compatible crates exist, others do not yet support this mode of operation – in those cases, see the next section on converting a </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> library to </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">By convention, crates which optionally support </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> will provide an </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> feature to indicate whether the standard library should be used. Similarly, the </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> feature usually indicates using an allocator is optional.</span></p><br /><div align="left" dir="ltr" style="margin-left: -14.25pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="67"></col><col width="790"></col></colgroup><tbody><tr style="height: 54.75pt;"><td style="background-color: #e1f5fe; overflow-wrap: break-word; overflow: hidden; padding: 14.4pt 14.4pt 14.4pt 14.4pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #01579b; font-family: Roboto, sans-serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 40px; overflow: hidden; width: 40px;"><img height="40" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfPgBmsZj6ZTOto6Frw_NToC18UKVimJ8SHuCerE7W01D83L3qeJ-Qop83lTf1pvDshgc4CW3pap9aXpzVpSQZtG9EVZDzIQKD5x3vZ4yiEGDxMODTUTNZtlGMVy3Sh-I1i4x-QY8RzBAaqOSap6rGuC9WYg4pdhUO5vY_-OqUCcPssnZAYmUKb-FnV5Ainemg?key=NlrS0k5AvJIpHEA9_mIwTQ" style="margin-left: 0px; margin-top: 0px;" width="40" /></span></span></p></td><td style="background-color: #e1f5fe; overflow-wrap: break-word; overflow: hidden; padding: 14.4pt 14.4pt 14.4pt 14.4pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Note:</span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Even when a library declares </span><span style="background-color: transparent; color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">#![no_std] </span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">in its source, there is no guarantee that its dependencies don’t depend on </span><span style="background-color: transparent; color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. We recommend looking through the dependency tree to ensure that all dependencies support </span><span style="background-color: transparent; color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, or test whether the library compiles for a </span><span style="background-color: transparent; color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> target. The only way to know is currently by trying to compile the crate for a bare-metal target.</span></p></td></tr></tbody></table></div><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For example, one approach is to run </span><span style="color: #0f9d58; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">cargo check</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> with a bare-metal toolchain provided through </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">rustup</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">$ rustup target add aarch64-unknown-none</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">$ cargo check</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--target</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">aarch64-unknown-none --no-default-features</span></p><br /><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 14pt;"><span style="font-family: "Google Sans", sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Porting a </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="font-family: "Google Sans", sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"> Library to </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">no_std</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If a library does not support </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, it might still be possible to port it to a bare-metal environment – especially file format parsers and other OS agnostic workloads. Higher-level functionality such as file handling, threading, and async code may present more of a challenge. In those cases, such functionality can be hidden behind feature flags to still provide the core functionality in a </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> build.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To port a </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate to </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (</span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">core</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">+</span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">):</span></p><ul style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">In the </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">cargo.toml</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> file, add a </span><span style="color: #0d904f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">std</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> feature, then add this </span><span style="color: #0d904f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">std</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> feature to the </span><span style="color: #0d904f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">default </span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">features</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Add the following lines to the top of the </span><span style="color: #0d904f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">lib.rs</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">:</span></p></li></ul><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #455a64; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">#![no_std]</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #455a64; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">#[cfg(feature = "std")]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #9c27b0; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">extern</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate std</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #9c27b0; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">extern</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate alloc</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">;</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Then, iteratively fix all occurring compiler errors as follows:</span></p><ol style="margin-bottom: 0; margin-top: 0; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: lower-alpha; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Move any </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">use</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> directives from </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> to either </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">core</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> or </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: lower-alpha; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Add </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">use</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> directives for all types that would otherwise automatically be imported by the </span><a href="https://doc.rust-lang.org/std/prelude/index.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;">std prelude</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">, such as </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">alloc::vec::Vec</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> and</span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> alloc::string::String</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: lower-alpha; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Hide anything that doesn't exist in </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">core</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> or </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> and cannot otherwise be supported in the </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">no_std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> build (such as file system accesses) behind a </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">#[cfg(feature = </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">"</span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">std</span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">"</span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">)] </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">guard.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: lower-alpha; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Anything that needs to interact with the embedded environment may need to be explicitly handled, such as functions for I/O. These likely need to be behind a </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">#[cfg(not(feature = "std"))]</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> guard.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: lower-alpha; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Disable </span><span style="color: #0d904f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">std</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;"> for all dependencies (that is, change their definitions in </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Cargo.toml</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">, if using Cargo).</span></p></li></ol><p dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 0pt;"><span style="font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This needs to be repeated for all dependencies within the crate dependency tree that do not support </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">no_std</span><span style="font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> yet.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Custom Target Architectures</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">There are a number of officially </span><a href="https://doc.rust-lang.org/rustc/platform-support.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">supported targets</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> by the Rust compiler, however, many bare-metal targets are missing from that list. Thankfully, the Rust compiler lowers to LLVM IR and uses an internal copy of LLVM to lower to machine code. Thus, it can support any target architecture that LLVM supports by defining a custom target.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Defining a custom target requires a toolchain built with the </span><a href="https://github.com/rust-lang/rust/blob/master/config.example.toml#L577-L580" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">channel set to dev or nightly</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Rust’s </span><a href="https://docs.rust-embedded.org/embedonomicon/custom-target.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Embedonomicon</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> has a wealth of information on this subject and should be referred to as the source of truth. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To give a quick overview, a custom target JSON file can be constructed by finding a similar supported target and dumping the JSON representation:</span></p><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">$ rustc </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--</span><span style="background-color: transparent; color: #9c27b0; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">print</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> target</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">list</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">[...]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">armv7a</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">none</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">eabi</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">[...]</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">$ rustc </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Z unstable</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">options </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--</span><span style="background-color: transparent; color: #9c27b0; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">print</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> target</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">spec</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">json </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">target armv7a</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">none</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">eabi</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This will print out a target JSON that looks something like:</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">$ rustc </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--</span><span style="background-color: transparent; color: #9c27b0; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">print</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> target</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">spec</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">json </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Z unstable</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">options </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">target</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">armv7a</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">none</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">eabi</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"abi"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"eabi"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"arch"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"arm"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"c-enum-min-bits"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #c53929; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">8</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"crt-objects-fallback"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"false"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"data-layout"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #0f9d58; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">[...]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This output can provide a starting point for defining your target. Of particular note, the data-layout field is defined in the </span><a href="https://llvm.org/docs/LangRef.html#data-layout" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">LLVM documentation</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Once the target is defined, </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">libcore</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">liballoc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (and </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">libstd</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, if applicable) must be built from source for the newly defined target. If using Cargo, building with </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-Z build-std</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> accomplishes this, indicating that these libraries should be built from source for your target along with your crate module:</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-top: solid #e0e0e0 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #455a64; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"># set build-std to the list of libraries needed</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">cargo build </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Z build</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">std</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">core</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">,</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc </span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">--</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">target my_target</span><span style="background-color: transparent; color: #616161; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">json</span></p></td></tr></tbody></table></div><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Building Rust With LLVM Prebuilts</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If the bare-metal architecture is not supported by the LLVM bundled internal to the Rust toolchain, a custom Rust toolchain can be produced with any LLVM prebuilts that support the target.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The instructions for building a Rust toolchain can be found in detail in the </span><a href="https://rustc-dev-guide.rust-lang.org/building/how-to-build-and-run.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Rust Compiler Developer Guide</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. In the </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">config.toml</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://github.com/rust-lang/rust/blob/036b38ced36b0ed16579f95b4647ba7424f6b1bc/config.example.toml#L790-L793" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">llvm-config</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> must be set to the path of the LLVM prebuilts.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">You can find the latest Rust Toolchain supported by a particular version of LLVM by checking the </span><a href="https://github.com/rust-lang/rust/blob/master/RELEASES.md" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">release notes</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and looking for releases which bump up the minimum supported LLVM version. For example, Rust </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1.76</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> bumped the </span><a href="https://github.com/rust-lang/rust/blob/master/RELEASES.md" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">minimum LLVM to 16</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1.73</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> bumped the </span><a href="https://github.com/rust-lang/rust/blob/master/RELEASES.md" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">minimum LLVM to 15</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. That means with LLVM15 prebuilts, the latest Rust toolchain that can be built is </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1.75</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 20pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Creating a Drop-In Rust Shim</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To create a drop-in replacement for the C/C++ function or API being replaced, the shim needs two things: it must provide the same API as the replaced library and it must know how to run in the firmware’s bare-metal environment.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Exposing the Same API</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The first is achieved by defining a Rust FFI interface with the same function signatures.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We try to keep the amount of unsafe Rust as minimal as possible by putting the actual implementation in a safe function and exposing a thin wrapper type around.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For example, the FreeRTOS </span><a href="https://github.com/FreeRTOS/coreJSON?tab=readme-ov-file#reference-example" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">coreJSON example</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> includes a </span><a href="https://github.com/FreeRTOS/coreJSON/blob/9ebaeb55cce39a6f79da9cceaa0cbc664a462c8b/source/include/core_json.h#L101-L102" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">JSON_Validate</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> C function with the following signature:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSONStatus_t</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSON_Validate(</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">const</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #9334e6; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">char</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">*</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">buf,</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">size_t</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">max</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">);</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We can write a shim in Rust between it and the memory safe </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">serde_json</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate to expose the C function signature. We try to keep the unsafe code to a minimum and call through to a safe function early:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">#[no_mangle]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">pub</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">unsafe</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">extern</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"C"</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">fn</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSON_Validate(buf:</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">*const</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">c_char,</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">len:</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">usize)</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-></span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSONStatus_t</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">if</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">buf.is_null()</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSONStatus::JSONNullParameter</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">as</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">_</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">else</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">if</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">len</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">==</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #c5221f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">0</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSONStatus::JSONBadParameter</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">as</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">_</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">else</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">json_validate(slice_from_raw_parts(buf</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">as</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">_,</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">len).as_ref().unwrap())</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">as</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">_</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #b80672; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">// No more unsafe code in here.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">fn</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">json_validate(buf:</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">&[u8])</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-></span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSONStatus</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">if</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">serde_json::from_slice::<Value>(buf).is_ok()</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JSONStatus::JSONSuccess</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #1967d2; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">else</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">{</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ILLEGAL_DOC</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><br /><br /><div align="left" dir="ltr" style="margin-left: -16.5pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="70"></col><col width="905"></col></colgroup><tbody><tr style="height: 54.75pt;"><td style="background-color: #e1f5fe; overflow-wrap: break-word; overflow: hidden; padding: 14.4pt 14.4pt 14.4pt 14.4pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #01579b; font-family: Roboto, sans-serif; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 24px; overflow: hidden; width: 24px;"><img height="24" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfPgBmsZj6ZTOto6Frw_NToC18UKVimJ8SHuCerE7W01D83L3qeJ-Qop83lTf1pvDshgc4CW3pap9aXpzVpSQZtG9EVZDzIQKD5x3vZ4yiEGDxMODTUTNZtlGMVy3Sh-I1i4x-QY8RzBAaqOSap6rGuC9WYg4pdhUO5vY_-OqUCcPssnZAYmUKb-FnV5Ainemg?key=NlrS0k5AvJIpHEA9_mIwTQ" style="margin-left: 0px; margin-top: 0px;" width="24" /></span></span></p></td><td style="background-color: #e1f5fe; overflow-wrap: break-word; overflow: hidden; padding: 14.4pt 14.4pt 14.4pt 14.4pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Note:</span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> This is a very simple example. For a highly resource constrained target, you can avoid </span><span style="background-color: transparent; color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and use </span><a href="https://docs.rs/serde-json-core/latest/serde_json_core" style="text-decoration-line: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">serde_json_core</span></a><span style="background-color: transparent; color: #01579b; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, which has even lower overhead but requires pre-defining the JSON structure so it can be allocated on the stack.</span></p></td></tr></tbody></table></div><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For further details on how to create an FFI interface, </span><a href="https://doc.rust-lang.org/nomicon/ffi.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">the Rustinomicon covers this topic extensively</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Calling Back to C/C++ Code</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In order for any Rust component to be functional within a C-based firmware, it will need to call back into the C code for things such as allocations or logging. Thankfully, there are a variety of tools available which automatically generate Rust FFI bindings to C. That way, C functions can easily be invoked from Rust.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The standard means of doing this is with the </span><a href="https://github.com/rust-lang/rust-bindgen" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Bindgen</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> tool. You can use Bindgen to parse all relevant C headers that define the functions Rust needs to call into. It's important to invoke Bindgen with the same </span><span style="color: #0f9d58; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">CFLAGS</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> as the code in question is built with, to ensure that the bindings are generated correctly.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Experimental support for producing </span><a href="https://github.com/rust-lang/rust-bindgen/discussions/2405" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">bindings to static inline functions</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is also available.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Hooking Up The Firmware’s Bare-Metal Environment</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Next we need to hook up Rust panic handlers, global allocators, and critical section handlers to the existing code base. This requires producing definitions for each of these which call into the existing firmware C functions.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Rust panic handler must be defined to handle unexpected states or failed assertions. A custom panic handler can be defined via the </span><a href="https://doc.rust-lang.org/nomicon/panic-handler.html" style="text-decoration-line: none;"><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">panic_handler</span><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"> attribute</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. This is specific to the target and should, in most cases, either point to an abort function for the current task/process, or a panic function provided by the environment.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If an allocator is available in the firmware and the crate relies on the </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate, the Rust allocator can be hooked up by </span><a href="https://doc.rust-lang.org/stable/core/alloc/trait.GlobalAlloc.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">defining a global allocator implementing GlobalAlloc</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If the crate in question relies on concurrency, critical sections will need to be handled. Rust's </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">core</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> or </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crates do not directly provide a means for defining this, however the </span><a href="https://docs.rs/critical-section/latest/critical_section/" style="text-decoration-line: none;"><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">critical_section</span><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"> crate</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is commonly used to handle this functionality for a number of architectures, and can be extended to support more.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">It can be useful to hook up functions for logging as well. Simple wrappers around the firmware’s existing logging functions can expose these to Rust and be used in place of </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">print</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> or </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">eprint </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">and the like. A convenient option is to </span><a href="https://google.github.io/comprehensive-rust/bare-metal/aps/logging.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">implement the </span><span style="color: #0f9d58; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Log</span><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"> trait</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 10pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Fallible Allocations and </span><span style="color: #0f9d58; font-family: "Roboto Mono", monospace; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">alloc</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Rusts </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate normally assumes that allocations are infallible (that is, memory allocations won’t fail). However due to memory constraints this isn’t true in most bare-metal environments. Under normal circumstances </span><a href="https://doc.rust-lang.org/stable/std/alloc/fn.handle_alloc_error.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Rust panics and/or aborts</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> when an allocation fails; this may be acceptable behavior for some bare-metal environments, in which case there are no further considerations when using </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If there’s a clear justification or requirement for fallible allocations however, additional effort is required to ensure that either allocations can’t fail or that failures are handled. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">One approach is to use a crate that provides statically allocated fallible collections, such as the </span><a href="https://docs.rs/heapless/latest/heapless/index.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">heapless</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> crate, or dynamic fallible allocations like </span><a href="https://docs.rs/fallible_vec/latest/fallible_vec/" style="text-decoration-line: none;"><span style="color: #0f9d58; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">fallible_vec</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Another is to exclusively use </span><span style="color: #0f9d58; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">try_*</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> methods such as </span><span style="color: #0f9d58; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Vec::try_reserve</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, which check if the allocation is possible.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Rust is in the process of formalizing better support for fallible allocations, with an </span><a href="https://doc.rust-lang.org/std/alloc/trait.Allocator.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">experimental allocator in nightly</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> allowing </span><a href="https://doc.rust-lang.org/std/alloc/struct.AllocError.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">failed allocations</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to be handled by the implementation. There is also the unstable cfg flag for </span><span style="color: #0d904f; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">alloc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> called </span><a href="https://github.com/rust-lang/rust/pull/84266" style="text-decoration-line: none;"><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">no_global_oom_handling</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> which removes the infallible methods, ensuring they are not used.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Build Optimizations</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Building the Rust library with LTO is necessary to optimize for code size. The existing C/C++ code base does not need to be built with LTO when passing </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-C lto=true</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">rustc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Additionally, setting </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-C codegen-unit=1</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> results in further optimizations in addition to reproducibility. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If using Cargo to build, the following Cargo.toml settings are recommended to reduce the output library size:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">[profile.release]</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">panic</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"abort"</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">lto</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">true</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">codegen-units</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">strip = "symbols"</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"># opt-level "z" may produce better results in some circumstances</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">opt-level</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 9pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">"s" </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Passing the </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">-Z remap-cwd-prefix=.</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> flag to </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">rustc</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> or to Cargo via the </span><span style="color: #0d904f; font-family: Consolas, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">RUSTFLAGS</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> env var when building with Cargo to strip cwd path strings.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In terms of performance, Rust demonstrates similar performance to C. The most relevant example may be the Rust binder Linux kernel driver, which found “</span><a href="https://lore.kernel.org/rust-for-linux/[email protected]/#:~:text=We%27ve%20found%20that%20Rust%20binder%20has%20similar%20performance%20to%20C%20binder%20on%20the%0AbinderThroughputTest%20benchmark.%20The%20average%20latencies%20fluctuate%20between%0A%2D1.96%25%20and%20%2B1.38%25." style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">that Rust binder has similar performance to C binder</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">”.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When linking LTO’d Rust staticlibs together with C/C++, it’s recommended to ensure a single Rust staticlib ends up in the final linkage, otherwise there may be </span><a href="https://github.com/rust-lang/rust/issues/44322" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">duplicate symbol errors</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> when linking. This may mean combining multiple Rust shims into a single static library by re-exporting them from a wrapper module.</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: Arial, sans-serif; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Memory Safety for Firmware, Today</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Using the process outlined in this blog post, You can begin to introduce Rust into large legacy firmware code bases immediately. Replacing security critical components with off-the-shelf open-source memory-safe implementations and developing new features in a memory safe language will lead to fewer critical vulnerabilities while also providing an </span><a href="https://opensource.googleblog.com/2023/06/rust-fact-vs-fiction-5-insights-from-googles-rust-journey-2022.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">improved developer experience</span></a><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Roboto, sans-serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Special thanks to our colleagues who have supported and contributed to these efforts: Roger Piqueras Jover, Stephan Chen, Gil Cukierman, Andrew Walbran, and Erik Gilling </span></p><div><span style="font-family: Roboto, sans-serif; font-size: 12pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-26535908788330481572024-08-13T13:00:00.000-04:002024-08-13T13:00:04.968-04:00Private AI For All: Our End-To-End Approach to AI Privacy on Android<span class="byline-author">Posted by Dave Kleidermacher, VP Engineering, Android Security and Privacy, and Giles Hogben, Senior Director, Privacy Engineering, Android</span>
<p>
Your smartphone holds a lot of your personal information to help you get things done every day. On Android, we are seamlessly integrating the latest artificial intelligence (AI) capabilities, like Gemini as a trusted assistant – capable of handling life's essential tasks. As such, ensuring your privacy and security on Android is paramount. As a pioneer in responsible AI and cutting-edge privacy technologies like <a href="https://security.googleblog.com/2022/12/trust-in-transparency-private-compute.html">Private Compute Core</a> and <a href="https://research.google/blog/federated-learning-collaborative-machine-learning-without-centralized-training-data/">federated learning</a>, we made sure our approach to the assistant experience with Gemini on Android is aligned with our existing <a href="https://safety.google/cybersecurity-advancements/saif/">Secure AI framework</a>, <a href="https://ai.google/responsibility/principles/">AI Principles</a> and <a href="https://safety.google/principles/">Privacy Principles</a>.
</p>
<p>
We’ve always safeguarded your data with an integrated stack of world-class secure infrastructure and technology, delivering end-to-end protection in a way that only Google can. From privacy on-device when handling sensitive data to the world’s best cloud infrastructure, here are six key ways we keep your information private and protected.
</p>
<ul>
<li><strong>We don’t hand off to a third-party AI provider.</strong>
<p>
Gemini Apps can help you with complex, personal tasks from creating workout routines to helping you get started on a resume. And it does the hard work for you all within Google's ecosystem. The core processing is done by Gemini within Google's secure cloud infrastructure and there are no handoffs to third-party chatbots or AI providers that you may not know or trust.
</p>
</li>
</ul>
<ul>
<li><strong>On-device AI privacy for sensitive tasks, even when offline.</strong>
<p>
For some AI features, like <a href="https://store.google.com/intl/en/ideas/articles/gemini-nano-google-pixel/">Summarize in Recorder</a> on Pixel, that benefit from additional data privacy or processing efficiency, we utilize on-device AI. <a href="https://blog.google/technology/ai/google-gemini-ai/">Gemini Nano</a>, the first multimodal model designed to run on mobile devices, delivers on-device AI processing for some of your most sensitive tasks without relying on cloud connectivity. You can enjoy features like summarizing text even when you’re offline.
</p>
</li>
</ul>
<ul>
<li><strong>World-class cloud infrastructure that is secure by default, private by design.</strong>
<p>
For AI tasks that use data already in the cloud or have complex demands that require more processing power than what’s possible on-device, we use Google’s highly secure cloud infrastructure. Backed by Google’s world-class security and privacy infrastructure and processes, these data centers benefit from the same robust defenses that have kept Google products safe for billions of users for more than 20 years. So you can ask Gemini to find details in your lease agreement saved in your Google Drive and that data is protected by <a href="https://cloud.google.com/docs/security/production-services-protection">advanced monitoring against unauthorized access</a> or misuse. We also enforce strict software supply chain controls to ensure that only approved and verified code runs in our cloud environment.
</p>
</li>
</ul>
<ul>
<li><strong>Control how you interact with Gemini Apps.</strong><p>
We've designed the Gemini Apps experience with careful consideration for how you access it and control it. You can review and choose the Gemini experiences you want – when and where they’re needed most. And at any time, you can <a href="https://support.google.com/gemini/answer/13666746?hl=en&co=GENIE.Platform%3DAndroid&oco=1#zippy=%2Cin-the-gemini-mobile-apps">review your Gemini Apps chats</a>, pin them, <a href="https://support.google.com/gemini/answer/13278892?sjid=2800487149694713106-NC">or delete them</a>. Android also gives you control over how apps such as Gemini respond when your device is locked.
</p>
</li>
</ul>
<ul>
<li><strong>Pioneering new privacy technologies.</strong><p>
We’re always working to develop new ways to keep your data even more private and secure. We continue to innovate in advancing privacy-preserving technologies, like <a href="https://github.com/project-oak/oak/blob/main/README.md">sealed computing technology</a>, which can be used to process sensitive workloads for enhanced privacy in a secure cloud enclave. Sealed computing ensures no one, including Google, can access the data. It can be thought of as extending the user’s device and its security boundaries into our cloud infrastructure, providing a virtual smartphone in the sky.</p>
</li><li><p><b>A new level of transparency.</b><br /><br />Transparency is in Android’s open-source DNA. <a href="https://developers.google.com/android/binary_transparency/overview">Android binary transparency</a> already allows anyone to verify the operating system code against a transparency log to ensure it hasn't been tampered with, much like matching fingerprint biometrics to confirm someone's identity. Binary transparency is extended in sealed computing environments to include <a href="https://github.com/project-oak/oak/blob/main/README.md#remote-attestation">reproducible builds</a>. This ensures anyone can rebuild the trusted firmware base and verify that the resulting binaries match what is remotely attested as running in production and published in public transparency logs.</p></li>
</ul>
<p>
</p><h3 style="text-align: left;"><strong>Our Commitment to Safeguarding Your Data</strong></h3>Just like with all Google products, we believe you should be able to enjoy the benefits of Android without having to worry about security and privacy. That's why we invest so much in building world-class protections into our products and services from the start. We look forward to continuing to make AI helpful and intuitive, allowing you to focus on what matters most, while we take care of safeguarding your data.
<p></p>
<p>
<strong><em>Keep a lookout for more information about our end-to-end approach to AI privacy in an upcoming whitepaper. </em></strong></p>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-60435235149761661802024-08-13T00:33:00.003-04:002024-08-13T10:00:07.223-04:00Post-Quantum Cryptography: Standards and Progress<span class="byline-author">Posted by Royal Hansen, VP, Privacy, Safety and Security Engineering, Google, and Phil Venables, VP, TI Security & CISO, Google Cloud</span>
<p>
The National Institute of Standards and Technology (NIST) just released three finalized standards for post-quantum cryptography (PQC) covering public key encapsulation and two forms of digital signatures. In progress since 2016, this achievement represents a major milestone towards standards development that will keep information on the Internet secure and confidential for many years to come.
</p>
<p>
Here's a brief overview of what PQC is, how Google is using PQC, and how other organizations can adopt these new standards. You can also read more about PQC and Google's role in the standardization process <a href="https://cloud.google.com/blog/products/identity-security/how-google-is-preparing-for-a-post-quantum-world/?e=48754805">in this 2022 post from Cloud CISO Phil Venables</a>.
</p>
<h2>What is PQC?</h2>
<p>
Encryption is central to keeping information confidential and secure on the Internet. Today, most Internet sessions in modern browsers are encrypted to prevent anyone from eavesdropping or altering the data in transit. Digital signatures are also crucial to online trust, from code signing proving that programs haven't been tampered with, to signals that can be relied on for confirming online identity.
</p>
<p>
Modern encryption technologies are secure because the computing power required to "crack the code" is very large; larger than any computer in existence today or the foreseeable future. Unfortunately, that's an advantage that won't last forever. Practical large-scale <a href="https://quantumai.google/discover/whatisqc">quantum computers</a> are still years away, but computer scientists <a href="https://en.wikipedia.org/wiki/Shor%27s_algorithm">have known for decades</a> that a cryptographically relevant quantum computer (CRQC) could break existing forms of asymmetric key cryptography.
</p>
<p>
PQC is the effort to defend against that risk, by defining standards and collaboratively implementing new algorithms that will resist attacks by both classical and quantum computers.
</p>
<p>
You don't need a quantum computer to use post-quantum cryptography, or to prepare. All of the standards released by NIST today run on the classical computers we currently use.
</p>
<h2>How is encryption at risk?</h2>
<p>
While a CRQC doesn't exist yet, devices and data from today will still be relevant in future. Some risks are already here:
</p>
<ul>
<li><strong>Stored Data</strong> Through an attack known as <em>Store Now, Decrypt Later</em>, encrypted data captured and saved by attackers is stored for later decryption, with the help of as-yet unbuilt quantum computers
<li><strong>Hardware Products</strong> Defenders must ensure that future attackers cannot forge a digital signature and implant compromised firmware, or software updates, on pre-quantum devices that are still in use
</li>
</ul>
<p>
For more information on CRQC-related risks, see our <a href="https://bughunters.google.com/blog/5108747984306176/google-s-threat-model-for-post-quantum-cryptography">PQC Threat Model post</a>.
</p>
<h2>How can organizations prepare for PQC migrations?</h2>
<p>
Migrating to new cryptographic algorithms is often a slow process, even when weaknesses affect widely-used crypto systems, because of organizational and logistical challenges in fully completing the transition to new technologies. For example, NIST deprecated SHA-1 hashing algorithms in 2011 and recommends complete phase-out by 2030.
</p>
<p>
That’s why it's crucial to take steps now to improve organizational preparedness, independent of PQC, with the goal of making your transition to PQC easier.
</p>
<p>
These <em>crypto agility</em> best practices can be enacted anytime:
</p>
<ul>
<li><strong>Cryptographic inventory</strong> Understanding where and how organizations are using cryptography includes knowing what cryptographic algorithms are in use, and critically, managing key material safely and securely
<li><strong>Key rotation</strong> Any new cryptographic system will require the ability to generate new keys and move them to production without causing outages. Just like testing recovery from backups, regularly testing key rotation should be part of any good resilience plan
<li><strong>Abstraction layers</strong> You can use a tool like <a href="https://developers.google.com/tink">Tink, Google's multi-language, cross-platform open source library</a>, designed to make it easy for non-specialists to use cryptography safely, and to switch between cryptographic algorithms without extensive code refactoring
<li><strong>End-to-end testing</strong> PQC algorithms have different properties. Notably, public keys, ciphertexts, and signatures are significantly larger. Ensure that all layers of the stack function as expected
</li>
</ul>
<p>
Our <a href="https://www.nature.com/articles/s41586-022-04623-2">2022 paper "Transitioning organizations to post-quantum cryptography"</a> provides additional recommendations to help organizations prepare and this <a href="https://bughunters.google.com/blog/6182336647790592/cryptographic-agility-and-key-rotation">recent post from the Google Security Blog</a> has more detail on cryptographic agility and key rotation.
</p>
<h2>Google's PQC Commitments</h2>
<p>
Google takes these risks seriously, and is taking steps on multiple fronts. Google began <a href="https://security.googleblog.com/2016/07/experimenting-with-post-quantum.html">testing PQC in Chrome in 2016</a> and has been <a href="https://cloud.google.com/blog/products/identity-security/why-google-now-uses-post-quantum-cryptography-for-internal-comms?e=48754805">using PQC to protect internal communications</a> since 2022. In May 2024, <a href="https://blog.chromium.org/2024/05/advancing-our-amazing-bet-on-asymmetric.html">Chrome enabled ML-KEM by default</a> for TLS 1.3 and QUIC on desktop. ML-KEM is also enabled on Google servers. Connections between Chrome Desktop and Google's products, such as Cloud Console or Gmail, are already experimentally protected with post-quantum key exchange.
</p>
<p>
Google engineers have contributed to the standards released by NIST, as well as <a href="https://www.iso.org/standard/80492.html">standards created by ISO</a>, and have submitted Internet Drafts to the IETF for <a href="https://www.google.com/url?q=https://datatracker.ietf.org/doc/draft-davidben-tls-trust-expr/&sa=D&source=docs&ust=1719337176044717&usg=AOvVaw1GculUbK3_3Hgsv6w-VE-q">Trust Expressions</a>, <a href="https://www.google.com/url?q=https://datatracker.ietf.org/doc/draft-davidben-tls-merkle-tree-certs/&sa=D&source=docs&ust=1719337176044781&usg=AOvVaw1S2vxLo4QsJsIuaTIYmUy8">Merkle Tree Certificates</a>, and <a href="https://datatracker.ietf.org/doc/draft-wiggers-hbs-state/">managing state for hash-based signatures</a>. <a href="https://developers.google.com/tink">Tink</a>, Google's open source library that provides secure and easy-to-use cryptographic APIs, already provides experimental PQC algorithms in C++, and our engineers are working with partners to produce formally verified PQC implementations that can be used at Google, and beyond.
</p>
<p>
As we make progress on our own PQC transition, Google will continue to provide PQC updates on Google services, with updates to come from Android, Chrome, Cloud, and others.
</p>Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-53612860621872529062024-08-01T13:08:00.002-04:002024-08-05T15:01:22.359-04:00Keeping your Android device safe from text message fraud<span class="byline-author">Posted by Nataliya Stanetsky and Roger Piqueras Jover, Android Security & Privacy Team</span>
<p>
<a href="https://sls.eff.org/technologies/cell-site-simulators-imsi-catchers">Cell-site simulators</a>, also known as False Base Stations (FBS) or Stingrays, are radio devices that mimic real cell sites in order to lure mobile devices to connect to them. These devices are commonly used for security and privacy attacks, such as <a href="https://fight.mitre.org/techniques/FGT5012">surveillance</a> and <a href="https://capec.mitre.org/data/definitions/609.html">interception of communications</a>. In recent years, carriers have started reporting new types of abuse perpetrated with FBSs for the purposes of financial fraud.
</p>
<p>
In particular, there is increasingly more evidence of the exploitation of weaknesses in cellular communication standards leveraging cell-site simulators to inject SMS phishing messages directly into smartphones. This method to inject messages entirely bypasses the carrier network, thus bypassing all the sophisticated network-based anti-spam and anti-fraud filters. Instances of this new type of fraud, which carriers refer to as SMS Blaster fraud, have been reported in Vietnam, France, Norway, Thailand and multiple other countries.
</p>
<p>
GSMA’s Fraud and Security Group (<a href="https://www.gsma.com/get-involved/working-groups/fraud-security-group">FASG</a>) has developed a briefing paper for GSMA members to raise awareness of SMS Blaster fraud and provide guidelines and mitigation recommendations for carriers, OEMs and other stakeholders. The <a href="https://membergateway.sharepoint.com/sites/wg-FASG-FSAG/SitePages/SMS-Blasters-Briefing-Paper.aspx">briefing paper</a>, available for GSMA members only, calls out some Android-specific recommendations and features that can help effectively protect our users from this new type of fraud.
</p>
<h2>What are SMS Blasters?</h2>
<p>
SMS Blaster is the term that global carriers use to refer to FBS and cell-site simulators operated unlawfully with the goal of disseminating (blast) SMS payloads. The most common use case is to leverage these devices to inject <a href="https://www.trendmicro.com/en_us/what-is/phishing/smishing.html">Smishing</a> (SMS phishing) payloads into user devices. Fraudsters typically do this by driving around with portable FBS devices, and there have even been reports of fraudsters <a href="https://commsrisk.com/bangkok-police-arrest-hong-kong-smishing-scammers-carrying-an-imsi-catcher-backpack-through-shopping-malls/">carrying these devices in their backpacks</a>.
</p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfR73BM7TyPriNjm6LveRbEAUVjqtGAXXP4U2FzpRvk1EA63qxYw5Y3sn750rqlB0VwpvNEy0fqniiDOUjXCHHImFHJzZtWm_TjE3MB7W_ICudUMjRvOjcw0C_Vtixr_DwBPLMfX5FJi-43wSFuvnoHXvmm475X4rFf5UtxDrlcQOHvjNTjqrqv93JpNob/s1600/Artboard%201%[email protected]" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1256" data-original-width="2401" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfR73BM7TyPriNjm6LveRbEAUVjqtGAXXP4U2FzpRvk1EA63qxYw5Y3sn750rqlB0VwpvNEy0fqniiDOUjXCHHImFHJzZtWm_TjE3MB7W_ICudUMjRvOjcw0C_Vtixr_DwBPLMfX5FJi-43wSFuvnoHXvmm475X4rFf5UtxDrlcQOHvjNTjqrqv93JpNob/s1600/Artboard%201%[email protected]"/></a></div>
The method is straightforward and replicates known techniques to trick mobile devices to an attacker-controlled 2G network. SMS Blasters expose a fake LTE or 5G network which executes a single function: downgrading the user’s connection to a legacy 2G protocol. The same device also exposes a fake 2G network, which lures all the devices to connect to it. At this point, attackers abuse the well known <a href="https://fahrplan.events.ccc.de/congress/2010/Fahrplan/attachments/1783_101228.27C3.GSM-Sniffing.Nohl_Munaut.pdf">lack of mutual authentication in 2G</a> and force connections to be unencrypted, which enables a complete Person-in-the-Middle (PitM) position to inject SMS payloads.
</p>
<p>
SMS Blasters are sold on the internet and do not require deep technical expertise. They are simple to set up and ready to operate, and users can easily configure them to imitate a particular carrier or network using a mobile app. Users can also easily configure and customize the SMS payload as well as its metadata, including for example the sender number.
</p>
<p>
SMS Blasters are very appealing to fraudsters given their great return on investment. Spreading SMS phishing messages commonly yields a small return as it is very difficult to get these messages to fly undetected by sophisticated anti-spam filters. A very small subset of messages eventually reach a victim. In contrast, injecting messages with an SMS blaster entirely bypasses the carrier network and its anti-fraud and anti-spam filters, guaranteeing that all messages will reach a victim. Moreover, using an FBS the fraudster can control all fields of the message. One can make the message look like it is coming from the legitimate SMS aggregator of a bank, for example. In a recent attack that impacted hundreds of thousands of devices, the <a href="https://commsrisk.com/paris-imsi-catcher-mistaken-for-bomb-was-actually-used-for-health-insurance-sms-phishing-scam/">messages masqueraded as a health insurance notice</a>.
</p>
<p>
Although the type of abuse carriers are uncovering recently is financial fraud, there is precedent for the use of rogue cellular base stations to disseminate malware, <a href="https://www.cnet.com/news/privacy/chinese-trojan-detected-spreading-through-fake-base-stations/">for example injecting phishing messages with a url to download the payload</a>. It is important to note that users are still vulnerable to this type of fraud as long as mobile devices support 2G, <a href="https://security.googleblog.com/2023/08/android-14-introduces-first-of-its-kind.html">regardless of the status of 2G in their local carrier</a>.
</p>
<h2>Android protects users from phishing and fraud</h2>
<p>
There are a number of Android-only security features that can significantly mitigate, or in some cases fully block, the impact of this type of fraud.
</p>
<p>
Android 12 introduced a user option to <a href="https://source.android.com/docs/setup/about/android-12-release#2g-toggle">disable 2G</a> at the modem level, a feature <a href="https://security.googleblog.com/2021/10/pixel-6-setting-new-standard-for-mobile.html">first adopted by Pixel</a>. This option, if used, completely mitigates the risk from SMS Blasters. This feature has been available since Android 12 and requires devices to conform to Radio HAL 1.6+.
</p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3_dR8TI2qfFUh0l4JNScxbSINRIdE0pGvWOfviDTszhVXsYz_vWUsVYhPKFMSzGTFgSfof9noUI8FEQOB2UxHyxxegHMQH-UieKoAw7TqNKvvgcfh8jaaCDmb9HgbUEXyBjXgw_wp7jSjWR32eQdQNq-izO1BlVHhf2fG8AExf_-bjwh0HTxakXJqtNdL/s1600/Artboard%201%20copy%[email protected]" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1256" data-original-width="2401" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3_dR8TI2qfFUh0l4JNScxbSINRIdE0pGvWOfviDTszhVXsYz_vWUsVYhPKFMSzGTFgSfof9noUI8FEQOB2UxHyxxegHMQH-UieKoAw7TqNKvvgcfh8jaaCDmb9HgbUEXyBjXgw_wp7jSjWR32eQdQNq-izO1BlVHhf2fG8AExf_-bjwh0HTxakXJqtNdL/s1600/Artboard%201%20copy%[email protected]"/></a></div>
<a href="https://source.android.com/docs/whatsnew/android-14-release#disable-null-ciphers">Android also has an option to disable null ciphers</a> as a key protection because it is strictly necessary for the 2G FBS to configure a <a href="https://www.gsma.com/security/wp-content/uploads/2022/09/FS.35-v3.0.pdf">null cipher</a> (e.g. <a href="https://www.gsma.com/security/wp-content/uploads/2022/09/FS.35-v3.0.pdf">A5/0</a>) in order to inject an SMS payload. This security feature launched with Android 14 requires devices that implement radio HAL 2.0 or above.
</p>
<p>
Android also provides effective protections that specifically tackles SMS spam and phishing, regardless of whether the delivery channel is an SMS Blaster. Android has <a href="https://blog.google/products/android/android-scam-and-phishing-protection/">built-in spam protection</a> that helps to identify and block spam SMS messages. Additional protection is provided through <a href="https://developers.google.com/business-communications/rcs-business-messaging">RCS for Business</a>, a feature that helps users identify legitimate SMS messages from businesses. RCS for Business messages are marked with a blue checkmark, which indicates that the message has been verified by Google.
</p>
<p>
We advocate leveraging a couple of important Google security features which are available on Android, namely Safe Browsing and Google Play Protect. As an additional layer of protection, <a href="https://safebrowsing.google.com/">Safe Browsing</a> built-in on Android devices protects 5 billion devices globally and helps warn the users about potentially risky sites, downloads and extensions which could be phishing and malware-based.
</p>
<p>
Let’s say a user decides to download an app from the Play store but the app contains code that is malicious or harmful, users are protected by <a href="https://support.google.com/googleplay/answer/2812853?hl=en">Google Play Protect</a> which is a security feature that scans apps for malware and other threats. It also warns users about potentially harmful apps before they are installed.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzSpOwlK5QEeaIvWgrMNeJMX1w5EWXYkCvIiYi1hi48cg2Vpm5zNpEZmpgdEQAHU1soEVunyacjjPmAaTpmFAnCs9x2UrnLvFaXppYg9bckez-oPbsn3GWXkyVHD-vtvP3e-ADMvndFVVDRyYkTTcxue3rmtl4-x_dYZG6zJsrY71nfxSYWtKB3vMVJ1l5/s1600/Artboard%[email protected]" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="1256" data-original-width="2400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzSpOwlK5QEeaIvWgrMNeJMX1w5EWXYkCvIiYi1hi48cg2Vpm5zNpEZmpgdEQAHU1soEVunyacjjPmAaTpmFAnCs9x2UrnLvFaXppYg9bckez-oPbsn3GWXkyVHD-vtvP3e-ADMvndFVVDRyYkTTcxue3rmtl4-x_dYZG6zJsrY71nfxSYWtKB3vMVJ1l5/s1600/Artboard%[email protected]"/></a></div>
<h2>Android’s commitment to security and privacy</h2>
<p>
Android is committed to providing users with a safe and secure mobile experience. We are constantly working to improve our security features and protect users from phishing, fraud, and other threats.
</p>
<p>
Working with global carriers and other OEMs through the GSMA to support the ecosystem in the development and adoption of further cellular security and privacy features is a priority area for Android. We look forward to partnering with ecosystem partners in further raising the security bar in this space to protect mobile users from threats like SMS blasters.
</p>
<p>
<em>Thank you to all our colleagues who actively contribute to Android’s efforts in tackling fraud and FBS threats, and special thanks to those who contributed to this blog post: Yomna Nasser, Gil Cukierman, Il-Sung Lee, Eugene Liderman, Siddarth Pandit.</em>
</p>
Edward Fernandezhttp://www.blogger.com/profile/03784424747198152685[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-24689644867235652802024-07-30T13:01:00.002-04:002024-07-30T13:02:03.926-04:00Improving the security of Chrome cookies on Windows<span class="byline-author">Posted by Will Harris, Chrome Security Team</span>
<p>
Cybercriminals using cookie theft <a href="https://cloud.google.com/blog/products/identity-security/a-year-in-the-cybersecurity-trenches-with-mandiant-managed-defense">infostealer</a> malware continue to pose a risk to the safety and security of our users. We already have a number of initiatives in this area including <a href="https://security.googleblog.com/2024/07/building-security-into-redesigned.html">Chrome’s download protection</a> using Safe Browsing, <a href="https://blog.chromium.org/2024/04/fighting-cookie-theft-using-device.html">Device Bound Session Credentials</a>, and Google’s account-based threat detection to flag the use of stolen cookies. Today, we’re announcing another layer of protection to make Windows users safer from this type of malware.
</p>
<p>
Like other software that needs to store secrets, Chrome currently secures sensitive data like cookies and passwords using the strongest techniques the OS makes available to us - on macOS this is the <a href="https://developer.apple.com/documentation/security/keychain_services/">Keychain services</a>, and on Linux we use a system provided wallet such as kwallet or gnome-libsecret. On Windows, Chrome uses the Data Protection API (DPAPI) which protects the data at rest from other users on the system or cold boot attacks. However, the DPAPI does not protect against malicious applications able to execute code as the logged in user - which infostealers take advantage of.
</p>
<p>
In Chrome 127 we are introducing a new protection on Windows that improves on the DPAPI by providing <strong>Application-Bound (App-Bound) </strong>Encryption primitives. Rather than allowing any app running as the logged in user to access this data, Chrome can now encrypt data tied to app identity, similar to how the Keychain operates on macOS.
</p>
<p>
We will be migrating each type of secret to this new system starting with cookies in Chrome 127. In future releases we intend to expand this protection to passwords, payment data, and other persistent authentication tokens, further protecting users from infostealer malware.
</p>
<p>
<strong>How it works</strong>
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpjkAClX2VvgsIhLi2zAmvRwVMPEeJqUhqisKHIKxbfGAwh8p8-V7Ixct5azzn_jYfJYo2izWnGcbkVh3cabbCLVQQQsJAJagvFPCFJsx4MibauJqnLVymQYdhdGGc53q3wSJSeTPQ6vyxXosJ-tJRKuaaoV7_J_E2KB9glSZ1m3NSEwEBj-duevgROHlM/s1416/Screenshot%202024-07-26%202.15.06%20PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="919" data-original-width="1416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpjkAClX2VvgsIhLi2zAmvRwVMPEeJqUhqisKHIKxbfGAwh8p8-V7Ixct5azzn_jYfJYo2izWnGcbkVh3cabbCLVQQQsJAJagvFPCFJsx4MibauJqnLVymQYdhdGGc53q3wSJSeTPQ6vyxXosJ-tJRKuaaoV7_J_E2KB9glSZ1m3NSEwEBj-duevgROHlM/s16000/Screenshot%202024-07-26%202.15.06%20PM.png" /></a></div><p>
App-Bound Encryption relies on a privileged service to verify the identity of the requesting application. During encryption, the App-Bound Encryption service encodes the app's identity into the encrypted data, and then verifies this is valid when decryption is attempted. If another app on the system tries to decrypt the same data, it will fail.
</p>
<p>
Because the App-Bound service is running with system privileges, attackers need to do more than just coax a user into running a malicious app. Now, the malware has to gain system privileges, or inject code into Chrome, something that legitimate software shouldn't be doing. This makes their actions more suspicious to antivirus software – and more likely to be detected. Our other recent initiatives such as providing <a href="https://security.googleblog.com/2024/04/detecting-browser-data-theft-using.html">event logs</a> for cookie decryption work in tandem with this protection, with the goal of further increasing the cost and risk of detection to attackers attempting to steal user data.
</p>
<p>
<strong>Enterprise Considerations</strong>
</p>
<p>
Since malware can bypass this protection by running elevated, enterprise environments that do not grant their users the ability to run downloaded files as Administrator are particularly helped by this protection - malware cannot simply request elevation privilege in these environments and is forced to use techniques such as injection that can be more easily detected by endpoint agents.
</p>
<p>
App-Bound Encryption strongly binds the encryption key to the machine, so will not function correctly in environments where Chrome profiles roam between multiple machines. We encourage enterprises who wish to support roaming profiles to follow current <a href="https://support.google.com/chrome/a/answer/7349337">best practices</a>. If it becomes necessary, App-Bound encryption can be configured using the new <a href="https://chromeenterprise.google/policies/#ApplicationBoundEncryptionEnabled">ApplicationBoundEncryptionEnabled</a> policy.
</p>
<p>
To further help detect any incompatibilities, Chrome emits an event when a failed verification occurs. The Event is ID 257 from 'Chrome' source in the Application log.
</p>
<p>
<strong>Conclusion</strong>
</p>
<p>
App-Bound Encryption increases the cost of data theft to attackers and also makes their actions far noisier on the system. It helps defenders draw a clear line in the sand for what is acceptable behavior for other apps on the system. As the malware landscape continually evolves we are keen to continue engaging with others in the security community on improving detections and strengthening operating system protections, such as stronger app isolation primitives, for any bypasses.
</p>Googlehttp://www.blogger.com/profile/11822708545141062574[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-42830114723124030292024-07-24T12:00:00.002-04:002024-07-24T12:01:36.224-04:00Building security into the redesigned Chrome downloads experience<span class="byline-author">Posted by Jasika Bawa, Lily Chen, and Daniel Rubery, Chrome Security</span>
<p>
Last year, we introduced a <a href="https://blog.chromium.org/2023/08/redesigning-chrome-downloads-to-keep.html">redesign</a> of the Chrome downloads experience on desktop to make it easier for users to interact with recent downloads. At the time, we mentioned that the additional space and more flexible UI of the new Chrome downloads experience would give us new opportunities to make sure users stay safe when downloading files.
</p>
<p>
<strong>Adding context and consistency to download warnings</strong>
</p>
<p>
The redesigned Chrome downloads experience gives us the opportunity to provide even more context when Chrome protects a user from a <a href="https://support.google.com/chrome/answer/6261569">potentially malicious file</a>. Taking advantage of the additional space available in the new downloads UI, we have replaced our previous warning messages with more detailed ones that convey more nuance about the nature of the danger and can help users make more informed decisions.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3gQhfi9Adg__U7OfrbECy8i7-lZIrptsdyyahf0H2Ky5geMifkcYWAxdmNifsoRZiXn4uN5Ybgq2ycO0ZGEmajqLYEjRb5fH52Mw9-swQCxJ5cv67zEt133yYJh651bS5YpUDG9LcAyC5PwG-ZvL1fO2tFXwS91Q5c9V20ms70V6DWe1TJamrZc-NmTid/s2000/RedesignedWarning_inline_7.10.24_V3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1074" data-original-width="2000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3gQhfi9Adg__U7OfrbECy8i7-lZIrptsdyyahf0H2Ky5geMifkcYWAxdmNifsoRZiXn4uN5Ybgq2ycO0ZGEmajqLYEjRb5fH52Mw9-swQCxJ5cv67zEt133yYJh651bS5YpUDG9LcAyC5PwG-ZvL1fO2tFXwS91Q5c9V20ms70V6DWe1TJamrZc-NmTid/s16000/RedesignedWarning_inline_7.10.24_V3.png" /></a></div><p style="text-align: center;">
<em>Our legacy, space-constrained warning vs. our redesigned one</em>
</p>
<p style="text-align: left;">
We also made download warnings more understandable by introducing a two-tier download warning taxonomy based on AI-powered malware verdicts from <a href="https://safebrowsing.google.com/">Google Safe Browsing</a>. These are:
</p>
<ol>
<li>Suspicious files (lower confidence verdict, unknown risk of user harm)
</li><li>Dangerous files (high confidence verdict, high risk of user harm)
</li>
</ol>
<p>
These two tiers of warnings are distinguished by iconography, color, and text, to make it easy for users to quickly and confidently make the best choice for themselves based on the nature of the danger and Safe Browsing's level of certainty. Overall, these improvements in clarity and consistency have resulted in significant changes in user behavior, including fewer warnings bypassed, warnings heeded more quickly, and all in all, better protection from malicious downloads.
</p><p style="text-align: center;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPtYz0ba59W8_Orn_Q_viwJ_brTwqLTlZeGwUPAO0IRmuyKWSv4Fxr6Fb34UfBJzHAT0Ydok7JdnPb26t7GxRQD3whlixXbqzrfuFlKYs8DsuH1_Zd3QieU1-RyrGODIrWzJavG-PH0uBchqOFTT51Wgea8uLxTFD_2XHIBy3Vmw77nOmbOIbuqmNq4jOC/s1080/SuspiciousAndDangerous_inline_V2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPtYz0ba59W8_Orn_Q_viwJ_brTwqLTlZeGwUPAO0IRmuyKWSv4Fxr6Fb34UfBJzHAT0Ydok7JdnPb26t7GxRQD3whlixXbqzrfuFlKYs8DsuH1_Zd3QieU1-RyrGODIrWzJavG-PH0uBchqOFTT51Wgea8uLxTFD_2XHIBy3Vmw77nOmbOIbuqmNq4jOC/s16000/SuspiciousAndDangerous_inline_V2.png" /></a></div><p></p><p style="text-align: center;">
<em>Differentiation between suspicious and dangerous warnings</em>
</p>
<p style="text-align: left;">
<strong>Protecting more downloads with automatic deep scans</strong>
</p>
<p>
Users who have opted-in to the <a href="https://support.google.com/chrome/answer/9890866">Enhanced Protection</a> mode of Safe Browsing in Chrome are prompted to send the contents of suspicious files to Safe Browsing for deep scanning before opening the file. Suspicious files are a small fraction of overall downloads, and file contents are only scanned for security purposes and are deleted shortly after a verdict is returned.
</p>
<p>
We've found these additional scans to have been extraordinarily successful – they help catch brand new malware that Safe Browsing has not seen before and dangerous files hosted on brand new sites. In fact, <strong>files sent for deep scanning are over 50x more likely to be flagged as malware</strong> than downloads in the aggregate.
</p>
<p>
Since Enhanced Protection users have already agreed to send a small fraction of their downloads to Safe Browsing for security purposes in order to benefit from additional protections, we recently moved towards automatic deep scans for these users rather than prompting each time. This will protect users from risky downloads while reducing user friction.
</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYi1YW6gCA9xGgTp67Z7QVvH6guYbAVN6HUl1XrOxAYHS308MtmpVddM83GMVWa8OUtctfL5HA0gMopBIgw8qNX3OXD6j_8HWKYyfzy0nwhFYxvhiJIsx3W251jg8Jnv2Wx4_X3WuNO5YNnJbxU52ru8maUatuULjEGYBNqR0fuJp181b9Gje9tllPDROo/s1080/Chrome_Auto-Scan-Block_Inline_V1.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYi1YW6gCA9xGgTp67Z7QVvH6guYbAVN6HUl1XrOxAYHS308MtmpVddM83GMVWa8OUtctfL5HA0gMopBIgw8qNX3OXD6j_8HWKYyfzy0nwhFYxvhiJIsx3W251jg8Jnv2Wx4_X3WuNO5YNnJbxU52ru8maUatuULjEGYBNqR0fuJp181b9Gje9tllPDROo/s16000/Chrome_Auto-Scan-Block_Inline_V1.gif" /></a></div><p></p><p style="text-align: center;">
<em>An automatic deep scan resulting in a warning</em>
</p>
<p style="text-align: left;">
<strong>Staying ahead of attackers who hide in encrypted archives</strong>
</p>
<p>
Not all deep scans can be conducted automatically. A current trend in <a href="https://blog.google/threat-analysis-group/phishing-campaign-targets-youtube-creators-cookie-theft-malware/">cookie theft</a> malware distribution is packaging malicious software in an encrypted archive – a .zip, .7z, or .rar file, protected by a password – which hides file contents from Safe Browsing and other antivirus detection scans. In order to combat this evasion technique, we have introduced two protection mechanisms depending on the mode of Safe Browsing selected by the user in Chrome.
</p>
<p>
Attackers often make the passwords to encrypted archives available in places like the page from which the file was downloaded, or in the download file name. For Enhanced Protection users, downloads of suspicious encrypted archives will now prompt the user to enter the file's password and send it along with the file to Safe Browsing so that the file can be opened and a deep scan may be performed. Uploaded files and file passwords are deleted a short time after they're scanned, and all collected data is only used by Safe Browsing to provide better download protections.
</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeWn18o6NDzNv7ILTz4Hv-U-4kH-WUx8goTr_8HavUJIn_f3vW9DKGJYxd0rmElQdxeYFp6bPmHU3XJkGnZUToAsdkSE_i_xjv7d4CEzR-7crVH3z2jLtOynwIeJYXBbddPfas_-rfSS3R-sbAZkpR3zQyCAiBCpXB4xzc7CUuyPkDRPdlx8lCtAIa5m2_/s1080/FilePassword_inline_Option%2003%20(More%20cropped%20in).png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeWn18o6NDzNv7ILTz4Hv-U-4kH-WUx8goTr_8HavUJIn_f3vW9DKGJYxd0rmElQdxeYFp6bPmHU3XJkGnZUToAsdkSE_i_xjv7d4CEzR-7crVH3z2jLtOynwIeJYXBbddPfas_-rfSS3R-sbAZkpR3zQyCAiBCpXB4xzc7CUuyPkDRPdlx8lCtAIa5m2_/s16000/FilePassword_inline_Option%2003%20(More%20cropped%20in).png" /></a></div><p></p><p style="text-align: center;">
<em>Enter a file password to send an encrypted file for a malware scan</em>
</p>
<p style="text-align: left;">
For those who use Standard Protection mode which is the default in Chrome, we still wanted to be able to provide some level of protection. In Standard Protection mode, downloading a suspicious encrypted archive will also trigger a prompt to enter the file's password, but in this case, both the file and the password stay on the local device and only the metadata of the archive contents are checked with Safe Browsing. As such, in this mode, users are still protected as long as Safe Browsing had previously seen and categorized the malware.
</p>
<p>
The Chrome Security team works closely with Safe Browsing, Google's <a href="https://blog.google/threat-analysis-group/">Threat Analysis Group</a>, and security researchers from around the world to gain insights into the techniques attackers are using. Using these insights, we are constantly adapting our product strategy to stay ahead of attackers and to keep users safe while downloading files in Chrome. We look forward to sharing more in the future!
</p>
Googlehttp://www.blogger.com/profile/11822708545141062574[email protected]0tag:blogger.com,1999:blog-1176949257541686127.post-63485837834039547492024-06-27T13:16:00.003-04:002024-09-10T17:20:24.924-04:00Sustaining Digital Certificate Security - Entrust Certificate Distrust<span class="byline-author">Posted by Chrome Root Program, Chrome Security Team</span>
<p>
<em><b>Update (09/10/2024): </b>In support of more closely aligning Chrome’s planned compliance action with a major release milestone (i.e., M131), blocking action will now begin on November 12, 2024. This post has been updated to reflect the date change. Website operators who will be impacted by the upcoming change can explore continuity options offered by Entrust. Entrust has expressed its commitment to continuing to support customer needs, and is best positioned to describe the available options for website operators. Learn more at Entrust’s <a href="https://www.entrust.com/tls-certificate-information-center">TLS Certificate Information Center</a>.</em>
</p>
<style>
.code {
font-family: "Courier New", Courier, monospace;
font-size: 11.8px;
font-weight: bold;
background-color: #f4f4f4;
padding: 10px;
border: 1px solid #ccc;
border-radius: 2px;
white-space: pre-wrap;
display: inline-block;
line-height: 12px;
}
.highlight {
color: red;
}
</style>
<p>
The Chrome Security Team prioritizes the security and privacy of Chrome’s users, and we are unwilling to compromise on these values.
</p>
<p>
The <a href="https://www.chromium.org/Home/chromium-security/root-ca-policy/">Chrome Root Program Policy</a> states that CA certificates included in the <a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/root_store.md">Chrome Root Store</a> must provide value to Chrome end users that exceeds the risk of their continued inclusion. It also describes many of the <a href="https://www.chromium.org/Home/chromium-security/root-ca-policy/#7-reporting-and-responding-to-incidents">factors</a> we consider significant when CA Owners disclose and respond to incidents. When things don’t go right, we expect CA Owners to commit to meaningful and demonstrable change resulting in evidenced continuous improvement.
</p>
<p>
Over the past several years, publicly disclosed <a href="https://bugzilla.mozilla.org/buglist.cgi?o2=greaterthaneq&short_desc_type=casesubstring&o1=notequals&v1=Graveyard&classification=Client%20Software&classification=Developer%20Infrastructure&classification=Components&classification=Server%20Software&classification=Other&classification=Graveyard&v2=2015-11-01&f1=classification&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&short_desc=Entrust&f2=creation_ts&component=CA%20Certificate%20Compliance&query_format=advanced&list_id=17064895">incident reports</a> highlighted a pattern of concerning behaviors by Entrust that fall short of the above expectations, and has eroded confidence in their competence, reliability, and integrity as a publicly-trusted CA Owner.
</p>
<p>
In response to the above concerns and to preserve the integrity of the <a href="https://security.googleblog.com/2023/05/how-chrome-root-program-keeps-users-safe.html#:~:text=Chrome%20uses%20digital,the%20%E2%80%9CWeb%20PKI.%E2%80%9D">Web PKI</a> ecosystem, Chrome will take the following actions.
</p>
<p>
<span style="text-decoration: underline;">Upcoming change in Chrome 131 and higher:</span>
</p>
<ul style="text-align: left;">
<li>TLS server authentication certificates validating to the following Entrust roots whose <em>earliest</em> Signed Certificate Timestamp (SCT) is dated <span style="text-decoration: underline;">after</span> <strong>November 11, 2024 (11:59:59 PM UTC),</strong> will no longer be trusted by default.
<ul>
<li><a href="https://crt.sh/?q=02ED0EB28C14DA45165C566791700D6451D7FB56F0B2AB1D3B8EB070E56EDFF5">CN=Entrust Root Certification Authority - EC1,OU=See www.entrust.net/legal-terms+OU=(c) 2012 Entrust, Inc. - for authorized use only,O=Entrust, Inc.,C=US</a>
</li><li><a href="https://crt.sh/?q=43DF5774B03E7FEF5FE40D931A7BEDF1BB2E6B42738C4E6D3841103D3AA7F339">CN=Entrust Root Certification Authority - G2,OU=See www.entrust.net/legal-terms+OU=(c) 2009 Entrust, Inc. - for authorized use only,O=Entrust, Inc.,C=US</a>
</li><li><a href="https://crt.sh/?q=6DC47172E01CBCB0BF62580D895FE2B8AC9AD4F873801E0C10B9C837D21EB177">CN=Entrust.net Certification Authority (2048),OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)+OU=(c) 1999 Entrust.net Limited,O=Entrust.net</a>
</li><li><a href="https://crt.sh/?q=73C176434F1BC6D5ADF45B0E76E727287C8DE57616C1E6E6141A2B2CBC7D8E4C">CN=Entrust Root Certification Authority,OU=www.entrust.net/CPS is incorporated by reference+OU=(c) 2006 Entrust, Inc.,O=Entrust, Inc.,C=US</a>
</li><li><a href="https://crt.sh/?q=DB3517D1F6732A2D5AB97C533EC70779EE3270A62FB4AC4238372460E6F01E88">CN=Entrust Root Certification Authority - G4,OU=See www.entrust.net/legal-terms+OU=(c) 2015 Entrust, Inc. - for authorized use only,O=Entrust, Inc.,C=US</a>
</li><li><a href="https://crt.sh/?q=0376AB1D54C5F9803CE4B2E201A0EE7EEF7B57B636E8A93C9B8D4860C96F5FA7">CN=AffirmTrust Commercial,O=AffirmTrust,C=US</a>
</li><li><a href="https://crt.sh/?q=0A81EC5A929777F145904AF38D5D509F66B5E2C58FCDB531058B0E17F3F0B41B">CN=AffirmTrust Networking,O=AffirmTrust,C=US</a>
</li><li><a href="https://crt.sh/?q=70A73F7F376B60074248904534B11482D5BF0E698ECC498DF52577EBF2E93B9A">CN=AffirmTrust Premium,O=AffirmTrust,C=US</a>
</li><li><a href="https://crt.sh/?q=BD71FDF6DA97E4CF62D1647ADD2581B07D79ADF8397EB4ECBA9C5E8488821423">CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US</a>
</li></ul></li><li>TLS server authentication certificates validating to the above set of roots whose <em>earliest</em> SCT is <span style="text-decoration-line: underline;">on or before</span> <strong>November 11, 2024 (11:59:59 PM UTC),</strong> will be unaffected by this change.</li></ul>This approach attempts to minimize disruption to existing subscribers using a recently announced Chrome <a href="https://source.chromium.org/chromium/chromium/src/+/main:net/cert/root_store.proto;drc=a783c3bab474ff68e675e2753f91c92ca817e072;l=15?q=f:root_store.proto&ss=chromium">feature</a> to remove default trust based on the SCTs in certificates.<br />
<p>
Additionally, should a Chrome user or enterprise <a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/faq.md#Does-the-Chrome-Certificate-Verifier-consider-local-trust-decisions">explicitly trust</a> any of the above certificates on a platform and version of Chrome <a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/faq.md#when-did-these-features-land">relying</a> on the <a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/root_store.md">Chrome Root Store</a> (e.g., explicit trust is conveyed through a Group Policy Object on Windows), the SCT-based constraints described above will be overridden and certificates will function as they do today.
</p>
<p>
To further minimize risk of disruption, website operators are encouraged to review the “Frequently Asked Questions" listed below.
</p>
<h3><strong>Why is Chrome taking action?</strong></h3>
<p>
Certification Authorities (CAs) serve a privileged and trusted role on the Internet that underpin encrypted connections between browsers and websites. With this tremendous responsibility comes an expectation of adhering to reasonable and consensus-driven security and compliance expectations, including those defined by the CA/Browser TLS Baseline Requirements.
</p>
<p>
Over the past six years, we have observed a pattern of compliance failures, unmet improvement commitments, and the absence of tangible, measurable progress in response to publicly disclosed incident reports. When these factors are considered in aggregate and considered against the inherent risk each publicly-trusted CA poses to the Internet ecosystem, it is our opinion that Chrome’s continued trust in Entrust is no longer justified.
</p>
<h3><strong>When will this action happen?</strong></h3>
<p>
Blocking action will begin on approximately November 12, 2024, affecting certificates issued at that point or later.
</p>
<p>
Blocking action will occur in Versions of <a href="https://chromiumdash.appspot.com/schedule">Chrome 131</a> and greater on Windows, macOS, ChromeOS, Android, and Linux. Apple policies prevent the Chrome Certificate Verifier and corresponding Chrome Root Store from being used on Chrome for iOS.
</p>
<h3><strong>What is the user impact of this action?</strong></h3>
<p>
By default, Chrome users in the above populations who navigate to a website serving a certificate issued by Entrust or AffirmTrust after November 11, 2024 (11:59:59 PM UTC) will see a full page interstitial <a href="https://untrusted-root.badssl.com/">similar to this one</a>.
</p>
<p>
Certificates issued by other CAs are not impacted by this action.
</p>
<h3><strong>How can a website operator tell if their website is affected?</strong></h3>
<p>
Website operators can determine if they are affected by this issue by using the Chrome Certificate Viewer.
</p>
<p>
<span style="text-decoration: underline;">Use the Chrome Certificate Viewer</span>
</p>
<ul>
<li>Navigate to a website (e.g., <a href="https://www.google.com">https://www.google.com</a>)
</li><li>Click the “Tune" icon
</li><li>Click “Connection is Secure"
</li><li>Click “Certificate is Valid" (the Chrome Certificate Viewer will open)
<ul>
<li><strong>Website owner action is <span style="text-decoration: underline;">not</span> required</strong>, if the “Organization (O)” field listed beneath the “Issued By" heading <span style="text-decoration: underline;">does not</span> contain “Entrust" or “AffirmTrust”.
</li><li><strong>Website owner action is required</strong>, if the “Organization (O)” field listed beneath the “Issued By" heading contains “Entrust" or “AffirmTrust”.
</li>
</ul>
</li>
</ul>
<h3><strong>What does an affected website operator do?</strong></h3>
<p>
We recommend that affected website operators transition to a new publicly-trusted CA Owner as soon as reasonably possible. To avoid adverse website user impact, action <strong>must</strong> be completed <span style="text-decoration: underline;">before</span> the existing certificate(s) expire if expiry is planned to take place <span style="text-decoration: underline;">after</span> November 11, 2024 (11:59:59 PM UTC).
</p>
<p>
While website operators could delay the impact of blocking action by choosing to collect and install a new TLS certificate issued from Entrust before Chrome’s blocking action begins on November 12, 2024, website operators will inevitably need to collect and install a new TLS certificate from one of the many other CAs included in the <a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/root_store.md">Chrome Root Store</a>.
</p>
<h3><strong>Can I test these changes before they take effect?</strong></h3>
<p>
Yes.
</p>
<p>
A command-line flag was added beginning in Chrome 128 (available in Canary/Dev at the time of this post’s publication) that allows administrators and power users to simulate the effect of an SCTNotAfter distrust constraint as described in this blog post FAQ.
</p>
<p>
<span style="text-decoration: underline;">How to: Simulate an SCTNotAfter distrust</span></p><p>1. Close all open versions of Chrome</p><p>2. Start Chrome using the following command-line flag, substituting variables described below with actual values</p>
<div class="code">
--test-crs-constraints=$[Comma Separated List of Trust Anchor Certificate SHA256 Hashes]:sctnotafter=$[epoch_timestamp]
</div><p>
</p><p>3. Evaluate the effects of the flag with test websites </p><p><b>Example:</b> The following command will simulate an SCTNotAfter distrust with an effective date of April 30, 2024 11:59:59 PM GMT for all of the Entrust trust anchors included in the Chrome Root Store. The expected behavior is that any website whose certificate is issued before the enforcement date/timestamp will function in Chrome, and all issued after will display an interstitial.</p><p>
</p><div class="code">
--test-crs-constraints=02ED0EB28C14DA45165C566791700D6451D7FB56F0B2AB1D3B8EB070E56EDFF5,
43DF5774B03E7FEF5FE40D931A7BEDF1BB2E6B42738C4E6D3841103D3AA7F339,
6DC47172E01CBCB0BF62580D895FE2B8AC9AD4F873801E0C10B9C837D21EB177,
73C176434F1BC6D5ADF45B0E76E727287C8DE57616C1E6E6141A2B2CBC7D8E4C,
DB3517D1F6732A2D5AB97C533EC70779EE3270A62FB4AC4238372460E6F01E88,
0376AB1D54C5F9803CE4B2E201A0EE7EEF7B57B636E8A93C9B8D4860C96F5FA7,
0A81EC5A929777F145904AF38D5D509F66B5E2C58FCDB531058B0E17F3F0B41B,
70A73F7F376B60074248904534B11482D5BF0E698ECC498DF52577EBF2E93B9A,
BD71FDF6DA97E4CF62D1647ADD2581B07D79ADF8397EB4ECBA9C5E8488821423
:sctnotafter=1714521599
</div>
<p><strong>Illustrative Command (on Windows):</strong>
</p><div class="code">
"C:\Users\User123\AppData\Local\Google\Chrome SxS\Application\chrome.exe" --test-crs-constraints=02ED0EB28C14DA45165C566791700D6451D7FB56F0B2AB1D3B8EB070E56EDFF5,43DF5774B03E7FEF5FE40D931A7BEDF1BB2E6B42738C4E6D3841103D3AA7F339,6DC47172E01CBCB0BF62580D895FE2B8AC9AD4F873801E0C10B9C837D21EB177,73C176434F1BC6D5ADF45B0E76E727287C8DE57616C1E6E6141A2B2CBC7D8E4C,DB3517D1F6732A2D5AB97C533EC70779EE3270A62FB4AC4238372460E6F01E88,0376AB1D54C5F9803CE4B2E201A0EE7EEF7B57B636E8A93C9B8D4860C96F5FA7,0A81EC5A929777F145904AF38D5D509F66B5E2C58FCDB531058B0E17F3F0B41B,70A73F7F376B60074248904534B11482D5BF0E698ECC498DF52577EBF2E93B9A,BD71FDF6DA97E4CF62D1647ADD2581B07D79ADF8397EB4ECBA9C5E8488821423:sctnotafter=1714521599
</div><p><strong>Illustrative Command (on macOS):</strong>
</p><div class="code">
"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary" --test-crs-constraints=02ED0EB28C14DA45165C566791700D6451D7FB56F0B2AB1D3B8EB070E56EDFF5,43DF5774B03E7FEF5FE40D931A7BEDF1BB2E6B42738C4E6D3841103D3AA7F339,6DC47172E01CBCB0BF62580D895FE2B8AC9AD4F873801E0C10B9C837D21EB177,73C176434F1BC6D5ADF45B0E76E727287C8DE57616C1E6E6141A2B2CBC7D8E4C,DB3517D1F6732A2D5AB97C533EC70779EE3270A62FB4AC4238372460E6F01E88,0376AB1D54C5F9803CE4B2E201A0EE7EEF7B57B636E8A93C9B8D4860C96F5FA7,0A81EC5A929777F145904AF38D5D509F66B5E2C58FCDB531058B0E17F3F0B41B,70A73F7F376B60074248904534B11482D5BF0E698ECC498DF52577EBF2E93B9A,BD71FDF6DA97E4CF62D1647ADD2581B07D79ADF8397EB4ECBA9C5E8488821423:sctnotafter=1714521599
</div><p><strong>Note: </strong>If copy and pasting the above commands, ensure no line-breaks are introduced.
</p><p>
Learn more about command-line flags <a href="https://developer.chrome.com/docs/web-platform/chrome-flags#command-line_flags">here</a>.
</p><h3><strong>I use Entrust certificates for my internal enterprise network, do I need to do anything?</strong></h3><p>
Beginning in Chrome 127, enterprises can override Chrome Root Store constraints like those described for Entrust in this blog post by installing the corresponding root CA certificate as a <a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/faq.md#Does-the-Chrome-Certificate-Verifier-consider-local-trust-decisions">locally-trusted root</a> on the platform Chrome is running (e.g., installed in the Microsoft Certificate Store as a Trusted Root CA).
</p><h3><strong>How do enterprises add a CA as locally-trusted?</strong></h3><p>
Customer organizations should defer to platform provider guidance.
</p><h3><strong>What about other Google products?</strong></h3><p>
Other Google product team updates may be made available in the future.</p><p></p><p></p>Googlehttp://www.blogger.com/profile/11822708545141062574[email protected]0