OpenBao vs. HashiCorp Vault: The Fork War and the RCE That Broke the Truce
A November 9, 2023 fork of HashiCorp Vault's last MPL-2.0 maintenance line — proposed inside IBM's Open Horizon edge project because Linux Foundation projects cannot embed BSL-licensed code, seeded by issue #1 from an IBM engineer, and revealed at Open Source Summit Tokyo three weeks later — that became the OpenSSF-hosted heir to Vault's open-source lineage, ported Vault Enterprise's namespaces to a community edition, and in September 2026 shipped the fix for a critical unauthenticated-to-RCE chain whose disclosure its new owner's old company declined to coordinate.
Sources
- ControlPlane: 'A Realistic Code Execution Exploit Chain in OpenBao and Vault' — Alex Scheel, 2026-09-28 (the full disclosure timeline, the four chained GHSAs, and the account of IBM declining a mutual disclosure agreement)
- hashicorp/vault repository (created 2015-02-25, first commit ed3069f; 36,497 stars; license NOASSERTION — Business Source License — as of 2026-11-11)
- openbao/openbao repository (created 2023-11-09T18:17:33Z; 8,975 stars; MPL-2.0 — the fork point sits on Vault's release/1.14.x branch at ~1.14.7-dev)
- hashicorp/vault LICENSE at tag v1.14.4 — 'Copyright (c) 2015 HashiCorp, Inc. / Mozilla Public License, version 2.0' (the last MPL-licensed release train)
- hashicorp/vault LICENSE at tag v1.15.0 — Business Source License 1.1, 'Licensed Work: Vault 1.15.0-rc1. The Licensed Work is (c) 2023 HashiCorp, Inc.' (first BSL release; changelog date September 27, 2023)
- Vault v0.1.0 CHANGELOG — '0.1.0 (April 28, 2015): Initial release'
- Hacker News: 'Vault – A tool for managing secrets' (440 points, launch day, 2015-04-28 — the same day v0.1.0 shipped)
- Vault CHANGELOG, 1.10–1.15 era — 0.8.0 (2017-08-09, plugins-era floor of CVE-2025-6000), 0.10.0 (2018-04-10, KV v2), 1.0.0 (2018-12-03), 1.14.0 (2023-06-21, ACME server with the EAB recommendation)
- openbao/openbao issue #1: 'Fork Hashicorp Vault' — Nathan Phelps (IBM, Open Horizon), opened 2023-11-10: 'Must include the current and future source for the 1.14.x stream of Vault changes'
- openbao/openbao PR #45: 'feat: rename Vault to OpenBao in build files' — the rebrand that closed issue #1 (February 2024)
- Commit 8993802145833ab01d49c6070d787a9eccb81546 — 'backport of commit ac1e9194...' (2023-12-21, +9/-0): GitHub blame shows the plugin-execution core at plugin_catalog.go L829-L840 essentially unchanged until the September 2026 RCE fix
- GHSA-j6wc-jpvg-xfxq / CVE-2026-104090 — 'Remote Code Execution via sys/storage/raft/snapshot-force Plugin Catalog Replacement in OpenBao' (critical, CVSSv4 9.4, published 2026-09-23)
- GHSA-xp75-r577-cvhp / CVE-2025-54997 — 'Privileged OpenBao Operator May Execute Code on the Underlying Host' (critical, 2025-08-08): OpenBao's mirror of HashiCorp's HCSEC-2025-14, shipped in v2.3.2 one week after the unilateral disclosure
- CVE-2025-6000 / GHSA-mr4h-qf9j-f665 — 'Hashicorp Vault has Code Execution Vulnerability via Plugin Configuration' (CVSS 9.1, CWE-94; affected since 0.8.0; fixed in CE 1.20.1 and Enterprise 1.20.1/1.19.7/1.18.12/1.16.23; published 2025-08-01)
- HCSEC-2025-14: 'Privileged Vault Operator May Execute Code on the Underlying Host' — HashiCorp's own disclosure, 2025-08-01
- The Register: 'Open source forkers stick an OpenBao in the oven' — Sebastian Stadil reveals the project at Open Source Summit Tokyo (2023-12-08)
- TechTarget: 'IBM engineers hatch Linux Foundation HashiCorp Vault fork' — Joe Pearson: 'Linux Foundation projects cannot embed BSL-licensed code'; first working group meeting 2023-11-09
- The New Stack: 'Meet OpenBao, an Open Source Fork of HashiCorp Vault' — the plan to port Enterprise-only features (namespaces, replication) to the community fork (2023-12-15)
- LF Edge TAC proposal: OpenBao Project — the five founding TSC organizations (IBM, IOTech, Viaccess-Orca/Orange, WALLIX, ZEDEDA) and the 13 initial committers, including Nathan Phelps (IBM, Open Horizon) and Alexander Scheel
- ossf/tac PR #461: 'Apply for sandbox stage with OpenBao' — Alexander Scheel (cipherboy), 2025-03-28: the lateral LF Edge to OpenSSF transfer ('We currently receive no budget from LF Edge')
- OpenSSF blog: 'OpenBao Joins the OpenSSF' (2025-06-17)
- OpenBao blog: 'Announcing OpenBao Namespaces' — Christoph Voigt (2025-05-30): namespaces as 'a mini-OpenBao' and a stepping stone to horizontal scalability
- OpenBao GOVERNANCE.md — 'OpenBao's TSC was formed in June 2024' (June 13, 2024, charter clause 2.b)
- Hacker News: 'OpenBao – FOSS Fork of HashiCorp Vault' launch thread (314 points, 2023-12-09; candiddevmike's plugin-lifecycle complaint and the 'It was Vault. It was IBM' insider comment)
- hashicorp/vault CHANGELOG, 2.x era — v2.0.0 (2026-04-14, canonical URL-encoded path rejection), v2.1.2 (2026-10-07, plugin-catalog-from-snapshot fix), v2.2.0 (2026-10-15, ACME sign-verbatim SANs rejection and the case-variant ACL fix with its fail-open migration note), v2.2.1 (2026-10-22, policy cache-key collision)
- IBM Newsroom: 'IBM to Acquire HashiCorp, Inc.' — $35 per share, $6.4 billion enterprise value, announced 2024-04-24
- TechTarget: 'Nvidia adopts OpenBao, open source fork of HashiCorp's Vault' (2026-06)
- OpenBao v2.6.3 and v2.7.0 releases — the same-day security releases of 2026-09-23 (17:06 and 17:39 UTC)
On April 28, 2015, HashiCorp put a 440-point Hacker News thread behind a tool called Vault and quietly defined the category every platform team now lives in: secrets as a managed, audited, lease-bearing service. Eight and a half years later, the two repositories that carry that codebase's DNA are owned by rivals of an absurd kind — one is HashiCorp, sold to IBM in February 2025; the other is OpenBao, a fork that IBM's own edge-computing project seeded in November 2023 because the Linux Foundation forbids embedding BSL-licensed code, and which IBM's own engineers staffed in its first months. The fork was born from a license, raised on Enterprise features given away for free, and in September 2026 it became the first of the two to patch a full unauthenticated-to-remote-code-execution chain — while the other, per the maintainers who coordinated the fix, refused to discuss a mutual disclosure agreement at all. This is the tale of a fork war where both sides still ship the same 2017-vintage plugin execution core, and where the casualty was the one thing secrets infrastructure cannot survive losing: coordinated security response.
The Ancestor: A Tool for Managing Secrets (2015–2018)
Launch day, and the design that outlived the company
Vault's repository was created on February 25, 2015 — the initial commit
ed3069f01d still anchors the LICENSE file's history in the
fork — and v0.1.0 shipped on April 28, 2015, the same day the launch post reached the top of
Hacker News. What Armon Dadgar and Mitchell Hashimoto had built was not a password store. It
was an encrypted-barrier architecture: every request, authenticated or not, hits a sealed
barrier that decrypts storage only for the lifetime of a single request; the barrier key
itself is assembled at unseal time from Shamir's secret sharing, so that no single operator
ever holds the root key. Around that core sat the ideas that made Vault infrastructure rather
than tooling: dynamic secrets (issue a database credential with a TTL instead of rotating a
shared password), leases (everything issued expires), response wrapping (a secret can be
handed over inside a single-use token), and the audit log as a first-class write-only
sink. The launch-day comment threads already read like a requirements list for the next
decade of the industry: teams wanted AWS IAM credential brokering, PKI issuance, and
encryption-as-a-service. All three became built-in engines within two years.
┌────────────────────────────────────────────┐
│ HTTP/TLS API │
│ (auth methods: token, cert, approle, …) │
└───────────────┬────────────────────────────┘
│ logical.Request (path, token)
┌───────────────▼────────────────────────────┐
unseal keys ───▶ │ SEAL / BARRIER │
(Shamir shares │ - sealed: storage ciphertext only │
or auto-unseal) │ - unsealed: per-request decrypt via │
│ keyring; keyring protected by barrier │
│ root key │
└───────┬───────────────────┬────────────────┘
│ │
┌───────────▼─────┐ ┌─────────▼──────────────┐
│ CORE / ROUTER │ │ AUDIT (write-only, │
│ mount table + │ │ HMAC'd, append-only) │
│ policy ACL │ └────────────────────────┘
└───┬────────┬─────┘
┌───────────▼──┐ ┌──▼───────────────┐ ┌────────────────────┐
│ secret │ │ auth methods │ │ physical storage │
│ engines: kv, │ │ token, cert, │ │ (inmem, file, │
│ transit, pki,│ │ approle, ldap, │ │ consul, raft, …) │
│ database … │ │ kubernetes … │ │ all ciphertext │
└──────────────┘ └─────────────────┘ └────────────────────┘
everything issued carries a LEASE → expires → revocation
The moat gets built (2017–2023)
The release history that matters to this story is short. Vault 0.8.0 (August 9, 2017)
introduced the plugin architecture that would haunt both projects eight years later —
external auth and secrets engines executed as separate binaries from a configurable
plugin_directory, checksum-pinned at registration. Vault
0.10.0 (April 10, 2018) added versioned KV (KVv2). Vault 1.0.0 (December 3, 2018) declared
the Integrated Storage Raft backend production-ready. And Vault 1.14.0 (June 21, 2023)
shipped the feature that step one of the 2026 exploit chain would abuse: an ACME server in
the PKI engine, letting standard clients like certbot and cert-manager request certificates
"with no knowledge of Vault APIs or authentication mechanisms." The release note carried its
own warning — for public-facing instances, "we recommend requiring External Account Bindings
(EAB) to limit the ability to request certificates to only authenticated clients" — which is,
verbatim, the mitigation operators had to rediscover in September 2026.
Meanwhile the commercial architecture hardened along a different axis. Namespaces — isolated mount tables, policies, and token scopes inside one cluster — arrived as a Vault Enterprise feature and stayed there, alongside HSM auto-unseal, KMIP, replication, and Sentinel policy. By 2023 the open-source edition was the funnel; the things a multi-tenant platform actually needed were the paywall. When The New Stack covered the fork in December 2023, it described the plan bluntly: "one of the initiatives of the project is to build out some of the advanced features that have only been in the Vault Enterprise commercial edition, such as high-speed replication, multiple namespaces, and perhaps even a policy-as-code framework." That sentence became OpenBao's roadmap, and namespaces — the single most-requested Enterprise feature in every platform-engineering conversation about Vault — became its proof of intent.
August 10, 2023: The License Rupture
HashiCorp's announcement that Vault, Terraform, Consul, Nomad, Packer, Vagrant, and Waypoint would move from MPL-2.0 to the Business Source License landed on August 10, 2023. For Vault the switch took 48 days to reach a release: the last MPL-licensed train was v1.14.4 (published September 26, 2023), and v1.15.0 — dated September 27, 2023 in its own changelog — shipped under BSL 1.1. The LICENSE diff between those two tags is the entire story in two headers:
$ curl -sL https://raw.githubusercontent.com/hashicorp/vault/v1.14.4/LICENSE | head -4
Copyright (c) 2015 HashiCorp, Inc.
Mozilla Public License, version 2.0
$ curl -sL https://raw.githubusercontent.com/hashicorp/vault/v1.15.0/LICENSE | head -6
License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.
"Business Source License" is a trademark of MariaDB Corporation Ab.
Parameters
Licensor: HashiCorp, Inc.
Licensed Work: Vault 1.15.0-rc1. The Licensed Work is (c) 2023 HashiCorp, Inc.
Additional Use Grant: You may make production use of the Licensed Work, ...
The BSL's operative restriction — production use is permitted, but offering the software as a competing commercial service is not, until each release's change date — was aimed at cloud providers in general. But the affected party that actually moved first was not a cloud provider. It was an IBM-anchored Linux Foundation project.
The Fork That Had to Exist (October–December 2023)
An edge project with a compliance problem
Open Horizon — IBM's LF Edge edge-computing framework, along with EdgeX Foundry — used Vault internally and was offered commercially by other organizations. Under the BSL, that combination became impossible. Joe Pearson, Open Horizon's project chair and an IBM technology strategist, explained the bind to TechTarget in words that should be quoted in every postmortem of the BSL era: "Open Horizon's goal is not to compete with Hashicorp Vault, and in fact, they've built a great product with which we would like to continue to provide compatibility. Unfortunately, Linux Foundation projects cannot embed BSL-licensed code. So we've been placed in a situation where our alternatives are to switch to a competing product with an open-source friendly license or to fork an earlier MPL-licensed branch of Vault and continue to maintain that ourselves going forward."
The design-candidate submission for Open Horizon considered adopting EnvKey instead — and rejected it on migration cost. In late October 2023 the technical committee voted to fork. The repository was created on November 9, 2023 at 18:17 UTC — the same day as the first working group meeting — and issue #1 appeared the next morning, opened by Nathan Phelps, an IBM senior software engineer: "Fork the current and near future Vault source to this repository. Must include the current and future source for the 1.14.x stream of Vault changes." The assignment of that issue to Jeremiah Butler on November 27 — "I'll start by updating the import references and getting it building in our repo" — and its eventual closure by PR #45, "feat: rename Vault to OpenBao in build files", in February 2024, is the fork's birth certificate.
What the import actually looked like
The fork did not start from a tarball. OpenBao imported Vault's full git history — its oldest commit is still the February 25, 2015 initial commit — and then began a compliance scrub on top. The early native commits read like a sterilization log: "[COMPLIANCE] Add Copyright and License Headers" (PR #50, November 1, 2023), "enos: fix licensing on backported files" (PR #24162, November 16, 2023), and dependency bumps from the new repo's own PR numbering (#39, #40) interleaved with the last upstream Vault commits still flowing in from the release/1.14.x branch — including "Bumped product version to 1.14.7" on November 8, 2023, which pins the fork point: the last MPL-licensed maintenance line, a few commits ahead of v1.14.7, just before HashiCorp moved even its maintenance branches under the BSL.
openbao/openbao (repo created 2023-11-09T18:17:33Z; full Vault history imported)
─── inherited Vault release/1.14.x commits (original authors, original dates) ───
2023-10-27 274436c097 api/seal-status: fix deadlock when namespace is set (#23879)
2023-11-01 16379d3422 [COMPLIANCE] Add Copyright and License Headers (PR #50, native)
2023-11-02 1e7a059c84 Automated dependency upgrades (PR #40, native)
2023-11-02 8af09a9b7d Bump github.com/docker/docker 24.0.5 -> 24.0.7 (PR #39, native)
2023-11-06 891eb6fd7c backport of commit b19562db9a... (Vault #24025)
2023-11-08 ac2934ddf4 Bumped product version to 1.14.7. (Vault-era tip)
─── the fork's own line begins ───
2023-11-13 ed85e15d84 manual backport (PR #24035)
2023-11-16 ba810a9f1f enos: fix licensing on backported files (PR #24162)
2023-11-17 5e539a5751 Bump github.com/docker/docker ... (#214) (native PR #214)
2023-12-21 8993802145 backport of commit ac1e9194... (#24523) ← plugin execution
core at vault/plugin_catalog.go L829-840: +9/-0,
largely UNCHANGED until the September 2026 RCE fix
2024-02-05 PR #45 feat: rename Vault to OpenBao in build files (closes issue #1)
IBM's fingerprints, on the record
The governance record is unambiguous about who founded the fork's technical steering committee: the LF Edge proposal lists five founding organizations — IBM, IOTech Systems, Viaccess-Orca (Orange), WALLIX, and ZEDEDA — with thirteen initial committers including Nathan Phelps (IBM, Open Horizon) and Alexander Scheel, the independent maintainer who would later do the security work at the center of this story. The TSC was formalized in June 2024 per the project's own GOVERNANCE.md. At the December 2023 launch, IBM had "not (yet) officially endorsed" the project, as The Register put it — but the HN launch thread (314 points, December 9, 2023) caught the subtext anyway. One commenter put it flatly: "IBM, somewhat unofficially, is behind this recent fork." And a self-described HashiCorp engineer, posting from a throwaway account in the same thread, supplied the detail that reframes the entire BSL episode: "There's no overall consensus within engineering about the change itself. What is amusing is that most of the public response has been aimed at Terraform whilst internally Terraform wasn't the concern. It was Vault. It was IBM." Fourteen months later, IBM announced it was buying HashiCorp.
The launch thread also preserved the complaint that would define the fork's most visible
engineering work. The top comment, from a frustrated Vault operator: "Vault had a lot of
community contributions blocked or stalled due to internal politics/roadmap stuff at
[HashiCorp]... the Vault plugin model is terrible IMO... Lifecycling plugins, especially
with container deployments of Vault, is a nightmare." An OpenBao maintainer replied asking
for issues. Three years later, OpenBao 2.6/2.7 shipped OCI-based plugin distribution with
digest pinning, automatic registration, and a bao plugin prune
command — the nightmare, addressed.
Two Binaries, One Hull: The Divergence (2024)
OpenBao's versioning decision was itself a statement: the first release was not 1.15 — it was 2.0.0. The jump over Vault's entire 1.x line said out loud what the LICENSE diff implied: this is a different product now. The alpha arrived March 29, 2024, the beta on June 18, and GA on July 16, 2024 — with a warning banner in its own release notes that tells the deeper licensing story better than any blog post: "OpenBao's 2.0.0 GA does not include the builtin WebUI! You can only access a running Bao instance via the CLI or API." Vault's web UI had never been plain MPL-2.0 code; the fork could not ship it. The UI was rebuilt and reintroduced in v2.2.0 (March 5, 2025, PR #940) — eight months of GA spent as a headless secrets server.
The 2.0.0 changelog is a catalog of the fork's early instincts, and several entries read
as corrections to Vault's oldest operational debts: mlock functionality was removed
outright (PR #363) — two years before IBM-era Vault would concede the same point in its
2.2.0 breaking change ("Remove cap_ipc_lock capability
on vault at build time... Operators should set
disable_mlock = true"); the Shamir implementation was
hardened to shuffle X coordinates with a CS-PRNG instead of math/rand
(PR #210); cert auth was fixed to compare the full bytes of trusted leaf certificates
"to prevent trusting certs with the same serial number but not the same public/private
key" (PR #173); Transit gained XChaCha20-Poly1305 keys (PR #36) and lost the convergent
encryption modes migrated from Vault v0.6.2 (PR #85). And in one of the more aggressive
supply-chain moves any fork has made, OpenBao retracted every prior Vault version of its
core, api, and sdk Go modules (PR #238) — anyone resolving the module path gets the
fork's versions only, by design.
hashicorp/vault release/1.14.x (MPL-2.0, ~v1.14.7, Nov 2023)
│
┌──────────────────────────┴───────────────────────────┐
│ │
openbao/openbao 2.0.0 (Jul 2024) hashicorp/vault 1.15.0 (Sep 2023)
│ (BSL 1.1 from day one)
- no WebUI until 2.2.0 (PR #940) - Enterprise: namespaces, HSM,
- mlock removed (#363) KMIP, replication, Sentinel
- Shamir CS-PRNG (#210) 1.16-1.20 (2024-25): plugin downloads
- retracts all Vault module tags (#238) from releases.hashicorp.com (beta),
- XChaCha20-Poly1305 transit (#36) SCEP (Ent), automated root rotation
- cert-serial full-bytes fix (#173) 1.20.1 (Aug 2025): CVE-2025-6000 fix
│ 2.0.0 (Apr 2026): major bump, rejects
2.2.0 (Mar 2025): WebUI returns non-canonical URL-encoded paths
2.3.1 (Jun 2025): NAMESPACES (OSS) 2.1.2 / 2.2.0 / 2.2.1 (Oct 2026):
2.4.4 (Nov 2025) … Sept-2026 chain fixed, silently
2.6.0 (Jul 2026): namespace SEALING (#3297),
KMS unseal plugins, workflows, distroless
2.6.3 + 2.7.0 (Sep 2026): RCE chain fixed,
ML-DSA/PQC, External Keys, PebbleDB
│ │
└─── both still execute plugins through the same 0.8.0-era core:
vault/plugin_catalog.go, plugin_directory, sha256 pinning ───┘
The Counter-Moat: Namespaces for Everyone (2025)
The New Stack's December 2023 prediction — that the fork would port Enterprise features —
became the announcement of May 30, 2025: "Announcing OpenBao Namespaces," by Christoph
Voigt. The framing was architectural, not commercial: "Each namespace acts like a
mini-OpenBao, with its own policies, authentication methods, secret engines, tokens, and
identity groups," enabling "a true OpenBao-as-a-Service model" where tenant administrators
self-manage without cluster-level operators. The blog also declared namespaces "one of a
few planned stepping stones towards OpenBao's horizontal scalability journey." Namespaces
went beta in v2.3.0-beta20250528 (May 28, 2025) and GA in v2.3.1 (June 25, 2025). The
per-namespace system backend — visible in the output as
ns_cubbyhole, ns_identity,
ns_system accessors — later became a single shared
sys backend across all namespaces in 2.6.0 (PR #3007), an idle-memory optimization that
itself became relevant to the September 2026 story.
# creates a namespace "tenants" on root level
$ bao namespace create tenants
# creates a child namespace within tenants
$ bao namespace create -ns tenants tenant-c
# creates a child namespace within tenants/tenant-c
$ bao namespace create -ns tenants/tenant-c prod
$ bao secrets enable -ns=tenants/tenant-c/prod -description="Production Secrets" kv
Success! Enabled the kv secrets engine at: kv/
$ bao secrets list -ns tenants/tenant-c/prod
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ ns_cubbyhole cubbyhole_9a4e44d3 per-token private secret storage
identity/ ns_identity identity_61c42408 identity store
kv/ kv kv_b993bbec Production Secrets
sys/ ns_system system_ba514ba2 system endpoints...
Then the fork went past parity. OpenBao 2.6.0 (July 14, 2026) added Namespace Sealing (PR #3297): "Partitions tenant storage with distinct cryptographic key material. Allows tenants to revoke access to their namespace via seal operation without impacting other tenants." A tenant locking itself out of its own namespace data without a cluster-wide seal event is a primitive Vault Enterprise never shipped — the community edition of the fork had overtaken the commercial edition of the ancestor on the exact feature that defined the ancestor's moat.
Governance moved the same season. On March 28, 2025, Alexander Scheel opened the application to move OpenBao laterally within the Linux Foundation — from LF Edge to the OpenSSF as a sandbox project (ossf/tac PR #461). The application was candid: "We currently receive no budget from LF Edge," the contributor base was "not Edge-aligned and instead more broadly security focused," and LF Edge's foundation membership requirements were ones "this project cannot meet." The LF Edge TAC chair approved with no objections. On June 17, 2025, OpenBao joined the OpenSSF. The project that exists because of a license fight had found its durable home in the security foundation — with its maintainer base now including ControlPlane (which also staffs Flux maintainers), the same company that would coordinate the 2026 RCE response.
IBM Buys the Mothership (2025)
The acquisition HashiCorp's throwaway-account engineer had hinted at closed on February 27, 2025: IBM bought HashiCorp for $6.4 billion, taking custody of Vault — and with it the ancestor of a fork its own edge project had seeded. The corporate irony is now the defining governance fact of the ecosystem: the company whose engineers founded OpenBao's TSC, and which sat on that TSC in the months after the acquisition closed, owns the upstream whose security coordination the fork would later beg for in writing.
IBM-era Vault renumbered. Vault 2.0.0 shipped April 14, 2026 — a major-version bump that vaulted past the fork's own 2.x line — carrying, among its security entries, "core: reject URL-encoded paths that do not specify a canonical path." That single changelog line is the quiet beginning of IBM's hardening against the exact vulnerability class (non-canonical path handling) that the September 2026 chain would weaponize. An Enterprise 1.21 LTS line continued shipping patches in parallel, and the Enterprise feature conveyor kept moving: a PKI External CA plugin that acquires certificates from public CAs through ACME, first-class AI Agent support with an Agent Registry and OAuth resource server (beta, Enterprise), KMIP and SCEP plugins. The community edition, as before, got the funnel.
August 2025: The First RCE and the Broken Channel
HCSEC-2025-14: eight years of dormant attack surface
On August 1, 2025, HashiCorp published HCSEC-2025-14: "Privileged Vault Operator May
Execute Code on the Underlying Host" — CVE-2025-6000, CVSS 9.1, CWE-94. The mechanics
married two features that had coexisted since the plugin era: a privileged operator with
write access to sys/audit in the root namespace could
create audit log files inside a configured
plugin_directory, then use plugin registration to
execute them — reproducing an audit file's HMAC'd contents well enough to satisfy the
registration checksum, and getting arbitrary code execution on the host. The affected
range told the real story: every Vault since 0.8.0 — August 9, 2017. The
bug had been live for eight years and through eighteen minor releases. Fixes shipped in
Community 1.20.1 and Enterprise 1.20.1, 1.19.7, 1.18.12, and 1.16.23.
HashiCorp disclosed unilaterally. OpenBao — whose codebase carries that same 2017 plugin-execution lineage — had no patch on disclosure day. Its mirror advisory, GHSA-xp75-r577-cvhp / CVE-2025-54997 ("Privileged OpenBao Operator May Execute Code on the Underlying Host," critical), shipped with v2.3.2 on August 8, 2025, alongside a batch of same-day fixes including a token-privilege elevation (CVE-2025-54996). Seven days of publicly-documented critical exposure for every OpenBao deployment, because the two projects no longer had a working channel.
CVE-2025-6000 (Aug 2025) CVE-2026-104090 (Sep 2026)
───────────────────────── ─────────────────────────
requires: privileged operator requires: UNAUTHENTICATED entry point,
write to sys/audit then chain of 3 bypasses to reach
plugin_directory configured snapshot restore capability
write path: audit log files dropped write path: sys/storage/raft/snapshot-force
INTO the plugin directory (restores attacker-owned Raft
state into the live cluster)
execution: plugin registration runs execution: snapshot carries a REPLACED
the audit file, checksum plugin catalog entry; plugin command
reproduced by guessing the resolves OUTSIDE plugin_directory —
audit device's HMAC prefix works on read-only container images,
read-only images, ANY binary on host
bound to: the configured bound to: NOTHING — "full, unconditional
plugin_directory code execution against any
pre-existing binary on the system"
How the channel died, in the maintainers' own timeline
ControlPlane's September 2026 post — written by Alexander Scheel, the OpenBao maintainer who developed the embargoed patches — lays out the coordination history with dates. When IBM sat on OpenBao's TSC immediately after the acquisition closed, "a mutual disclosure policy between the two projects was proposed." In September 2025 it was revisited with HashiCorp's security department "in connection with an active mutual disclosure" — by then, "many of these former colleagues are no longer with the business." In May 2026, with introductions from OpenSSF staff, OpenBao reached out to IBM's senior leadership to seek a mutual disclosure agreement. The post's next sentence is six words: "IBM is unwilling to discuss one." And because "too many vulnerabilities have been unilaterally disclosed by HashiCorp — including last year's RCE — the OpenBao maintainers declined to continue proactively disclosing and coordinating vulnerabilities with HashiCorp." Two codebases sharing 2017-vintage plugin internals, with no agreement on how to warn each other. What followed was predictable, and it arrived in September 2026.
September 2026: The Chain That Proved the Point
On September 23, 2026, OpenBao shipped two releases in the same hour — v2.6.3 at 17:06 UTC and v2.7.0 at 17:39 UTC — fixing what ControlPlane's post, published five days later, described as "a full exploit chain from unauthenticated access to full remote code execution," and "the second-ever remote code execution vulnerability in Vault and OpenBao." The chain stitched together disclosures from three independent reporters: Tuan Do (Calif.) reported the snapshot-restore RCE on September 4; Mike Reed reported the namespace policy traversal on September 8; Marc Ilunga (Trail of Bits, whose "Patch the Planet" engagement with OpenBao began September 14) found the ACME bypass on September 15 and independently rediscovered the RCE a day later; Jonas Köhnen (Reply) developed the embargoed traversal patch. Alexander Scheel developed the other embargoed patches and the full-chain PoC on September 24. The post's acknowledgements section contains the era's signature sentence: "All but one vulnerability discovered in this release was found by an AI."
attacker (unauthenticated, on the network)
│
│ ① GHSA-x8fg-h69x-p28f / CVE-2026-104092 (CVSSv4 8.2, High)
│ PKI ACME validation bypass: solve challenges for any domain, get a
│ certificate carrying an UNVALIDATED URI SAN of the attacker's choice
▼
certificate identifying the service provisioner (SPIFFE SVID assumed via URI SAN)
│
│ ② authenticate to the sandboxed Certificate Auth engine (as the
│ provisioner — privileged inside the sandbox, nothing outside it)
▼
│ ③ GHSA-fg5x-7whg-6c28 / CVE-2026-104093 (CVSSv4 7.6, High)
│ ACL deny bypass via NON-CANONICAL URL access: overwrite the admin
│ role's required URI SANs using a case-variant path ("AdMiN")
▼
re-authenticate as the sandbox admin → update own policy, add token policy
│
│ ④ GHSA-mjch-vcw3-hhmf (CVSSv4 7.7, High)
│ cross-namespace policy resolution via path-cleaning traversal in
│ the LRU policy cache → reach into the ROOT namespace's policies
▼
re-authenticate with root-namespace token policy → snapshot restore capability
│
│ ⑤ GHSA-j6wc-jpvg-xfxq / CVE-2026-104090 (CVSSv4 9.4, CRITICAL)
│ sys/storage/raft/snapshot-force: restore ATTACKER-OWNED Raft state,
│ unseal with ATTACKER keys, snapshot carries a REPLACED plugin
│ catalog whose command resolves OUTSIDE plugin_directory
▼
remote code execution — any pre-existing binary on the host, one-shot,
attacker supplies many (path, SHA-256) guesses per snapshot
| Advisory | CVE | CVSSv4 | Component | Fixed in |
|---|---|---|---|---|
| GHSA-j6wc-jpvg-xfxq | CVE-2026-104090 | 9.4 Critical | RCE via sys/storage/raft/snapshot-force plugin catalog replacement | v2.6.3 / v2.7.0 |
| GHSA-x8fg-h69x-p28f | CVE-2026-104092 | 8.2 High | PKI ACME issues certificates with unvalidated SANs | v2.6.3 / v2.7.0 |
| GHSA-mjch-vcw3-hhmf | — | 7.7 High | Policy cache cross-namespace traversal (LRU cache, path.Join cleaning) | v2.6.3 / v2.7.0 |
| GHSA-fg5x-7whg-6c28 | CVE-2026-104093 | 7.6 High | ACL deny bypass via non-canonical URL access (case normalization) | v2.6.3 / v2.7.0 |
| GHSA-cg72-x35g-xfp8 | — | Low | Plugin registration APIs not limited to root namespace | v2.6.3 / v2.7.0 |
| GHSA-2cjw-94fw-wqjx | — | Medium | Open redirect in the OIDC UI (prompt=none) | v2.6.3 / v2.7.0 |
| GHSA-8xxq-mq9m-xmhw | — | Low | Malformed TypeKVPair/TypeHeader leak into audit logs in plaintext | v2.6.3 / v2.7.0 |
| GHSA-hr5j-3j78-4vh2 | — | Low | Denied-wildcard ACL bypass via identity metadata | v2.6.3 / v2.7.0 |
The bug that lived in both hulls
The most sobering evidence in the disclosure is a GitHub blame link. The plugin-execution
core the RCE abuses — vault/plugin_catalog.go, lines
829–840 — traces to commit 8993802145833ab01d49c6070d787a9eccb81546, a nine-line backport
dated December 21, 2023, inherited from the 1.14.x lineage and "largely unchanged for
several years," as the post puts it. The policy-store bypass traces to the
path.Join(...) path-cleaning behavior at
policy_store.go L881–883; the case normalization the
ACL bypass abused lives at builtin/credential/cert/path_certs.go
L237–241, "particularly pervasive across the project." These are not OpenBao bugs or Vault
bugs. They are 1.14.x bugs that both ships carried, and both ships' recent
re-architectures — OpenBao's OCI-based plugin distribution, Vault's remote containerized
plugin execution — "both of which missed this vulnerability," in the post's words. The
fork war split licensing, governance, and feature sets; it did not split the attack
surface. Only the remediation split — and that is precisely what no coordination
agreement means in practice.
OpenBao's fixes landed in one PR (#4065, backported across both release trains): plugin
command names must resolve relative to plugin_directory
before execution; plugin catalog writes are restricted to the root namespace; ACME
issuance of non-validated SANs is forbidden outright; and the SDK gained a
ResolvePathOperation primitive "to report canonical
URLs prior to ACL evaluation" — canonicalization moved from convention into the
request path itself. For operators who could not upgrade immediately, the post's
workaround list was short and blunt: disable plugins entirely (remove
plugin_directory from the configuration), or set
BAO_DISABLE_PUBLIC_ACME to force EAB on ACME
cluster-wide — "a significant, breaking change to roll out if it is not already
enforced."
The remediation race, on the other side
Vault's own changelog tells the other side without ever mentioning OpenBao. On October 7,
2026 — fourteen days after OpenBao's release — Vault 2.1.2 appeared with: "Fix plugin
catalog entries restored from a raft snapshot, written through sys/raw,
or replicated being able to run a binary outside plugin_directory,"
plus use-time enforcement ("Plugin catalog entries are now checked against
plugin_directory whenever they are used, not only at
registration"). On October 15, Vault 2.2.0 rejected ACME finalizations carrying
URI, email, or Other SANs under the default policy — with an escape hatch named, without
apparent irony, sign-verbatim-unsafe — and fixed the
case-variant exact-deny bypass across AppRole, AWS, Azure, GCP, Kubernetes, SCEP, TPM,
GitHub, certificate, policy, and userpass names. On October 22, Vault 2.2.1 fixed the
policy cache-key collision that let policy-name aliases like "./root" and "a/../root"
resolve to the immutable root policy. Twenty-two to twenty-nine days behind the fork,
with no coordinated advisory, no shared CVE, and one upgrade hazard IBM shipped quietly
in the changelog: "Existing deny rules using mixed-case resource names will fail open
(become allow-all) after upgrade until rewritten with lowercase names."
As of November 11, 2026 — seven weeks after the chain's publication — ControlPlane's post still reads "This post will be updated when IBM's HashiCorp Vault remediates the below vulnerabilities," and the October releases answer it in the changelog's whispers rather than in a coordinated announcement. Both codebases are now patched for the published chain; neither project will say so in the same document.
The Scoreboard, November 2026
| Dimension | OpenBao 2.7 (OpenSSF sandbox, MPL-2.0) | Vault 2.2 CE + Enterprise (IBM, BSL 1.1) |
|---|---|---|
| License | MPL-2.0, OSI-approved, LF/OpenSSF governance, TSC formed June 13, 2024 | BSL 1.1 per release; competing commercial offering restricted until change dates |
| Namespaces | Community edition since 2.3.1 (Jun 2025); namespace sealing with per-tenant key material since 2.6.0 | Enterprise edition only; no per-namespace sealing |
| Post-quantum crypto | ML-DSA (FIPS 204) in PKI and Transit; pure-PQC TLS key exchange (tls_key_exchange_preferences: SecP256r1MLKEM768, X25519MLKEM768, MLKEM1024) | Not in the 2.x changelog through 2.2.1 |
| External key material | External Keys API: PKI/Transit sign with keys held in HSM/KMS via pluggable KMS providers (PKCS#11 plugin, Transit-backed) | Managed keys + HSM auto-unseal (Enterprise) |
| Plugin distribution | OCI images with manifest-digest pinning, plugin_version=latest, bao plugin prune, declarative registration without sha256 for manual installs | Download from releases.hashicorp.com (beta); external plugin execution Enterprise-only |
| Auto-unseal | KMS plugin type — awskms/azure/gcp/oci/alicloud/pkcs11 all moved OUT of the binary to plugins in 2.7; HSM distribution discontinued in favor of the PKCS#11 plugin | Built-in seals; HSM auto-unseal (Enterprise) |
| Storage | Raft, PostgreSQL with read scalability + HA (physical replication only), new PebbleDB backend; file backend removed | Raft, Consul, cloud backends; Integrated Storage tooling matured over a decade |
| Enterprise extras | None native — third parties (ControlPlane Enterprise for OpenBao, Secretz) sell support; ControlPlane recommends PostgreSQL storage | Sentinel, replication, KMIP/SCEP, PKI External CA plugin, AI Agent Registry + OAuth resource server (beta), HCP Vault Dedicated |
| Community gravity | 8,975 stars; Nvidia adoption disclosed June 2026; maintainers sponsored by ControlPlane | 36,497 stars; the install base and plugin ecosystem everything else targets |
| Security posture | 51 published advisories since 2025; Sept 2026 chain fixed on disclosure day; patch cadence ~weekly during active triage (Oct 1 and Oct 26 follow-up batches) | HCSEC process; Sept 2026 chain fixed 14–29 days after the fork's disclosure, silently; mixed-case deny rules fail open until rewritten |
Honest weaknesses — OpenBao
The upgrade tax is real and recent. OpenBao 2.7.0 alone removed the
built-in LDAP, Kerberos, and RADIUS auth engines from the main binary (now external
plugins, PR #3882), removed every built-in cloud KMS seal, removed the HSM distribution,
removed the file storage backend, and moved the Go
module to github.com/openbao/openbao/v2 with most code
behind internal/ (PR #3210) — packagers must rewrite
their ldflags. If you run a brownfield OpenBao deployment, 2.6→2.7 is a project, not a
bump.
Its security record is transparent because it has to be. Fifty-one published advisories since mid-2025 is the honest cost of running a secrets manager under modern AI-assisted auditing with a Trail of Bits engagement — and several of those bugs (namespace traversal, LIST deny bypass, recovery-mode timing leak) were in code the fork itself wrote or ported. The namespaces port, for all its strategic value, introduced the cross-namespace policy cache traversal that became step four of the 2026 chain.
Enterprise support is third-party, not first-party. No OpenBao vendor is contractually obliged to answer a 3 a.m. page; the commercial ecosystem (ControlPlane, Secretz) is young, and the OpenSSF sandbox stage means the foundation's involvement is still largely governance, not funding.
Honest weaknesses — Vault
The disclosure posture is now a documented liability. The maintainer who coordinated the 2026 response states in print that IBM declined to discuss a mutual disclosure agreement after three attempts across a year, and that Vault customers "were impacted at the time of release, with no mitigations in place." The October 2026 fixes shipped 14–29 days after the fork's, without coordinated advisories.
BSL compliance is an ongoing engineering constraint for your users. Any internal platform that embeds, repackages, or offers Vault-derived services — the exact thing an internal developer platform does — needs counsel to read the Additional Use Grant per release. The license that created OpenBao has not changed.
Its community edition is a funnel, and the funnel shows. Through 2.2.1, post-quantum crypto, per-tenant sealing, and OCI-native plugin distribution all live outside IBM's community line — two of them in a competitor's MPL codebase. And the 2.2.x mixed-case deny fail-open migration is the kind of sharp edge a coordinated disclosure process would have surfaced loudly rather than in a changelog bullet.
The Verdict
Three years in, the fork war has produced a genuinely unusual equilibrium. OpenBao is no longer a protest project; it is the OpenSSF-hosted, ML-DSA-shipping, namespace-sealing heir to Vault's open-source lineage, with an advisory cadence that outpaces its ancestor's and an enterprise-features-for-everyone strategy that has already erased the fork's biggest functional gap. Vault under IBM is the install-base incumbent with the Enterprise conveyor belt, HCP, and a compliance story (FIPS, Sentinel, KMIP) the fork does not try to match — and it is now visibly behind on disclosure coordination, an area where a secrets manager cannot afford to be behind anyone.
The strategic lesson for platform teams is the one the 2017-vintage plugin core teaches: forking splits governance, not attack surface. The September 2026 chain hit both codebases because both still run code their authors shipped eight years and one acquisition ago, and the only difference between the two outcomes — 0 days versus 14–29 days of exposure — was organizational, not technical. When you choose between these two, you are no longer primarily choosing a feature list. You are choosing whose security process you trust to tell you first.
Who should skip this
Teams standardized on Vault Enterprise compliance machinery. If your operating model is FIPS-validated HSM auto-unseal, Sentinel policy, KMIP clients, or HCP Vault Dedicated with an IBM paper trail behind it, OpenBao's third-party support ecosystem is not yet an equivalent procurement story. The fork's PQC and namespaces work is impressive; your auditor's checklist is not moved by impressiveness.
Greenfield teams without a secrets-management problem worth owning. If you have one cloud account and a dozen workloads, a managed KMS plus your cloud's native secrets manager — or External Secrets Operator pointed at it — beats operating either a Vault or an OpenBao cluster, with its unseal ceremonies, storage backends, upgrade taxes, and 51-advisory patch cadence. The barrier architecture is for platforms, not projects.
Organizations that cannot stomach a young commercial ecosystem. OpenBao the codebase is battle-inherited; OpenBao the vendor relationship is three years old, sandbox-stage, and staffed by maintainers whose employers happen to care. If you need a decade-old SLA culture behind your secrets infrastructure, that product is called Vault Enterprise — and its 2026 disclosure record is the price you accept for the maturity.
Anyone planning to ignore the shared lineage. The single worst outcome of the fork war would be assuming either side's patches cover you. If you run Vault, OpenBao's September advisories are your reconnaissance report on your own binary — the ACME, canonicalization, and plugin-catalog families landed in your codebase too, three weeks later and quieter. Read both changelogs. The attackers already do.
Timeline: From One Repo to Two Ships
- 2015-02-25 — hashicorp/vault is created; the initial commit
ed3069f01dstill anchors the LICENSE history OpenBao inherits today. - 2015-04-28 — v0.1.0 "Initial release" and a 440-point Hacker News launch on the same day. The encrypted-barrier, lease-bearing secrets service is born.
- 2017-08-09 — Vault 0.8.0 ships the external plugin architecture — the code floor of CVE-2025-6000, eight years before its disclosure.
- 2018-04-10 / 2018-12-03 — 0.10.0 adds versioned KV; 1.0.0 declares Integrated Storage (Raft) production-ready.
- 2023-06-21 — Vault 1.14.0 ships the PKI ACME server with its own EAB recommendation — step one of the 2026 exploit chain, three years early.
- 2023-08-10 — HashiCorp announces the Business Source License switch for Vault and its siblings. The last MPL train is 1.14.x.
- 2023-09-26/27 — v1.14.4 (last MPL release) and v1.15.0 (first BSL release) ship a day apart; the LICENSE header swap is byte-verifiable at the tags.
- 2023-10/11 — Open Horizon's technical committee votes to fork; the openbao/openbao repo is created November 9 (18:17 UTC, the same day as the first working group meeting); IBM's Nathan Phelps opens issue #1 the next morning demanding "the current and future source for the 1.14.x stream."
- 2023-12-09 — Public reveal at Open Source Summit Tokyo (via OpenTofu's Sebastian Stadil) and a 314-point HN launch thread; the "It was Vault. It was IBM" insider comment lands in the discussion.
- 2024-02-05 — PR #45 "feat: rename Vault to OpenBao in build files" closes issue #1. The fork has a name in its own build system.
- 2024-03-29 / 2024-07-16 — OpenBao 2.0.0 alpha, then GA — deliberately skipping past Vault's 1.x line, shipping without the WebUI, retracting all prior Vault Go module tags, and removing mlock.
- 2024-06-13 — The OpenBao TSC is formed under the LF Edge charter; the June 2024 startup period begins.
- 2025-02-27 — IBM's acquisition of HashiCorp closes. The company that seeded the fork now owns the ancestor — and sits on the fork's TSC.
- 2025-03-05 / 2025-05-30 — OpenBao reintroduces the WebUI (PR #940), then announces namespaces — Vault Enterprise's flagship moat — for the community edition; GA in v2.3.1 on June 25.
- 2025-06-17 — OpenBao joins the OpenSSF as a sandbox project, a lateral Linux Foundation transfer proposed by maintainer Alexander Scheel and approved by both TACs.
- 2025-08-01 — HashiCorp unilaterally discloses CVE-2025-6000 / HCSEC-2025-14 (CVSS 9.1, live since 0.8.0). OpenBao, sharing the plugin-execution lineage, patches in v2.3.2 on August 8 — a seven-day exposure window with no working channel.
- 2026-04-14 — IBM-era Vault renumbers to 2.0.0 and begins rejecting non-canonical URL-encoded paths — hardening against a vulnerability class it does not yet know is weaponized.
- 2026-07-14 — OpenBao 2.6.0 ships namespace sealing (per-tenant key material), KMS auto-unseal plugins, and the declarative self-initialization engine.
- 2026-09-04→23 — Three independent reporters disclose a four-vulnerability chain; embargoed patches ship in OpenBao v2.6.3 and v2.7.0 the same day. IBM declines a mutual disclosure agreement for the third time in a year; Vault customers get no coordinated advisory.
- 2026-10-07 / 10-15 / 10-22 — Vault 2.1.2, 2.2.0, and 2.2.1 fix the plugin-catalog-from-snapshot RCE, the ACME SANs bypass, the case-variant deny bypass, and the policy cache-key collision — 14 to 29 days behind the fork, with mixed-case deny rules failing open until rewritten. The hull was shared; the calendar was not.