<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <generator uri="https://blog.rust-lang.org/tags/crates-io/" version="0.1.0">Posts tagged &quot;crates.io&quot; | Rust Blog</generator>
    <link href="https://blog.rust-lang.org/tags/crates-io/feed.xml" rel="self" type="application/atom+xml" />
    <link href="https://blog.rust-lang.org/tags/crates-io/" rel="alternate" type="text/html" />
    <id>https://blog.rust-lang.org/tags/crates-io/</id>
    <title>Posts tagged &quot;crates.io&quot; | Rust Blog</title>
    <subtitle>Empowering everyone to build reliable and efficient software.</subtitle>
    <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
    </author>
    <updated>2026-10-19T12:36:35+00:00</updated>

    
    <entry>
        <title>Be alert: targeted attacks on prominent Rustaceans</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/09/17/targeted-attacks/" type="text/html" title="Be alert: targeted attacks on prominent Rustaceans" />
        <published>2026-09-17T00:00:00+00:00</published>
        <updated>2026-09-17T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/09/17/targeted-attacks/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/09/17/targeted-attacks/">&lt;p&gt;We believe that there is an ongoing campaign targeting rust-lang members and
owners of popular crates that is attempting to compromise devices and accounts
in order to use them to publish malware.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;what-we-ve-seen&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-we-ve-seen&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What we&#x27;ve seen&lt;/h2&gt;
&lt;p&gt;A video call is set up for something positive — maybe for a job, maybe for a
project, maybe for a contract opportunity — and then that&#x27;s used as a vector to
either get the target to install something on their computer (such as a
purportedly missing audio codec) or execute another command (for example, via
putting a command on the clipboard).&lt;/p&gt;
&lt;p&gt;These attackers are setting up new but legitimate seeming company profiles,
including plausible LinkedIn presences, in order to pass cursory inspection.&lt;/p&gt;
&lt;p&gt;A &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://grack.com/blog/2026/06/25/dissecting-a-failed-nation-state-attack/&quot;&gt;previous attack of this form&lt;/a&gt; targeted many prominent Rust developers in
June, and, last month, the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/&quot;&gt;&lt;code&gt;arrayref&lt;/code&gt; crate was briefly compromised through similar
attacks&lt;/a&gt;. At this moment we do not know if these are all a part of the same
campaign.&lt;/p&gt;
&lt;p&gt;This attack style is &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://kudelskisecurity.com/research/how-dprks-contagious-interview-campaign-targets-developers&quot;&gt;known to be used by the DPRK&lt;/a&gt;, and has been &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://ashishb.net/security/contagious-interview/&quot;&gt;seen outside of the Rust community as well&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;what-you-can-do&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-you-can-do&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What you can do&lt;/h2&gt;
&lt;p&gt;Please take extra care in the near term. Be appropriately suspicious of cold
outreaches, and ensure that any calls you have with new people are on platforms
you trust — ideally, try to be the one who sets up the call on a platform you
already use.&lt;/p&gt;
&lt;p&gt;Please also re-check that your accounts look normal: MFA enabled,
no unexpected logins on platforms that can track that, and so on.&lt;/p&gt;
&lt;p&gt;If you have any concerns about your accounts, please reach out to
&lt;a href&#x3D;&quot;mailto:help@crates.io&quot;&gt;help@crates.io&lt;/a&gt; (for crates.io account concerns) and/or
&lt;a href&#x3D;&quot;mailto:security@rust-lang.org&quot;&gt;security@rust-lang.org&lt;/a&gt; (for any other
concerns). We&#x27;re very happy to help.&lt;/p&gt;
</content>

        <author>
            <name>Adam Harvey</name>
        </author>
    </entry>
    <entry>
        <title>Supply chain attack on arrayref</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/" type="text/html" title="Supply chain attack on arrayref" />
        <published>2026-08-20T00:00:00+00:00</published>
        <updated>2026-08-20T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/">&lt;h2 id&#x3D;&quot;what-happened&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-happened&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What happened&lt;/h2&gt;
&lt;p&gt;On 2026-08-20 at 7:15 UTC we got a report that the &lt;code&gt;proc-macro1&lt;/code&gt; crate was malicious.&lt;/p&gt;
&lt;p&gt;The Rust Security Response Team verified this to be the case: the crate had a build script that was downloading a malicious payload.&lt;/p&gt;
&lt;p&gt;This crate &lt;code&gt;proc-macro1&lt;/code&gt; and others like it (&lt;code&gt;proc-macro-en&lt;/code&gt;, &lt;code&gt;aovine&lt;/code&gt;, &lt;code&gt;arone&lt;/code&gt;, &lt;code&gt;aronenao&lt;/code&gt;, &lt;code&gt;tinymember&lt;/code&gt;) have been deleted.&lt;/p&gt;
&lt;p&gt;Furthermore, we discovered that the popular &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/crates/arrayref&quot;&gt;&lt;code&gt;arrayref&lt;/code&gt;&lt;/a&gt; crate had recently been republished and made to depend on this crate, with the most recent versions yanked. We have removed the malicious version and unyanked the maliciously-yanked versions. Other crates by that author (&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/crates/internment&quot;&gt;&lt;code&gt;internment&lt;/code&gt;&lt;/a&gt;, &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/crates/append-only-vec&quot;&gt;&lt;code&gt;append-only-vec&lt;/code&gt;&lt;/a&gt;) were also affected so we have done the same for those, and locked the account as a precaution. We do not believe the author of &lt;code&gt;arrayref&lt;/code&gt; to be acting maliciously, but their computer or credentials are likely compromised, and we are attempting to contact them.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;what-you-need-to-do&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-you-need-to-do&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What you need to do&lt;/h2&gt;
&lt;p&gt;We recommend you check your local dependencies to ensure these crates were not pulled in.
Here are the malicious versions that we deleted from crates.io:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;append-only-vec@0.1.9&lt;/code&gt;: published at &lt;code&gt;2026-08-20T07:37:49Z&lt;/code&gt;, deleted at &lt;code&gt;2026-08-20T09:25:24Z&lt;/code&gt;. Online for 107 minutes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arrayref@0.3.10&lt;/code&gt;: published at &lt;code&gt;2026-08-20T07:15:00Z&lt;/code&gt;, deleted at &lt;code&gt;2026-08-20T08:41:40Z&lt;/code&gt;. Online for 86 minutes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internment@0.8.7&lt;/code&gt;: published at &lt;code&gt;2026-08-20T07:34:07Z&lt;/code&gt;, deleted at &lt;code&gt;2026-08-20T09:04:11Z&lt;/code&gt;. Online for 90 minutes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proc-macro1&lt;/code&gt;, &lt;code&gt;proc-macro-en&lt;/code&gt;, &lt;code&gt;aovine&lt;/code&gt;, &lt;code&gt;arone&lt;/code&gt;, &lt;code&gt;aronenao&lt;/code&gt;, &lt;code&gt;tinymember&lt;/code&gt; (any versions).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can quickly check if these crates have been used locally by going through &lt;code&gt;~/.cargo/registry/cache&lt;/code&gt; with this command:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang&#x3D;&quot;shellscript&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-16&quot;&gt;find&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; ~/.cargo/registry/cache&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;type&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; f&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \(&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;append-only-vec-0.1.9.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;arrayref-0.3.10.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;internment-0.8.7.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;proc-macro1-*.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;proc-macro-en-*.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;aovine-*.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;arone-*.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;aronenao-*.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;o&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;  -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;name&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;tinymember-*.crate&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-16 z-d-15&quot;&gt;\)&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-4&quot;&gt;print&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id&#x3D;&quot;thanks&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#thanks&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Thanks&lt;/h2&gt;
&lt;p&gt;We&#x27;d like to thank the Research Team at Nextron Systems GmbH for initially discovering this and reporting it to us. We&#x27;d also like to thank Emily Albini, Manish Goregaokar, Marco Ieni, Tobias Bieniek, Ubiratan Soares, and Walter Pearce for participating in the response here.&lt;/p&gt;
</content>

        <author>
            <name>Manish Goregaokar</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: development update</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/" type="text/html" title="crates.io: development update" />
        <published>2026-07-13T00:00:00+00:00</published>
        <updated>2026-07-13T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/07/13/crates-io-development-update/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/">&lt;p&gt;Another six months have passed since our &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2026/01/21/crates-io-development-update/&quot;&gt;last development update&lt;/a&gt;, and the crates.io team has been busy. Here&#x27;s a summary of the most notable changes and improvements made to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/&quot;&gt;crates.io&lt;/a&gt; since then.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;source-code-viewer&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#source-code-viewer&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Source Code Viewer&lt;/h2&gt;
&lt;p&gt;Crate pages now have a &quot;Code&quot; tab that lets you browse the contents of published crate versions directly on crates.io. This shows you the exact files that &lt;code&gt;cargo&lt;/code&gt; downloads when you add a crate as a dependency, which might differ from the linked repository. This makes it much easier to audit your dependencies, including files that never appear in the repository, like the normalized &lt;code&gt;Cargo.toml&lt;/code&gt; files that &lt;code&gt;cargo&lt;/code&gt; generates.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/07/13/crates-io-development-update/code-tab.png&quot; alt&#x3D;&quot;Source code viewer showing the &amp;quot;Code&amp;quot; tab of the serde crate&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The viewer comes with a file tree sidebar with search functionality, syntax highlighting, and GitHub-style line selection, where clicking or dragging line numbers produces shareable &lt;code&gt;#L10-L20&lt;/code&gt; URLs.&lt;/p&gt;
&lt;p&gt;Under the hood, the server now builds a zip file for every published version. Since the &lt;code&gt;.crate&lt;/code&gt; files that &lt;code&gt;cargo&lt;/code&gt; consumes are gzipped tarballs without random access support, a background job re-packs each of them into a seekable zip archive plus a JSON manifest describing the contained files. Both are served from our static CDN. The frontend then fetches only the manifest and loads each file on demand with an HTTP range request. Because of this architecture, browsing crate sources essentially adds no load on the crates.io API servers. Existing crate versions have been backfilled, so this works for old releases too.&lt;/p&gt;
&lt;p&gt;The rendering library behind the code viewer is a diff renderer at heart, and that&#x27;s no accident: a version-to-version diff viewer built on the same infrastructure is currently in the works. This will allow you to review exactly what changed between two published versions, right on crates.io. Stay tuned!&lt;/p&gt;
&lt;h2 id&#x3D;&quot;untangling-crates-io-accounts-from-github&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#untangling-crates-io-accounts-from-github&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Untangling crates.io Accounts from GitHub&lt;/h2&gt;
&lt;p&gt;At the end of May, the crates.io team accepted &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/rfcs/pull/3946&quot;&gt;RFC #3946&lt;/a&gt;. Crates.io accounts always have been tightly coupled to GitHub: signing in means &quot;Log in with GitHub&quot;, and your crates.io identity is your GitHub username. The RFC changes that. It introduces usernames that are native to crates.io and independent of linked GitHub accounts, as a prerequisite for eventually supporting login via other identity providers.&lt;/p&gt;
&lt;p&gt;The implementation of crates.io usernames has started, but there is still a lot left to do, most visibly the ability to change your crates.io username. After that is complete, there will be future RFCs and implementation for signing in with identity providers other than GitHub. Since all of this touches authentication and account security, we are deliberately taking it slow and rolling these changes out in small, carefully reviewed steps.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;advisories-and-suggestions&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#advisories-and-suggestions&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Advisories and Suggestions&lt;/h2&gt;
&lt;p&gt;In our &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2026/01/21/crates-io-development-update/&quot;&gt;January update&lt;/a&gt; we introduced the &quot;Security&quot; tab, which shows security advisories from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/&quot;&gt;RustSec&lt;/a&gt; database. We have since taken this integration one step further: crates that RustSec has flagged as unmaintained now show a warning banner directly on their crate pages, linking to the corresponding advisory for details and possible alternatives. Thanks to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/djc&quot;&gt;Dirkjan Ochtman&lt;/a&gt; for implementing this feature!&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/07/13/crates-io-development-update/unmaintained-banner.png&quot; alt&#x3D;&quot;Unmaintained warning banner on the ansi_term crate page&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Related to this, some popular crates have been largely absorbed into the Rust standard library over the years, like &lt;code&gt;lazy_static&lt;/code&gt;, which has been superseded by &lt;code&gt;std::sync::LazyLock&lt;/code&gt; since Rust 1.80. Crate pages of such crates now show a friendly &quot;You might not need this dependency&quot; banner describing the standard library replacement, and superseded crates in dependency lists get a small light bulb icon with a similar hint.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/07/13/crates-io-development-update/std-replacement-banner.png&quot; alt&#x3D;&quot;&amp;quot;You might not need this dependency&amp;quot; banner on the lazy_static crate page&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The dataset behind this feature lives in the new &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/std-replacement-data&quot;&gt;rust-lang/std-replacement-data&lt;/a&gt; repository, together with a documented inclusion policy: standard library replacements only, every entry must cite the stable &lt;code&gt;std&lt;/code&gt;, &lt;code&gt;core&lt;/code&gt;, or &lt;code&gt;alloc&lt;/code&gt; API and Rust version, and crate maintainers get a notice-and-comment window before an entry is added. New entries can be proposed upstream and can benefit other tools too.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;ferris&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#ferris&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Ferris&lt;/h2&gt;
&lt;p&gt;The most delightful change of this cycle: the Ferris on our error pages now follows your mouse cursor with its eyes:&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/07/13/crates-io-development-update/ferris.gif&quot; alt&#x3D;&quot;Ferris&amp;#39; eyes following the mouse cursor on the error page&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Getting a 404 error on crates.io is now slightly less sad.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;svelte-frontend-migration-completed&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#svelte-frontend-migration-completed&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Svelte Frontend Migration Completed&lt;/h2&gt;
&lt;p&gt;In our &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2026/01/21/crates-io-development-update/&quot;&gt;January update&lt;/a&gt;, we announced that we were experimenting with porting the crates.io frontend from Ember.js to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt;. This experiment has concluded successfully: the new frontend reached feature parity, went through a &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/inside-rust/2026/04/17/crates-io-svelte-public-testing/&quot;&gt;public testing phase&lt;/a&gt; in April, became the default at the beginning of May, and the Ember.js app has been removed from our repository.&lt;/p&gt;
&lt;p&gt;We designed this change to be invisible for our users, since the new frontend is a 1:1 port of the previous design and functionality. For the team and our contributors, however, it is a big deal: the frontend is now built on a more modern framework, which should make it easier for new contributors to get started. It also allows us to iterate faster, as the source code viewer above demonstrates.&lt;/p&gt;
&lt;p&gt;We want to thank the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://emberjs.com/teams/&quot;&gt;Ember.js team&lt;/a&gt; for a framework that served crates.io well for many years, and the Svelte team for making the transition so enjoyable.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;miscellaneous&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#miscellaneous&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Miscellaneous&lt;/h2&gt;
&lt;p&gt;These were some of the more visible changes to crates.io over the past six months, but a lot has happened &quot;under the hood&quot; as well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search performance&lt;/strong&gt;: Relevance-sorted search queries previously ranked every crate matching the query, which could take 1-2 seconds for short or common search terms. Ranking is now bounded to the 1,000 matching crates with the highest recent download counts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reverse dependencies performance&lt;/strong&gt;: The reverse dependencies endpoint no longer recomputes the full dependent set on every request. It is now served from a precomputed table kept in sync by database triggers, turning an expensive join into a bounded index scan and greatly reducing the chance of getting a timeout error.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New ARCHITECTURE.md&lt;/strong&gt;: If you&#x27;ve ever wondered how crates.io actually works, our &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/blob/main/docs/ARCHITECTURE.md&quot;&gt;&lt;code&gt;ARCHITECTURE.md&lt;/code&gt;&lt;/a&gt; document got a complete rewrite. It is now organized around the high-level systems that make up crates.io and how they fit together, and includes walkthroughs of what happens when you run &lt;code&gt;cargo publish&lt;/code&gt;, why a typical crate download never touches our API servers, and how download counts are derived from CDN access logs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Definition lists&lt;/strong&gt;: READMEs now render Markdown &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/pull/13950&quot;&gt;definition lists&lt;/a&gt;, a widely used Markdown extension. Our markdown renderer &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/crates/comrak&quot;&gt;comrak&lt;/a&gt; already supported them, the extension just wasn&#x27;t enabled yet. Thanks to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/mistaste&quot;&gt;@mistaste&lt;/a&gt; for this contribution!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CDN cache tags&lt;/strong&gt;: Files uploaded to our static CDN now carry cache-tag metadata, allowing us to invalidate all cached files of a crate or a specific release in a single operation, instead of issuing one invalidation per file URL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Caching improvements&lt;/strong&gt;: We removed a global &lt;code&gt;Vary: Cookie&lt;/code&gt; response header that was preventing our CDNs from caching public API responses and frontend assets effectively. Per-user responses now use &lt;code&gt;Cache-Control: no-store&lt;/code&gt; instead, resulting in better cache hit rates at the CDN edge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;: We have made crates.io friendlier to screen readers: decorative icons are now hidden from the accessibility tree, heading hierarchies have been fixed, and lists are marked up as proper lists. ARIA snapshot tests now ensure that regressions can&#x27;t slip in unnoticed. We plan to continue to improve crates.io accessibility over the coming months.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Git index performance&lt;/strong&gt;: The background worker&#x27;s local clone of the git index is now a bare and shallow repository, eliminating roughly 250,000 checked-out files and the full commit history from its disk, improving its performance as we see increased rates of crate publication. The periodic index squashing now goes through the GitHub API instead of generating large git packs locally, which had previously caused out-of-memory failures on the production worker.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id&#x3D;&quot;feedback&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#feedback&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Feedback&lt;/h2&gt;
&lt;p&gt;We hope you enjoyed this update on the development of crates.io. If you have any feedback or questions, please let us know on &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.zulipchat.com/#narrow/stream/318791-t-crates-io&quot;&gt;Zulip&lt;/a&gt; or &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/discussions&quot;&gt;GitHub&lt;/a&gt;. We are always happy to hear from you and are looking forward to your feedback!&lt;/p&gt;
</content>

        <author>
            <name>Tobias Bieniek</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: an update to the malicious crate notification policy</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/02/13/crates.io-malicious-crate-update/" type="text/html" title="crates.io: an update to the malicious crate notification policy" />
        <published>2026-02-13T00:00:00+00:00</published>
        <updated>2026-02-13T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/02/13/crates.io-malicious-crate-update/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/02/13/crates.io-malicious-crate-update/">&lt;p&gt;The crates.io team will no longer publish a blog post each time a malicious crate is detected or reported. In the vast majority of cases to date, these notifications have involved crates that have no evidence of real world usage, and we feel that publishing these blog posts is generating noise, rather than signal.&lt;/p&gt;
&lt;p&gt;We will always publish a &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/&quot;&gt;RustSec&lt;/a&gt; advisory when a crate is removed for containing malware. You can subscribe to the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/feed.xml&quot;&gt;RustSec advisory RSS feed&lt;/a&gt; to receive updates.&lt;/p&gt;
&lt;p&gt;Crates that contain malware &lt;em&gt;and&lt;/em&gt; are seeing real usage or exploitation will still get both a blog post and a RustSec advisory. We may also notify via additional communication channels (such as social media) if we feel it is warranted.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;recent-crates&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#recent-crates&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Recent crates&lt;/h2&gt;
&lt;p&gt;Since we are announcing this policy change now, here is a retrospective summary of the malicious crates removed since &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2025/12/05/crates.io-malicious-crates-finch-rust-and-sha-rust/&quot;&gt;our last blog post&lt;/a&gt; and today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;finch_cli_rust&lt;/code&gt;, &lt;code&gt;finch-rst&lt;/code&gt;, and &lt;code&gt;sha-rst&lt;/code&gt;: the Rust security response working group was notified on December 9th, 2025 by Matthias Zepper of &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://ngisweden.scilifelab.se/&quot;&gt;National Genomics Infrastructure Sweden&lt;/a&gt; that these crates were attempting to exfiltrate credentials by impersonating the &lt;code&gt;finch&lt;/code&gt; and &lt;code&gt;finch_cli&lt;/code&gt; crates. Advisories: &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/advisories/RUSTSEC-2025-0150.html&quot;&gt;RUSTSEC-2025-0150&lt;/a&gt;, &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/advisories/RUSTSEC-2025-0151.html&quot;&gt;RUSTSEC-2025-0151&lt;/a&gt;, &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/advisories/RUSTSEC-2025-0152.html&quot;&gt;RUSTSEC-2025-0152&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;polymarket-clients-sdk&lt;/code&gt;: we were notified on February 6th by &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://socket.dev/&quot;&gt;Socket&lt;/a&gt; that this crate was attempting to exfiltrate credentials by impersonating the &lt;code&gt;polymarket-client-sdk&lt;/code&gt; crate. Advisory: &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/advisories/RUSTSEC-2026-0010.html&quot;&gt;RUSTSEC-2026-0010&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;polymarket-client-sdks&lt;/code&gt;: we were notified on February 13th that this crate was attempting to exfiltrate credentials by impersonating the &lt;code&gt;polymarket-client-sdk&lt;/code&gt; crate. Advisory: &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/advisories/RUSTSEC-2026-0011.html&quot;&gt;RUSTSEC-2026-0011&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In all cases, the crates were deleted, the user accounts that published them were immediately disabled, and reports were made to upstream providers as appropriate.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;thanks&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#thanks&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Thanks&lt;/h2&gt;
&lt;p&gt;Once again, our thanks go to Matthias, Socket, and the reporter of &lt;code&gt;polymarket-client-sdks&lt;/code&gt; for their reports. We also want to thank Dirkjan Ochtman from the secure code working group, Emily Albini from the security response working group, and Walter Pearce from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://foundation.rust-lang.org/&quot;&gt;Rust Foundation&lt;/a&gt; for aiding in the response.&lt;/p&gt;
</content>

        <author>
            <name>Adam Harvey</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: development update</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" type="text/html" title="crates.io: development update" />
        <published>2026-01-21T00:00:00+00:00</published>
        <updated>2026-01-21T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/01/21/crates-io-development-update/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/">&lt;p&gt;Time flies! Six months have passed since our last crates.io development update, so it&#x27;s time for another one. Here&#x27;s a summary of the most notable changes and improvements made to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/&quot;&gt;crates.io&lt;/a&gt; over the past six months.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;security-tab&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#security-tab&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Security Tab&lt;/h2&gt;
&lt;p&gt;Crate pages now have a new &quot;Security&quot; tab that displays security advisories from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rustsec.org/&quot;&gt;RustSec&lt;/a&gt; database. This allows you to quickly see if a crate has known vulnerabilities before adding it as a dependency.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/01/21/crates-io-development-update/security-tab.png&quot; alt&#x3D;&quot;Security Tab Screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The tab shows known vulnerabilities for the crate along with the affected version ranges.&lt;/p&gt;
&lt;p&gt;This feature is still a work in progress, and we plan to add more functionality in the future. We would like to thank the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://openssf.org/&quot;&gt;OpenSSF&lt;/a&gt; (Open Source Security Foundation) for funding this work and &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/djc&quot;&gt;Dirkjan Ochtman&lt;/a&gt; for implementing it.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;trusted-publishing-enhancements&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#trusted-publishing-enhancements&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Trusted Publishing Enhancements&lt;/h2&gt;
&lt;p&gt;In our July 2025 update, we announced Trusted Publishing support for GitHub Actions. Since then, we have made several enhancements to this feature.&lt;/p&gt;
&lt;h3 id&#x3D;&quot;gitlab-ci-cd-support&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#gitlab-ci-cd-support&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
GitLab CI/CD Support&lt;/h3&gt;
&lt;p&gt;Trusted Publishing now supports &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;GitLab CI/CD&lt;/a&gt; in addition to GitHub Actions. This allows GitLab users to publish crates without managing API tokens, using the same OIDC-based authentication flow.&lt;/p&gt;
&lt;p&gt;Note that this currently only works with GitLab.com. Self-hosted GitLab instances are not supported yet. The crates.io implementation has been refactored to support multiple CI providers, so adding support for other platforms like Codeberg/Forgejo in the future should be straightforward. Contributions are welcome!&lt;/p&gt;
&lt;h3 id&#x3D;&quot;trusted-publishing-only-mode&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#trusted-publishing-only-mode&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Trusted Publishing Only Mode&lt;/h3&gt;
&lt;p&gt;Crate owners can now enforce Trusted Publishing for their crates. When enabled in the crate settings, traditional API token-based publishing is disabled, and only Trusted Publishing can be used to publish new versions. This reduces the risk of unauthorized publishes from leaked API tokens.&lt;/p&gt;
&lt;h3 id&#x3D;&quot;blocked-triggers&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#blocked-triggers&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Blocked Triggers&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;pull_request_target&lt;/code&gt; and &lt;code&gt;workflow_run&lt;/code&gt; GitHub Actions triggers are now blocked from Trusted Publishing. These triggers have been responsible for multiple security incidents in the GitHub Actions ecosystem and are not worth the risk.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;source-lines-of-code&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#source-lines-of-code&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Source Lines of Code&lt;/h2&gt;
&lt;p&gt;Crate pages now display source lines of code (SLOC) metrics, giving you insight into the size of a crate before adding it as a dependency. This metric is calculated in a background job after publishing using the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/XAMPPRocky/tokei&quot;&gt;tokei&lt;/a&gt; crate. It is also shown on OpenGraph images:&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/01/21/crates-io-development-update/og-image-sloc.png&quot; alt&#x3D;&quot;OpenGraph image showing SLOC metric&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/XAMPPRocky&quot;&gt;XAMPPRocky&lt;/a&gt; for maintaining the &lt;code&gt;tokei&lt;/code&gt; crate!&lt;/p&gt;
&lt;h2 id&#x3D;&quot;publication-time-in-index&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#publication-time-in-index&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Publication Time in Index&lt;/h2&gt;
&lt;p&gt;A new &lt;code&gt;pubtime&lt;/code&gt; field has been added to crate index entries, recording when each version was published. This enables several use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cargo can implement cooldown periods for new versions in the future&lt;/li&gt;
&lt;li&gt;Cargo can replay dependency resolution as if it were a past date, though yanked versions remain yanked&lt;/li&gt;
&lt;li&gt;Services like &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/renovatebot/renovate&quot;&gt;Renovate&lt;/a&gt; can determine release dates without additional API requests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/reneleonhardt&quot;&gt;Rene Leonhardt&lt;/a&gt; for the suggestion and &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/epage&quot;&gt;Ed Page&lt;/a&gt; for driving this forward on the Cargo side.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;svelte-frontend-migration&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#svelte-frontend-migration&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Svelte Frontend Migration&lt;/h2&gt;
&lt;p&gt;At the end of 2025, the crates.io team evaluated several options for modernizing our frontend and decided to experiment with porting the website to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt;. The goal is to create a one-to-one port of the existing functionality before adding new features.&lt;/p&gt;
&lt;p&gt;This migration is still considered experimental and is a work in progress. Using a more mainstream framework should make it easier for new contributors to work on the frontend. The new Svelte frontend uses TypeScript and generates type-safe API client code from our &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/api/openapi.json&quot;&gt;OpenAPI description&lt;/a&gt;, so types flow from the Rust backend to the TypeScript frontend automatically.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/eth3lbert&quot;&gt;eth3lbert&lt;/a&gt; for the helpful reviews and guidance on Svelte best practices. We&#x27;ll share more details in a future update.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;miscellaneous&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#miscellaneous&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Miscellaneous&lt;/h2&gt;
&lt;p&gt;These were some of the more visible changes to crates.io over the past six months, but a lot has happened &quot;under the hood&quot; as well.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cargo user agent filtering&lt;/strong&gt;: We noticed that download graphs were showing a constant background level of downloads even for unpopular crates due to bots, scrapers, and mirrors. Download counts are now filtered to only include requests from Cargo, providing more accurate statistics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTML emails&lt;/strong&gt;: Emails from crates.io now support HTML formatting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Encrypted GitHub tokens&lt;/strong&gt;: OAuth access tokens from GitHub are now encrypted at rest in the database. While we have no evidence of any abuse, we decided to improve our security posture. The tokens were never included in the daily database dump, and the old unencrypted column has been removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Source link&lt;/strong&gt;: Crate pages now display a &quot;Browse source&quot; link in the sidebar that points to the corresponding docs.rs page. Thanks to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/carols10cents&quot;&gt;Carol Nichols&lt;/a&gt; for implementing this feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fastly CDN&lt;/strong&gt;: The sparse index at index.crates.io is now served primarily via Fastly to conserve our AWS credits for other use cases. In the past month, static.crates.io served approximately 1.6 PB across 11 billion requests, while index.crates.io served approximately 740 TB across 19 billion requests. A big thank you to Fastly for providing free CDN services through their &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.fastly.com/fast-forward&quot;&gt;Fast Forward program&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenGraph image improvements&lt;/strong&gt;: We fixed emoji and CJK character rendering in OpenGraph images, which was caused by missing fonts on our server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Background worker performance&lt;/strong&gt;: Database indexes were optimized to improve background job processing performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CloudFront invalidation improvements&lt;/strong&gt;: Invalidation requests are now batched to avoid hitting AWS rate limits when publishing large workspaces.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id&#x3D;&quot;feedback&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#feedback&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Feedback&lt;/h2&gt;
&lt;p&gt;We hope you enjoyed this update on the development of crates.io. If you have any feedback or questions, please let us know on &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.zulipchat.com/#narrow/stream/318791-t-crates-io&quot;&gt;Zulip&lt;/a&gt; or &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/discussions&quot;&gt;GitHub&lt;/a&gt;. We are always happy to hear from you and are looking forward to your feedback!&lt;/p&gt;
</content>

        <author>
            <name>Tobias Bieniek</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: Malicious crates finch-rust and sha-rust</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2025/12/05/crates.io-malicious-crates-finch-rust-and-sha-rust/" type="text/html" title="crates.io: Malicious crates finch-rust and sha-rust" />
        <published>2025-12-05T00:00:00+00:00</published>
        <updated>2025-12-05T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2025/12/05/crates.io-malicious-crates-finch-rust-and-sha-rust/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2025/12/05/crates.io-malicious-crates-finch-rust-and-sha-rust/">&lt;h2 id&#x3D;&quot;summary&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#summary&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Summary&lt;/h2&gt;
&lt;p&gt;On December 5th, the crates.io team was notified by Kush Pandya from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.socket.dev/&quot;&gt;Socket Threat Research Team&lt;/a&gt; of two malicious crates which were trying to cause confusion with the existing &lt;code&gt;finch&lt;/code&gt; crate but adding a dependency on a malicious crate doing data exfiltration.&lt;/p&gt;
&lt;p&gt;These crates were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;finch-rust&lt;/code&gt; - 1 version published November 25, 2025, downloaded 28 times, used &lt;code&gt;sha-rust&lt;/code&gt; as a dependency&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sha-rust&lt;/code&gt; - 8 versions published between November 20 and November 25, 2025, downloaded 153 times&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id&#x3D;&quot;actions-taken&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#actions-taken&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Actions taken&lt;/h2&gt;
&lt;p&gt;The user in question, &lt;code&gt;face-lessssss&lt;/code&gt;, was immediately disabled, and the crates in question were deleted from crates.io shortly after. We have retained the malicious crate files for further analysis.&lt;/p&gt;
&lt;p&gt;The deletions were performed at 15:52 UTC on December 5th.&lt;/p&gt;
&lt;p&gt;We reported the associated repositories to GitHub and the account has been removed there as well.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;analysis&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#analysis&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Analysis&lt;/h2&gt;
&lt;p&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://socket.dev/blog/malicious-crate-mimicking-finch-exfiltrates-credentials&quot;&gt;Socket has published their analysis in a blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These crates had no dependent downstream crates on crates.io, and there is no evidence of either of these crates being downloaded outside of automated mirroring and scanning services.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;thanks&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#thanks&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Thanks&lt;/h2&gt;
&lt;p&gt;Our thanks to Kush Pandya from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.socket.dev/&quot;&gt;Socket Threat Research Team&lt;/a&gt; for reporting the crates. We also want to thank Carol Nichols from the crates.io team and Adam Harvey from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://foundation.rust-lang.org/&quot;&gt;Rust Foundation&lt;/a&gt; for aiding in the response.&lt;/p&gt;
</content>

        <author>
            <name>Carol Nichols and Adam Harvey</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: Malicious crates evm-units and uniswap-utils</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2025/12/03/crates.io-malicious-crates-evm-units-and-uniswap-utils/" type="text/html" title="crates.io: Malicious crates evm-units and uniswap-utils" />
        <published>2025-12-03T00:00:00+00:00</published>
        <updated>2025-12-03T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2025/12/03/crates.io-malicious-crates-evm-units-and-uniswap-utils/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2025/12/03/crates.io-malicious-crates-evm-units-and-uniswap-utils/">&lt;h2 id&#x3D;&quot;summary&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#summary&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Summary&lt;/h2&gt;
&lt;p&gt;On December 2nd, the crates.io team was notified by Olivia Brown from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.socket.dev/&quot;&gt;Socket Threat Research Team&lt;/a&gt; of two malicious crates which were downloading a payload that was likely attempting to steal cryptocurrency.&lt;/p&gt;
&lt;p&gt;These crates were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;evm-units&lt;/code&gt; - 13 versions published in April 2025, downloaded 7257 times&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uniswap-utils&lt;/code&gt; - 14 versions published in April 2025, downloaded 7441 times, used &lt;code&gt;evm-units&lt;/code&gt; as a dependency&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id&#x3D;&quot;actions-taken&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#actions-taken&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Actions taken&lt;/h2&gt;
&lt;p&gt;The user in question, &lt;code&gt;ablerust&lt;/code&gt;, was immediately disabled, and the crates in question were deleted from crates.io shortly after. We have retained the malicious crate files for further analysis.&lt;/p&gt;
&lt;p&gt;The deletions were performed at 22:01 UTC on December 2nd.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;analysis&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#analysis&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Analysis&lt;/h2&gt;
&lt;p&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://socket.dev/blog/malicious-rust-crate-evm-units-serves-cross-platform-payloads&quot;&gt;Socket has published their analysis in a blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These crates had no dependent downstream crates on crates.io.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;thanks&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#thanks&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Thanks&lt;/h2&gt;
&lt;p&gt;Our thanks to Olivia Brown from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.socket.dev/&quot;&gt;Socket Threat Research Team&lt;/a&gt; for reporting the crates. We also want to thank Carol Nichols from the crates.io team and Walter Pearce and Adam Harvey from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://foundation.rust-lang.org/&quot;&gt;Rust Foundation&lt;/a&gt; for aiding in the response.&lt;/p&gt;
</content>

        <author>
            <name>Walter Pearce</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: Malicious crates faster_log and async_println</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/" type="text/html" title="crates.io: Malicious crates faster_log and async_println" />
        <published>2025-09-24T00:00:00+00:00</published>
        <updated>2025-09-24T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/">&lt;p&gt;&lt;strong&gt;Updated September 24th, 2025 17:34:38 UTC&lt;/strong&gt; - Socket has also published their own &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://socket.dev/blog/two-malicious-rust-crates-impersonate-popular-logger-to-steal-wallet-keys&quot;&gt;accompanying blog post&lt;/a&gt; about the attack.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;summary&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#summary&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Summary&lt;/h2&gt;
&lt;p&gt;On September 24th, the crates.io team was notified by Kirill Boychenko from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.socket.dev/&quot;&gt;Socket Threat Research Team&lt;/a&gt; of two malicious crates which were actively searching file contents for Etherum private keys, Solana private keys, and arbitrary byte arrays for exfiltration.&lt;/p&gt;
&lt;p&gt;These crates were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;faster_log&lt;/code&gt; - Published on May 25th, 2025, downloaded 7181 times&lt;/li&gt;
&lt;li&gt;&lt;code&gt;async_println&lt;/code&gt; - Published on May 25th, 2025, downloaded 1243 times&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The malicious code was executed at runtime, when running or testing a project depending on them. Notably, they did not execute any malicious code at build time. Except for their malicious payload, these crates copied the source code, features, and documentation of legitimate crates, using a similar name to them (a case of typosquatting&lt;sup class&#x3D;&quot;footnote-reference&quot; id&#x3D;&quot;fr-typosquatting-1&quot;&gt;&lt;a href&#x3D;&quot;https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fn-typosquatting&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;).&lt;/p&gt;
&lt;h2 id&#x3D;&quot;actions-taken&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#actions-taken&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Actions taken&lt;/h2&gt;
&lt;p&gt;The users in question were immediately disabled, and the crates in question were deleted&lt;sup class&#x3D;&quot;footnote-reference&quot; id&#x3D;&quot;fr-deletion-1&quot;&gt;&lt;a href&#x3D;&quot;https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fn-deletion&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt; from crates.io shortly after. We have retained copies of all logs associated with the users and the malicious crate files for further analysis.&lt;/p&gt;
&lt;p&gt;The deletion was performed at 15:34 UTC on September 24, 2025.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;analysis&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#analysis&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Analysis&lt;/h2&gt;
&lt;p&gt;Both crates were copies of a crate which provided logging functionality, and the logging implementation remained functional in the malicious crates. The original crate had a feature which performed log file packing, which iterated over an associated directories files.&lt;/p&gt;
&lt;p&gt;The attacker inserted code to perform the malicious action during a log packing operation, which searched the log files being processed from that directory for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quoted Ethereum private keys (0x + 64 hex)&lt;/li&gt;
&lt;li&gt;Solana-style Base58 secrets&lt;/li&gt;
&lt;li&gt;Bracketed byte arrays&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The crates then proceeded to exfiltrate the results of this search to &lt;code&gt;https://mainnet[.]solana-rpc-pool[.]workers[.]dev/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These crates had no dependent downstream crates on crates.io.&lt;/p&gt;
&lt;p&gt;The malicious users associated with these crates had no other crates or publishes, and the team is actively investigating associative actions in our retained&lt;sup class&#x3D;&quot;footnote-reference&quot; id&#x3D;&quot;fr-retention-1&quot;&gt;&lt;a href&#x3D;&quot;https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fn-retention&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; logs.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;thanks&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#thanks&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Thanks&lt;/h2&gt;
&lt;p&gt;Our thanks to Kirill Boychenko from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.socket.dev/&quot;&gt;Socket Threat Research Team&lt;/a&gt; for reporting the crates. We also want to thank Carol Nichols from the crates.io team, Pietro Albini from the Rust Security Response WG and Walter Pearce from the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://foundation.rust-lang.org/&quot;&gt;Rust Foundation&lt;/a&gt; for aiding in the response.&lt;/p&gt;
&lt;section class&#x3D;&quot;footnotes&quot;&gt;
&lt;ol class&#x3D;&quot;footnotes-list&quot;&gt;
&lt;li id&#x3D;&quot;fn-typosquatting&quot;&gt;
&lt;p&gt;typosquatting is a technique used by bad actors to initiate dependency confusion attacks where a legitimate user might be tricked into using a malicious dependency instead of their intended dependency — for example, a bad actor might try to publish a crate at &lt;code&gt;proc-macro3&lt;/code&gt; to catch users of the legitimate &lt;code&gt;proc-macro2&lt;/code&gt; crate. &lt;a href&#x3D;&quot;https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fr-typosquatting-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id&#x3D;&quot;fn-deletion&quot;&gt;
&lt;p&gt;The crates were preserved for future analysis should there be other attacks, and to inform scanning efforts in the future. &lt;a href&#x3D;&quot;https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fr-deletion-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id&#x3D;&quot;fn-retention&quot;&gt;
&lt;p&gt;One year of logs are retained on crates.io, but only 30 days are immediately available on our log platform. We chose not to go further back in our analysis, since IP address based analysis is limited by the use of dynamic IP addresses in the wild, and the relevant IP address being part of an allocation to a residential ISP. &lt;a href&#x3D;&quot;https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fr-retention-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>

        <author>
            <name>Walter Pearce</name>
        </author>
    </entry>
    <entry>
        <title>crates.io phishing campaign</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2025/09/12/crates-io-phishing-campaign/" type="text/html" title="crates.io phishing campaign" />
        <published>2025-09-12T00:00:00+00:00</published>
        <updated>2025-09-12T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2025/09/12/crates-io-phishing-campaign/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2025/09/12/crates-io-phishing-campaign/">&lt;p&gt;We received multiple reports of a phishing campaign targeting crates.io users
(from the &lt;code&gt;rustfoundation.dev&lt;/code&gt; domain name), mentioning a compromise of our
infrastructure and asking users to authenticate to limit damage to their crates.&lt;/p&gt;
&lt;p&gt;These emails are malicious and come from a domain name not controlled by  the
Rust Foundation (nor the Rust Project), seemingly with the purpose of stealing
your GitHub credentials. We have no evidence of a compromise of the crates.io
infrastructure.&lt;/p&gt;
&lt;p&gt;We are taking steps to get the domain name taken down and to monitor for
suspicious activity on crates.io. Do not follow any links in these emails if you
receive them, and mark them as phishing with your email provider.&lt;/p&gt;
&lt;p&gt;If you have any further questions please reach out to &lt;a href&#x3D;&quot;mailto:security@rust-lang.org&quot;&gt;security@rust-lang.org&lt;/a&gt;
and &lt;a href&#x3D;&quot;mailto:help@crates.io&quot;&gt;help@crates.io&lt;/a&gt;.&lt;/p&gt;
</content>

        <author>
            <name>Rust Security Response WG, crates.io team</name>
        </author>
    </entry>
    <entry>
        <title>crates.io: development update</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/" type="text/html" title="crates.io: development update" />
        <published>2025-07-11T00:00:00+00:00</published>
        <updated>2025-07-11T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/">&lt;p&gt;Since our last development update in &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2025/02/05/crates-io-development-update.html&quot;&gt;February 2025&lt;/a&gt;, we have continued to make significant improvements to &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/&quot;&gt;crates.io&lt;/a&gt;. In this blog post, we want to give you an update on the latest changes that we have made to crates.io over the past few months.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;trusted-publishing&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#trusted-publishing&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Trusted Publishing&lt;/h2&gt;
&lt;p&gt;We are excited to announce that we have implemented &quot;Trusted Publishing&quot; support on crates.io, as described in &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.github.io/rfcs/3691-trusted-publishing-cratesio.html&quot;&gt;RFC #3691&lt;/a&gt;. This feature was inspired by the PyPI team&#x27;s excellent work in this area, and we want to thank them for the inspiration!&lt;/p&gt;
&lt;p&gt;Trusted Publishing eliminates the need for GitHub Actions secrets when publishing crates from your CI/CD pipeline. Instead of managing API tokens, you can now configure which GitHub repository you trust directly on crates.io. That repository is then allowed to request a short-lived API token for publishing in a secure way using OpenID Connect (OIDC). While Trusted Publishing is currently limited to GitHub Actions, we have built it in a way that allows other CI/CD providers like GitLab CI to be supported in the future.&lt;/p&gt;
&lt;p&gt;To get started with Trusted Publishing, you&#x27;ll need to publish your first release manually. After that, you can set up trusted publishing for future releases. The detailed documentation is available at &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/docs/trusted-publishing&quot;&gt;https://crates.io/docs/trusted-publishing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/trustpub-settings.png&quot; alt&#x3D;&quot;Trusted Publishers Settings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here&#x27;s an example of how to set up GitHub Actions to use Trusted Publishing:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang&#x3D;&quot;yaml&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;n&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ame&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; P&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;ublish to crates.io&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-17 z-d-4&quot;&gt;on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;  p&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ush&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;    t&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-19 z-d-13&quot;&gt;v*&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-13&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-13 z-d-7&quot;&gt;  #&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-13 z-d-7&quot;&gt; Triggers when pushing tags starting with &amp;#39;v&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;j&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;obs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;  p&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ublish&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;    r&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;uns-on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; u&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;buntu-latest&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;    e&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;nvironment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; r&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;elease&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-13 z-d-7&quot;&gt;  #&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-13 z-d-7&quot;&gt; Optional: for enhanced security&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;    p&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ermissions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;      i&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;d-token&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; w&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;rite&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-13 z-d-7&quot;&gt;     #&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-13 z-d-7&quot;&gt; Required for OIDC token exchange&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;    s&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;teps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt; u&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ses&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; a&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;ctions/checkout@v4&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt; u&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ses&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; r&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;ust-lang/crates-io-auth-action@v1&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;      i&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;d&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; a&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;uth&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt; r&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;un&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; c&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;argo publish&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;      e&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;nv&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;        C&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-2 z-d-4&quot;&gt;ARGO_REGISTRY_TOKEN&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt; $&lt;/span&gt;&lt;span class&#x3D;&quot;z-l-4 z-d-13&quot;&gt;{{ steps.auth.outputs.token }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id&#x3D;&quot;opengraph-images&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#opengraph-images&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
OpenGraph Images&lt;/h2&gt;
&lt;p&gt;Previously, crates.io used a single OpenGraph image for all pages. We have now implemented dynamic OpenGraph image generation, where each crate has a dedicated image that is regenerated when new versions are published.&lt;/p&gt;
&lt;p&gt;These images include the crate name, keywords, description, latest version (or rather the default version that we show for the crate), number of releases, license, and crate size. This provides much more useful information when crates.io links are shared on social media platforms or in chat applications.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://static.crates.io/og-images/bon.png&quot; alt&#x3D;&quot;OpenGraph Image for the bon crate&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The image generation has been extracted to a dedicated crate: &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://crates.io/crates/crates_io_og_image&quot;&gt;crates_io_og_image&lt;/a&gt; (&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates_io_og_image&quot;&gt;GitHub&lt;/a&gt;). We&#x27;re also adding basic theming support in &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates_io_og_image/pull/3&quot;&gt;PR #3&lt;/a&gt; to allow docs.rs to reuse the code for their own OpenGraph images.&lt;/p&gt;
&lt;p&gt;Under the hood, the image generation uses two other excellent Rust projects: &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://typst.app/&quot;&gt;Typst&lt;/a&gt; for layout and text rendering, and &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/oxipng/oxipng&quot;&gt;oxipng&lt;/a&gt; for PNG optimization.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;docs-rs-rebuilds&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#docs-rs-rebuilds&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
docs.rs rebuilds&lt;/h2&gt;
&lt;p&gt;Crate owners can now trigger documentation rebuilds for docs.rs directly from the crate&#x27;s version list on crates.io. This can be useful when docs.rs builds have failed or when you want to take advantage of new docs.rs features without having to publish a new release just for that.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/docs-rebuild-confirmation.png&quot; alt&#x3D;&quot;docs.rs Rebuild Confirmation&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We would like to thank our crates.io team member &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/eth3lbert&quot;&gt;@eth3lbert&lt;/a&gt; for implementing the initial version of this feature in &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/pull/11422&quot;&gt;PR #11422&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;readme-alert-support&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#readme-alert-support&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
README alert support&lt;/h2&gt;
&lt;p&gt;We&#x27;ve added support for rendering GitHub-style alerts in README files. This feature allows crate authors to use alert blocks like &lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt;, &lt;code&gt;&amp;gt; [!WARNING]&lt;/code&gt;, and &lt;code&gt;&amp;gt; [!CAUTION]&lt;/code&gt; in their README markdown, which will now be properly styled and displayed on crates.io.&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2025/07/11/crates-io-development-update-2025-07/readme-alerts.png&quot; alt&#x3D;&quot;README alerts example&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This enhancement was also implemented by &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/eth3lbert&quot;&gt;@eth3lbert&lt;/a&gt; in &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/pull/11441&quot;&gt;PR #11441&lt;/a&gt;, building on initial work by &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/kbdharun&quot;&gt;@kbdharun&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;miscellaneous&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#miscellaneous&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Miscellaneous&lt;/h2&gt;
&lt;p&gt;These were some of the more visible changes to crates.io over the past couple of months, but a lot has happened &quot;under the hood&quot; as well. Here are a couple of examples:&lt;/p&gt;
&lt;h3 id&#x3D;&quot;email-system-refactoring&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#email-system-refactoring&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Email system refactoring&lt;/h3&gt;
&lt;p&gt;Previously, we used the &lt;code&gt;format!()&lt;/code&gt; macro and string concatenation to create emails, which made them hard to maintain and inconsistent in styling. We have migrated to the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/mitsuhiko/minijinja&quot;&gt;minijinja&lt;/a&gt; crate and now use templates instead.&lt;/p&gt;
&lt;p&gt;The new system includes a template inheritance system for consistent branding across all emails. This change also enables us to support HTML emails in the future.&lt;/p&gt;
&lt;h3 id&#x3D;&quot;semver-sorting-optimization&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#semver-sorting-optimization&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
SemVer sorting optimization&lt;/h3&gt;
&lt;p&gt;Previously, we had to load all versions from the database and sort them by &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://semver.org/&quot;&gt;SemVer&lt;/a&gt; on the API server, which was inefficient for crates with many versions. Our PostgreSQL provider did not support the &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://pgxn.org/dist/semver/&quot;&gt;semver extension&lt;/a&gt;, so we had to implement sorting in application code.&lt;/p&gt;
&lt;p&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/pull/10763&quot;&gt;PR #10763&lt;/a&gt; takes advantage of JSONB support in PostgreSQL and their btree ordering specification to implement SemVer sorting on the database side. This reduces the load on our API servers and improves response times for crates with many versions.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;feedback&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#feedback&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Feedback&lt;/h2&gt;
&lt;p&gt;We hope you enjoyed this update on the development of crates.io. If you have any feedback or questions, please let us know on &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.zulipchat.com/#narrow/stream/318791-t-crates-io&quot;&gt;Zulip&lt;/a&gt; or &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/crates.io/discussions&quot;&gt;GitHub&lt;/a&gt;. We are always happy to hear from you and are looking forward to your feedback!&lt;/p&gt;
</content>

        <author>
            <name>Tobias Bieniek</name>
        </author>
    </entry>
</feed>
