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



GHSA-RXHG-VCWW-2MPW

GHSA-RXHG-VCWW-2MPW: SQL Injection via ORDER BY Column Injection in Fleet Activity List Endpoints

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 21, 2026·5 min read·13 visits

Executive Summary (TL;DR)

An authenticated SQL injection vulnerability in Fleet allows attackers to use the ORDER BY clause on activity endpoints as an inference oracle, enabling character-by-character database exfiltration.

A SQL injection vulnerability exists in the activity list endpoints of Fleet Device Management. Authenticated users can manipulate the order_key parameter to sort database queries by arbitrary columns, including columns not projected in the SELECT query. This flaw allows attackers to establish an inference oracle to extract sensitive information from the database.

Vulnerability Overview

The Fleet Device Management platform exposes endpoints for querying global and host-specific activities. These feeds assist administrators in auditing system events and monitoring state changes across enrolled devices. The endpoints are exposed to authenticated users via the HTTP endpoints /api/v1/fleet/activities and /api/v1/fleet/hosts/{id}/activities.

A weakness in the sorting logic allows users to pass unvalidated column names to the query-sorting component. The underlying application database layer constructs dynamic queries incorporating the client-supplied sorting parameters. Because structural query components like column names cannot be bound via parameterized placeholders, the application was susceptible to sorting parameter manipulation.

An attacker with an authenticated session can exploit this behavior to reference database columns containing confidential details. This leads to unauthorized data access and information disclosure by bypassing standard data access controls.

Root Cause Analysis

The vulnerability stems from the use of unsafe dynamic SQL generation in the ListActivities and ListHostPastActivities database abstraction layer methods. Standard SQL parameters utilize placeholders to isolate values from the execution logic. However, structural query modifiers such as ORDER BY identifiers and direction directives do not accept parameter placeholders in MySQL.

To bridge this gap, Fleet utilized a helper function named platform_mysql.AppendListOptionsWithParams to build the query. This helper attempted to sanitize inputs by wrapping identifier strings with backticks to avoid immediate syntax anomalies. The logic lacked a validation mechanism to cross-reference input fields against a list of authorized database columns.

Consequently, any arbitrary column name or SQL function supplied to the order_key parameter was integrated directly into the ORDER BY clause. This permitted the construction of an inference oracle where boolean-based assertions alter the sequence of returned rows. Attackers leverage the variations in result sorting to deduce confidential database contents piece by piece.

Code Analysis

The vulnerability was resolved in Pull Request #49624 by transitioning to an allowlist-based query builder. Developers introduced static validation maps (OrderKeyAllowlist) to explicitly limit the columns permitted in ORDER BY clauses.

// server/activity/internal/mysql/activity.go
 
var listActivitiesOrderKeys = platform_mysql.OrderKeyAllowlist{
  "id":              "a.id",
  "created_at":      "a.created_at",
  "user_id":         "a.user_id",
  "user_name":       "a.user_name",
  "name":            "a.user_name",
  "user_email":      "a.user_email",
  "activity_type":   "a.activity_type",
  "streamed":        "a.streamed",
  "fleet_initiated": "a.fleet_initiated",
}

The fix maps user-supplied keys directly to qualified column names, explicitly leaving out sensitive columns like details or host_only. The implementation substituted AppendListOptionsWithParams with a secure variant AppendListOptionsWithParamsSecure that enforces validation.

// Pre-patch call
// activitiesQ, args = platform_mysql.AppendListOptionsWithParams(activitiesQ, args, &opt)
 
// Post-patch call
activitiesQ, args, err := platform_mysql.AppendListOptionsWithParamsSecure(activitiesQ, args, &opt, listActivitiesOrderKeys)
if err != nil {
  return nil, nil, ctxerr.Wrap(ctx, err, "append list options")
}

This pattern guarantees that any unauthorized key triggers an immediate InvalidOrderKeyError. The API handler catches this exception and replies with an HTTP 422 Unprocessable Entity response, terminating execution before sending the query to the MySQL database engine.

Exploitation Methodology

Exploitation requires an active user session authorized to request the activities feed. The attacker targets either the global activity feed or a host-specific activities resource. The objective is to utilize the sorting output to infer values stored in columns containing credential configurations or secret parameters.

To construct the attack, the attacker crafts an HTTP request incorporating a conditional expression within the order_key parameter. This conditional expression tests a specific assertion against a target data field:

GET /api/v1/fleet/activities?order_key=(CASE+WHEN+(SELECT+SUBSTRING(details,1,1)+FROM+activities+WHERE+id=1)='a'+THEN+id+ELSE+created_at+END)&order_direction=asc HTTP/1.1
Host: target-fleet-server.com
Authorization: Bearer <token>

When the condition evaluates to true, the database orders results based on the id column. When false, ordering defaults to the created_at timestamp. By observing the structured arrangement of the array items in the response, the attacker verifies the validity of the hypothesized character. Repeating this mechanism across offset values allows the retrieval of entire strings from unprojected database cells.

Attack Flow and Mitigation

The diagram below outlines the execution flow of an incoming malicious request, illustrating how the lack of validation allowed SQL injection and how the mitigation blocks unauthorized parameters before database execution.

With the patched version, the flow changes to discard invalid fields early in the processing loop:

Impact Assessment

The primary consequence of this flaw is the unauthorized extraction of database attributes. Because activities include a generic details field, they often store sensitive structural configurations, environmental variables, or internal session details. Compromising these attributes lowers the barrier for horizontal privilege escalation within the platform.

The attack vector is restricted to authenticated sessions, meaning threat actors must already have legitimate credentials or a hijacked token. This constraint reduces the immediate risk profile of the flaw compared to unauthenticated remote code execution. However, inside threats or compromised regular accounts can leverage this vulnerability to gain high-level privileges.

No public proof-of-concept exploits exist, and there are no signs of exploitation in the wild. The vulnerability does not allow modification of database contents or arbitrary command execution on the host OS.

Official Patches

FleetDMPR #49624: Enforce ORDER BY allowlist on activity list endpoints

Fix Analysis (1)

Technical Appendix

CVSS Score
8.1/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N

Affected Systems

Fleet Device Management Platform

Affected Versions Detail

Product
Affected Versions
Fixed Version
Fleet
FleetDM
< 4.89.14.89.1
AttributeDetail
CWE IDCWE-89
Attack VectorNetwork (Authenticated)
Vulnerability TypeSQL Injection / Information Disclosure
CVSS v3.1 Score8.1
Exploit StatusNone / Theoretical
KEV StatusNot Listed
Affected ComponentActivity List Endpoints

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1592Gather Victim Host Information
Reconnaissance
T1020Automated Exfiltration
Exfiltration
CWE-89
Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')

The software constructs an SQL command using externally-influenced input, but it does not neutralize or incorrectly neutralizes elements that can alter the intended SQL command.

Vulnerability Timeline

Pull Request #44385 is merged, removing deprecated query-building logic but leaving activity list endpoints unsecured.
2026-05-05
Fleet v4.89.0 is released, containing vulnerable activity sorting logic.
2026-07-15
Pull Request #49624 is opened to introduce strict allowlisting on dynamic order_key arguments.
2026-07-20
Pull Request #49624 is merged into the main development branch.
2026-07-30
Pull Request #51556 is opened to conduct further cleanup and security validation of remaining dynamic order queries.
2026-08-19

References & Sources

  • [1]GitHub Security Advisory GHSA-RXHG-VCWW-2MPW
  • [2]FleetDM Pull Request #49624
  • [3]FleetDM Legacy Cleanup Pull Request #44385
  • [4]FleetDM Validation Pull Request #51556
  • [5]Fleet Release v4.89.0

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

•2 minutes ago•CVE-2026-109619
9.2

CVE-2026-109619: Remote Code Execution in PHP Core via Stale Global State Memory Corruption (PHP2Shell)

CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.

Alon Barad
Alon Barad
1 views•6 min read
•5 minutes ago•CVE-2026-113721
4.5

CVE-2026-113721: Unsafe Link Resolution in virtualenv File Generation

In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.

Amit Schendel
Amit Schendel
1 views•5 min read
•9 days ago•CVE-2026-87697
8.8

CVE-2026-87697: Untrusted Deserialization in .NET PresentationCore Clipboard Handling

A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.

Alon Barad
Alon Barad
31 views•5 min read
•9 days ago•CVE-2026-70007
8.8

CVE-2026-70007: Out-of-Bounds Write Vulnerability in .NET Framework and WPF Subsystem

An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.

Amit Schendel
Amit Schendel
19 views•6 min read
•10 days ago•CVE-2026-70186
7.5

CVE-2026-70186: ASP.NET Core Denial of Service Vulnerability via Framework Deadlock

ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.

Amit Schendel
Amit Schendel
18 views•5 min read
•10 days ago•CVE-2026-70035
8.8

CVE-2026-70035: Insecure Deserialization Remote Code Execution in Microsoft .NET Framework and .NET Runtime

CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.

Amit Schendel
Amit Schendel
24 views•6 min read