How Spice AI responded to the eMudhra certificate compromise
Spice AI
Spice OSS
Releases

Phillip LeBlanc
Co-Founder and CTO of Spice AIOctober 22, 2026
TL;DR: The private keys of eight eMudhra intermediate CA certificates can be recovered from the certificates themselves, so anyone can issue a trusted TLS certificate for any domain under them. Spice v2.3.3, Spice v2.4.0-rc.3, and Spice.ai Enterprise v2.2.2 and v1.11.7 stop trusting those intermediates, in the spiced binary and in the Docker images. The Spice Cloud Stable channel now runs v2.3.3. Upgrade Spice and update your operating system's CA certificates. Our tests show the OS update is the half you cannot skip.
What this post covers:
- What happened, and why server-side TLS clients were exposed when browsers were not
- How Spice decides which certificates to trust, and what our tests found
- What we shipped, and when
- What to upgrade on Spice Cloud, Spice.ai OSS, Spice.ai Enterprise, and the SDKs
- How to verify a deployment
What happened
On October 17, 2026, a researcher showed the browser root programs that the private keys of eight eMudhra intermediate CA certificates were compromised. The proof was a message signed with each of the eight keys. eMudhra generated the keys incorrectly, so anyone can recover them from the public certificates. The flaw dates back to when the intermediates were created in April 2025.
An attacker with one of those keys can issue a certificate for any hostname, and any client that trusts the intermediate accepts it. Cloudflare's write-up covers the incident and its own response. A crowdsourced tracker lists patched packages and runs test hosts that serve certificates under the compromised intermediates.
Browsers were not the exposed population. Firefox, Chrome, Edge, and Safari enforce Certificate Transparency (CT), and the intermediates have no CT log entries for that period, so a forged certificate would not have passed. The root programs also pushed the block through their revocation channels (OneCRL, CRLite, and CRLSets): Firefox and Chrome on October 17, Apple on October 19, and Microsoft on October 20.
Server-side TLS clients are a different story. Most do not enforce CT or consume browser revocation lists: they trust whatever their trust store contains until a software update changes it. Spice is one of those clients.
Why it matters for Spice
Spice is a TLS client for most of the work it does. It federates queries to databases, warehouses, object stores, and HTTP sources, and it calls model providers. Those connections carry credentials and query results.
An attacker who can intercept traffic between Spice and one of those endpoints can present a certificate for the endpoint's hostname, issued with one of the compromised keys. An unpatched Spice accepts it, and the attacker can then read or change everything on the connection, credentials included. The key half of that attack is now available to anyone. The network position is the only remaining barrier, and it is not one to rely on.
We confirmed the exposure directly. Spice v2.3.2, in the published spiceai/spiceai:2.3.2 image, connected to the tracker's test hosts and registered datasets from them. eMudhra has revoked the intermediates, and that made no difference: Spice does not check certificate revocation lists (CRLs) today. CRL support is on the roadmap for Spice v2.5.0.
How Spice decides what to trust
Spice verifies a server certificate against one of two trust stores. Which one applies depends on the TLS library behind the connection:
- Built-in roots. Connections that rustls verifies against the bundled
webpki-rootsuse root certificates compiled intospiced. Changing them takes a new release. - The operating system's trust store. Connections through OpenSSL or
native-tls, and rustls connections that load the system certificates, use the OS CA bundle (ca-certificateson Debian and Ubuntu). Changing it takes an OS package update or an image rebuild.
The Spice Docker image is built FROM scratch, with its CA bundle copied from a debian:trixie-slim build stage. The image's trust store is whatever Debian shipped on the day of the build.
To see which store protects a real connection, we pointed the HTTPS data connector at the tracker's test hosts on Debian 13. We crossed the old and new spiced binaries with the old and new ca-certificates package:
spiced | ca-certificates | Result |
|---|---|---|
| v2.3.2 | 20250419 | Connected: trusts the compromised chain |
| v2.3.2 | 20250419+deb13u1 | Refused |
| v2.4.0-rc.3 | 20250419 | Connected: trusts the compromised chain |
| v2.4.0-rc.3 | 20250419+deb13u1 | Refused |
The OS trust store decides for this connector. The new binary rejects any chain through the eight compromised keys, but only on connections that rustls verifies. The HTTPS connector verifies against the OS trust store instead, so v2.4.0-rc.3 on an unpatched image still connected.
Spice's dependency tree also includes rustls clients built with the bundled roots, so a complete fix has to update both stores. That is why every release below changes the binary and the image together.
What we shipped
Each release makes the same three changes:
rustls-webpki0.103.13 to 0.103.16. Rejects any certificate chain that passes through one of the eight compromised intermediate keys, including the Sectigo cross-signed copies of the same keys. (v2.4.0-rc.3 moves from 0.103.15.)webpki-rootsandwebpki-root-certs1.0.7 to 1.0.10. Removes theemSign ECC Root CA - G3root from the built-in root bundle.ca-certificates20250419to20250419+deb13u1in the Docker images. Debian's security update, which distrusts theemSign ECC Root CA - G3andComodo AAA Services rootcertificates.
| Release | Distribution | Release notes |
|---|---|---|
| v2.3.3 | Spice.ai OSS and Spice.ai Enterprise | v2.3.3 |
| v2.2.2 | Spice.ai Enterprise | v2.2.2 |
| v1.11.7 | Spice.ai Enterprise | Certificate update only |
| v2.4.0-rc.3 | Spice.ai OSS pre-release | v2.4.0-rc.3 |
The patch releases need no configuration changes and have no breaking changes.
Spice Cloud runs the same fix, at two levels:
- The runtimes Spice Cloud deploys. The Stable channel, the default for Spice Cloud projects, now runs Spice v2.3.3.
- The Spice Cloud Platform itself. We updated the whole platform, including the Spice Cloud portal and the API service. The API service moved to
rustls-webpki0.103.16, so it rejects any chain through the compromised intermediates, whatever its CA bundle contains. That rollout reached every production region and dedicated cluster by October 22 at 03:22 UTC. Our infrastructure deployment pipelines also moved to Node.js 24.22.1, which carries the refreshed CA store.
Timeline
All dates are in 2026, UTC:
- October 17: The researcher proves the compromise to the root programs. Firefox and Chrome block the intermediates.
- October 19: Downstream trust stores receive the disclosure. Apple blocks the intermediates.
webpki-roots1.0.10 ships withoutemSign ECC Root CA - G3. - October 20:
rustls-webpki0.103.16 ships with the distrusted keys. Debian publishesca-certificates 20250419+deb13u1. Microsoft blocks the intermediates, and Cloudflare publishes its write-up. - October 21: The fix merges to Spice trunk.
- October 21 to 22: Spice v2.3.3, Spice.ai Enterprise v2.2.2 and v1.11.7, and Spice v2.4.0-rc.3 ship.
- October 22: The API service fix reaches every Spice Cloud production region and dedicated cluster. The Spice Cloud Stable channel moves to Spice v2.3.3.
What to do
Spice Cloud
Each deployment uses the latest runtime version on the project's update channel. A project on the Stable channel picks up v2.3.3 on its next deployment. To move now, open the project's Deployments tab and select Create Deployment.
Spice.ai OSS
Upgrade to v2.3.3 with the method you installed with:
spice upgrade
docker pull spiceai/spiceai:2.3.3
helm repo update && helm upgrade spiceai spiceai/spiceai --version 2.3.3On the v2.4 pre-release line, move to v2.4.0-rc.3 or later.
Spice.ai Enterprise
Pull the patched image for your release line from the AWS Marketplace registry:
- v2.3:
2.3.3-enterpriseor2.3.3-enterprise-jemalloc - v2.2:
2.2.2-enterprise - v1.11:
1.11.7-enterpriseor1.11.7-enterprise-models
v2.3.3 keeps the default allocator of the v2.3 line, the system allocator. To run jemalloc, the default in v2.4, use the -jemalloc image. The AWS Marketplace guide has the registry paths and Helm charts.
Your own images and hosts
- A Docker image you build yourself: rebuild it so it picks up
ca-certificates 20250419+deb13u1(or your distribution's equivalent), and build it on a patchedspiced. The rebuild fixes connections that use the OS trust store. Only the new binary fixes the built-in roots. - Spice outside Docker: upgrade
spicedand update the OSca-certificatespackage. The tracker lists the patched package version for each major distribution.
SDKs
The SDKs are TLS clients too. What to update depends on the trust store each SDK uses:
- Rust (
spice-rs): the SDK verifies with the bundledwebpki-roots. Its trunk now requires 1.0.10, and the next release includes that requirement. Until then, runcargo update -p webpki-roots -p rustls-webpkiin your application. - Python (
spicepy): the SDK verifies Flight connections againstcertifiunless you passtls_root_cert. Upgradecertifito 2026.10.19 or later withpip install --upgrade "certifi>=2026.10.19". - Go, Java, .NET, and JavaScript: update the language runtime and the OS CA certificates. The tracker lists the patched versions of Go, Java, and Node.js.
The trade-off is deliberate: a server that still uses one of these intermediates fails verification until it gets a new certificate. Fix the server's certificate, not the client. Disabling certificate verification to restore the connection removes the protection for every certificate, not only eMudhra's.
Verify a deployment
Add a probe dataset that points at the tracker's test hosts. Run it on a test runtime with the same image and host as production:
version: v1
kind: Spicepod
name: emudhra-check
datasets:
- from: https://dv-g3b-emudhra.we-have-a-problem.com/probe.csv
name: emudhra_probe
params:
file_format: csv
- from: https://dv-g3b-aaa-emudhra.we-have-a-problem.com/probe.csv
name: emudhra_aaa_probe
params:
file_format: csvThe first host chains the EM DV TLS CA - G3B intermediate to the emSign roots. The second chains the same intermediate to the AAA Certificate Services root through its cross-sign.
A patched runtime logs Cannot connect to the dataset emudhra_probe and never registers the dataset. That log line ends in error sending request and does not mention certificates. An unpatched runtime logs Dataset emudhra_probe registered: it trusted the compromised chain.
This check covers the HTTPS connector, which verifies against the OS trust store. It does not exercise the built-in roots, which only the binary upgrade changes.
eMudhra Certificate Compromise FAQ
Yes, before the patch releases. In our tests, Spice v2.3.2 accepted certificates issued under the compromised eMudhra intermediates. An attacker must also intercept the traffic between Spice and a data source to use a forged certificate.
Spice v2.3.3 and v2.4.0-rc.3 fix it for Spice.ai OSS. Spice.ai Enterprise v2.3.3, v2.2.2, and v1.11.7 fix it for each Enterprise release line. Each release updates the built-in root certificates and the CA certificates in the Docker images.
Create a new deployment for each project on the Stable channel. The Stable channel now runs Spice v2.3.3, and each deployment uses the latest version on its channel. We also updated the Spice Cloud Platform itself, including the Spice Cloud portal and the API service.
No. You must also update the CA certificates of the operating system. The Spice HTTPS data connector verifies certificates against the operating system trust store. In our tests, v2.4.0-rc.3 on an unpatched Debian 13 image still trusted a compromised chain. The updated Spice Docker images include both fixes.
No. Spice does not check certificate revocation lists (CRLs) today. CRL support is on the roadmap for Spice v2.5.0. Until then, Spice stops trusting a revoked certificate only after a trust store update.
Add a dataset that points at https://dv-g3b-emudhra.we-have-a-problem.com/probe.csv on a test runtime. A patched runtime logs Cannot connect to the dataset and does not register the dataset. An unpatched runtime registers the dataset.
No. Disabling verification removes the protection for all certificates, not only the eMudhra certificates. If a server uses a compromised eMudhra intermediate, replace its certificate with one from a different CA.