<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Supply-Chain on Opera Omnia</title><link>https://mikael.barbero.tech/tags/supply-chain/</link><description>Recent content in Supply-Chain on Opera Omnia</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>mikael.barbero@eclipse-foundation.org (Mikaël Barbero)</managingEditor><webMaster>mikael.barbero@eclipse-foundation.org (Mikaël Barbero)</webMaster><lastBuildDate>Fri, 09 Oct 2026 10:30:00 +0200</lastBuildDate><atom:link href="https://mikael.barbero.tech/tags/supply-chain/index.xml" rel="self" type="application/rss+xml"/><item><title>Fewer keys under the doormat: why trusted publishing matters for Open VSX</title><link>https://mikael.barbero.tech/blog/post/2026-10-09-trusted-publishing-openvsx/</link><pubDate>Fri, 09 Oct 2026 10:30:00 +0200</pubDate><author>mikael.barbero@eclipse-foundation.org (Mikaël Barbero)</author><guid>https://mikael.barbero.tech/blog/post/2026-10-09-trusted-publishing-openvsx/</guid><description>&lt;p&gt;Every software registry eventually learns the same lesson: the most valuable thing in a publishing pipeline is not the code. It is the credential that lets someone ship it.&lt;/p&gt;
&lt;p&gt;For most of its history, publishing an extension to the &lt;a href="https://open-vsx.org/"&gt;Open VSX Registry&lt;/a&gt; from CI has meant creating a personal access token and storing it as a secret in a pipeline. That token is a key left under the doormat. It works at any time, from anywhere, for whoever finds it, and it keeps working until someone notices it should not.&lt;/p&gt;
&lt;p&gt;Trusted publishing is now available on Open VSX. Tamas Cservenak has already written &lt;a href="https://blogs.eclipse.org/post/tamas-cservenak/trusted-publishing-open-vsx"&gt;a practical guide to setting it up&lt;/a&gt;. This post is about something else: why we think it matters, which threats it addresses, which ones it deliberately leaves to other controls, and where it fits in the way we approach the security of the registry.&lt;/p&gt;
&lt;h2 id="the-publishing-credential-is-the-prize"&gt;The publishing credential is the prize&lt;/h2&gt;
&lt;p&gt;Extensions are not passive content. Once installed, an extension runs with the privileges of the developer who installed it. It can read source code, environment variables, SSH keys and cloud credentials, and it increasingly sits next to AI agents acting on the developer&amp;rsquo;s behalf. Open VSX now delivers &lt;a href="https://blogs.eclipse.org/post/anonymous/eclipse-open-vsx-graduates-mature-phase-marking-major-milestone-open-developer"&gt;hundreds of millions of extension downloads a month&lt;/a&gt; to AI-native IDEs, cloud development environments and VS Code-compatible tools, and most of those editors update extensions automatically.&lt;/p&gt;
&lt;p&gt;At that scale, publishing security is not just a concern for individual extension maintainers. It is a responsibility to the broader developer ecosystem.&lt;/p&gt;
&lt;p&gt;Put those facts together and the attacker&amp;rsquo;s calculus is simple. Someone holding a valid publishing credential does not need to find a vulnerability in the registry, or persuade anyone to install anything. They publish an update. The registry sees an authenticated upload from a legitimate account, and auto-update does the rest. Attackers rarely need to break in when they can log in.&lt;/p&gt;
&lt;p&gt;This is not hypothetical. In October 2025, researchers reported publishing tokens that developers had &lt;a href="https://mikael.barbero.tech/blog/post/2025-10-27-openvsx-security-update/"&gt;inadvertently exposed in public repositories&lt;/a&gt;, some of them for Open VSX, and some of those tokens were abused in the GlassWorm malware campaign. In January 2026, four long-established extensions received malicious updates pushed through a legitimate publisher&amp;rsquo;s access. Across the wider ecosystem, the Shai-Hulud family of worms has turned this into a repeatable pattern: steal a token, publish a poisoned release, harvest more tokens from everyone who installs it, repeat. These campaigns feed on long-lived credentials. After the first Shai-Hulud wave, npm &lt;a href="https://github.blog/changelog/2025-09-29-strengthening-npm-security-important-changes-to-authentication-and-token-management/"&gt;retired classic tokens, shortened the lifetime of the rest, and pushed publishers toward trusted publishing&lt;/a&gt; for exactly this reason.&lt;/p&gt;
&lt;h2 id="why-long-lived-tokens-are-the-wrong-primitive"&gt;Why long-lived tokens are the wrong primitive&lt;/h2&gt;
&lt;p&gt;Over the past year we have worked hard to make tokens safer. Open VSX tokens now carry a recognisable prefix, introduced with MSRC, so that secret scanners can spot them in public code. Default lifetimes are shorter. Extensions are scanned for embedded secrets before publication, and revocation is faster. These measures help, and they stay in place. But they all manage a risk that trusted publishing lets us remove.&lt;/p&gt;
&lt;p&gt;The trouble with a long-lived token is structural, and it shows up along three dimensions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time.&lt;/strong&gt; A token is valid until it expires or is revoked, which in practice means until someone notices it has leaked. The exposure window is measured in weeks or months, and the attacker, not the defender, decides when it starts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope.&lt;/strong&gt; Few people create the narrowest possible token, because working out the right scope and expiry is tedious. A token meant to publish one extension can often publish everything its owner controls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Place.&lt;/strong&gt; A token is only as safe as every place it has ever been copied to: a CI secret store, a laptop&amp;rsquo;s shell history, a &lt;code&gt;.env&lt;/code&gt; file, a chat message to a co-maintainer. Inside CI, a stored secret is typically readable by every step of the job, including third-party actions nobody audited. When something goes wrong, recovery is manual: find every copy, rotate it, and hope none was missed.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;
&lt;img src="https://mikael.barbero.tech/blog/post/2026-10-09-trusted-publishing-openvsx/creds-security-spectrum.jpg" alt="Security Spectrum of Tokens"&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;None of this is a failure of individual publishers. Security that depends on thousands of maintainers getting secret hygiene right, every time, does not scale. A registry that wants to be trustworthy has to make the safe path the easy one.&lt;/p&gt;
&lt;h2 id="from-a-secret-to-a-relationship"&gt;From a secret to a relationship&lt;/h2&gt;
&lt;p&gt;Trusted publishing replaces the shared secret with a declared relationship: &lt;em&gt;this workflow, in this repository, may publish this extension.&lt;/em&gt; The registration itself contains no secret at all. It simply records which pipeline the publisher trusts.&lt;/p&gt;
&lt;p&gt;At release time, the CI system gives the job a short-lived, cryptographically signed statement of its own identity. The registry verifies that statement against the registration and, if they match, issues a credential that lives for about five minutes and can publish exactly one extension. Nothing long-lived is stored anywhere, so there is nothing to leak into a public repository, nothing for an infostealer to lift from a laptop, and nothing to rotate.&lt;/p&gt;
&lt;p&gt;Back to our three dimensions, the blast radius shrinks on every axis: minutes instead of months, one extension instead of a whole namespace, one registered workflow instead of everywhere a token was ever pasted. The recovery story changes too. An attacker who loses access to a compromised pipeline loses the ability to publish, without anyone having to rotate anything.&lt;/p&gt;
&lt;p&gt;Cloud infrastructure made this same move years ago, when static access keys gave way to workload identity federation and the principle of no standing privileges. Package registries are now catching up, and Open VSX is part of that shift.&lt;/p&gt;
&lt;p&gt;Several design choices in the Open VSX implementation reflect lessons other registries learned the hard way. The registry resolves repository and owner names to their immutable numeric identifiers when a registration is created, so a repository that is deleted and re-created under the same name by someone else simply stops matching. A registration is removed automatically when its creator stops being an owner of the namespace, so access does not quietly outlive the person who granted it. Error responses are deliberately uniform, so the token exchange cannot be used to probe which extensions have a trusted publisher. The &lt;a href="https://github.com/eclipse-openvsx/openvsx/wiki/Trusted-Publishing"&gt;project documentation&lt;/a&gt; covers these and other details.&lt;/p&gt;
&lt;p&gt;Above all, the implementation follows the OpenSSF guidance &lt;a href="https://repos.openssf.org/trusted-publishers-for-all-package-repositories.html"&gt;&lt;em&gt;Trusted Publishers for All Package Repositories&lt;/em&gt;&lt;/a&gt; rather than a bespoke design. That is a strategic choice. Trusted publishing was &lt;a href="https://blog.trailofbits.com/2023/05/23/trusted-publishing-a-new-benchmark-for-packaging-security/"&gt;pioneered by PyPI with Trail of Bits in 2023&lt;/a&gt;, and has since been adopted by npm, RubyGems, NuGet, crates.io and pub.dev. At the time, Trail of Bits predicted it would become as foundational to packaging security as two-factor authentication. Following the shared model means Open VSX publishers, many of whom also ship to npm, meet a mechanism they already understand, with guarantees that have been scrutinised across several ecosystems. Supply chain security improves faster when registries converge on well-reviewed patterns instead of each inventing its own.&lt;/p&gt;
&lt;h2 id="what-trusted-publishing-does-not-do"&gt;What trusted publishing does not do&lt;/h2&gt;
&lt;p&gt;Being precise about the limits of a security control is part of deploying it responsibly. Trusted publishing has two limits worth stating plainly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is authentication, not endorsement.&lt;/strong&gt; As William Woodruff, one of its original designers, argued in &lt;a href="https://blog.yossarian.net/2026/07/07/You-shouldnt-trust-trusted-publishing"&gt;&lt;em&gt;You shouldn&amp;rsquo;t trust Trusted Publishing&lt;/em&gt;&lt;/a&gt;, the &amp;ldquo;trust&amp;rdquo; in the name is machine-to-machine trust between a CI workflow and a registry. It says nothing about whether an extension is safe, well-written or well-intentioned. Anyone can register a workflow, including someone publishing malware under their own name.&lt;/p&gt;
&lt;p&gt;The small marker next to &amp;ldquo;Published by&amp;rdquo; on an Open VSX extension page should be read in that light. It is a provenance record: this version arrived through the publisher&amp;rsquo;s registered workflow rather than through a personal token. That is useful, mostly as a consistency signal. In one of this year&amp;rsquo;s npm incidents, the telltale sign of compromise was a malicious release &lt;a href="https://www.upwind.io/feed/large-scale-npm-pypi-supply-chain-campaign-suspected-across-multiple-popular-packages"&gt;published with a personal token&lt;/a&gt; when the project normally released through its CI identity. Our own &lt;a href="https://mikael.barbero.tech/blog/post/2025-07-02-open-vsx-security-advisory/"&gt;2025 audit&lt;/a&gt; treated sudden changes in publishing behaviour as an indicator of compromise for the same reason. But the marker is not a safety rating, and we do not intend it as one. Every upload still goes through pre-publication checks, however it was authenticated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It moves the trust boundary; it does not remove it.&lt;/strong&gt; Whoever can modify or trigger the registered workflow can publish. 2026 has shown attackers adapting accordingly. In May, the &lt;a href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem"&gt;TanStack compromise&lt;/a&gt; chained a dangerous &lt;code&gt;pull_request_target&lt;/code&gt; trigger, GitHub Actions cache poisoning and the extraction of an OIDC token from runner memory, and used them to publish malicious npm packages through the project&amp;rsquo;s own release pipeline, complete with valid provenance. According to one analysis, the project&amp;rsquo;s trust configuration covered the repository as a whole rather than a specific protected branch and workflow.&lt;/p&gt;
&lt;p&gt;The lesson is not that trusted publishing failed. It raised the attacker&amp;rsquo;s cost from &amp;ldquo;find a token&amp;rdquo; to &amp;ldquo;compromise a pipeline&amp;rdquo;, and the pipeline is now where defence has to concentrate. On Open VSX, a registration is bound to a specific workflow file but, as in most implementations, not to a branch: any ref that runs that workflow is trusted. That is why we strongly recommend pinning a deployment environment with required reviewers and branch restrictions, so that a merged pull request or a stray commit cannot ship a release on its own. Pinning actions to commit SHAs, keeping default token permissions read-only, and avoiding triggers that run untrusted code with privileges now carry the weight that the stored token used to. The Eclipse Foundation Security Team&amp;rsquo;s guidance on &lt;a href="https://mikael.barbero.tech/blog/post/2026-03-24-stop-trusting-mutable-references/"&gt;hardening GitHub Actions&lt;/a&gt; is a good place to start.&lt;/p&gt;
&lt;h2 id="one-layer-in-a-deliberate-strategy"&gt;One layer in a deliberate strategy&lt;/h2&gt;
&lt;p&gt;Trusted publishing answers one specific question: &lt;em&gt;who is allowed to publish?&lt;/em&gt; It sits within a layered model in which each control covers a different stage of an extension&amp;rsquo;s life.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Who can publish:&lt;/strong&gt; verified namespaces, a signed publisher agreement, and now short-lived, narrowly scoped credentials tied to a declared pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What gets published:&lt;/strong&gt; &lt;a href="https://blogs.eclipse.org/post/christopher-guindon/strengthening-supply-chain-security-open-vsx"&gt;pre-publication checks&lt;/a&gt; for impersonation, embedded secrets and known malicious patterns, with suspicious uploads held for review rather than released.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What can change afterwards:&lt;/strong&gt; &lt;a href="https://blogs.eclipse.org/post/brian-king/evolution-and-integrity-announcing-open-vsx-110"&gt;immutable versions&lt;/a&gt;, so a published version can never be silently replaced.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who can watch:&lt;/strong&gt; the &lt;a href="https://github.com/eclipse-openvsx/openvsx/wiki/Registry-Changes-Feed"&gt;Registry Changes Feed&lt;/a&gt;, an append-only record of publications, deactivations and removals that independent monitors and mirrors can follow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How we respond:&lt;/strong&gt; fast token revocation, coordinated disclosure, and transparent advisories when something goes wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The common thread is a shift from reacting to reports toward removing opportunities. We would rather take away what attackers want than become very good at noticing when they have taken it.&lt;/p&gt;
&lt;p&gt;Publishing security is also a question of choice and control. Today, trusted publishing on Open VSX supports GitHub Actions. GitLab support comes next, and it is designed so that any GitLab instance, including self-hosted ones, can be configured as an identity provider. For a vendor-neutral registry, it matters that the root of publishing trust is not tied to a single platform, and that organisations can anchor it in infrastructure they control.&lt;/p&gt;
&lt;h2 id="make-the-switch-to-trusted-publishing"&gt;Make the switch to trusted publishing&lt;/h2&gt;
&lt;p&gt;If you publish to Open VSX from CI, please migrate. In practice, that means four things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Register your workflow as a trusted publisher and switch your release job to trusted publishing, following &lt;a href="https://blogs.eclipse.org/post/tamas-cservenak/trusted-publishing-open-vsx"&gt;Tamas&amp;rsquo;s guide&lt;/a&gt;. The very first version of a new extension still needs a token; every release after that does not.&lt;/li&gt;
&lt;li&gt;Delete the stored token from your CI secrets and revoke it. A token left in the pipeline keeps working and takes precedence, which means you have not actually switched.&lt;/li&gt;
&lt;li&gt;Pin a deployment environment with required reviewers, so that publishing requires a deliberate human decision.&lt;/li&gt;
&lt;li&gt;Treat the workflow file as security-critical code: protect it, review changes to it, and harden what runs inside it.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="securing-critical-infrastructure-takes-a-community"&gt;Securing critical infrastructure takes a community&lt;/h2&gt;
&lt;p&gt;This work was made possible by &lt;a href="https://alpha-omega.dev/"&gt;Alpha-Omega&lt;/a&gt;, which has supported the Eclipse Foundation&amp;rsquo;s security program since 2022 and has backed the &lt;a href="https://alpha-omega.dev/blog/case-study-eclipse-foundation-and-alpha-omega-securing-critical-developer-infrastructure-how-open-vsx-is-hardening-the-software-supply-chain/"&gt;hardening of the Open VSX Registry&lt;/a&gt;, from pre-publication checks to infrastructure and now trusted publishing. Support of this kind is what allows a non-profit foundation to move beyond responding to incidents and toward systematically removing the conditions that make them possible. Thank you.&lt;/p&gt;
&lt;p&gt;Thanks also to Tamas Cservenak, Thomas Neidhart and the Open VSX contributors who designed and shipped this feature, and to those whose groundwork we build on: the PyPI and Trail of Bits teams who pioneered trusted publishing, and the OpenSSF Securing Software Repositories Working Group, whose guidance gives every registry a common blueprint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open VSX exists so that the developer tooling ecosystem does not have to depend on a single vendor&amp;rsquo;s marketplace. That independence is only worth something if the registry deserves the trust placed in it.&lt;/strong&gt; Every long-lived token we help retire is one less key under the doormat.&lt;/p&gt;</description><category>Security</category><category>Open-Vsx</category><category>Supply-Chain</category><category>Trusted-Publishing</category><category>Eclipse-Foundation</category></item></channel></rss>