GHSA-RXHG-VCWW-2MPW
Vulnerability from github – Published: 2026-08-20 18:44 – Updated: 2026-08-20 18:44Summary
An authenticated user with read access to Activity could influence the ORDER BY clause of the activity list endpoints by supplying an arbitrary sort column:
GET /api/v1/fleet/activities(ListActivities)GET /api/v1/fleet/hosts/{id}/activities(ListHostPastActivities)
This originated from the deprecated cursor-pagination helper (appendListOptionsWithCursorToSQL), which interpolated the caller-supplied order key into SQL without an allowlist. The original report's node_key extraction scenario (/api/v1/fleet/labels/{id}/hosts) was remediated separately in #44385; these two activity endpoints were the residual call sites, neither of which joins the hosts table, so node_key was never reachable through them.
Impact
Read-only. Because the order key was interpolated, an authenticated user with Activity read could sort by columns not otherwise returned in these responses. The exposure was bounded to columns on activity_past (e.g. details on /api/v1/fleet/activities, which is not in that endpoint's SELECT; host-only activities are already excluded by WHERE host_only = false). There is no privilege escalation, write access, or reachability of node_key or other host-join columns through these endpoints.
Remediation
The deprecated helper was removed from the codebase. Both endpoints now pass the caller-supplied sort column through SanitizeColumn, which strips all characters except [\w-.] and backtick-quotes each identifier segment. This closes the injection vector: separators, whitespace, parentheses, and quotes cannot survive sanitization, so an expression-based ORDER BY oracle is not constructable.
Affected versions
< fleet-v4.89.0. Fixed in fleet-v4.89.0.
Credit
Thanks to @axel-corsiez for the report.
{
"affected": [
{
"package": {
"ecosystem": "Go",
"name": "github.com/fleetdm/fleet/v4"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "4.89.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [],
"database_specific": {
"cwe_ids": [
"CWE-89"
],
"github_reviewed": true,
"github_reviewed_at": "2026-08-20T18:44:36Z",
"nvd_published_at": null,
"severity": "LOW"
},
"details": "### Summary\n\nAn authenticated user with read access to Activity could influence the `ORDER BY` clause of the activity list endpoints by supplying an arbitrary sort column:\n\n- `GET /api/v1/fleet/activities` (`ListActivities`)\n- `GET /api/v1/fleet/hosts/{id}/activities` (`ListHostPastActivities`)\n\nThis originated from the deprecated cursor-pagination helper (`appendListOptionsWithCursorToSQL`), which interpolated the caller-supplied order key into SQL without an allowlist. The original report\u0027s `node_key` extraction scenario (`/api/v1/fleet/labels/{id}/hosts`) was remediated separately in #44385; these two activity endpoints were the residual call sites, neither of which joins the `hosts` table, so `node_key` was never reachable through them.\n\n### Impact\n\nRead-only. Because the order key was interpolated, an authenticated user with Activity read could sort by columns not otherwise returned in these responses. The exposure was bounded to columns on `activity_past` (e.g. `details` on `/api/v1/fleet/activities`, which is not in that endpoint\u0027s SELECT; host-only activities are already excluded by `WHERE host_only = false`). There is no privilege escalation, write access, or reachability of `node_key` or other host-join columns through these endpoints.\n\n### Remediation\n\nThe deprecated helper was removed from the codebase. Both endpoints now pass the caller-supplied sort column through `SanitizeColumn`, which strips all characters except `[\\w-.]` and backtick-quotes each identifier segment. This closes the injection vector: separators, whitespace, parentheses, and quotes cannot survive sanitization, so an expression-based `ORDER BY` oracle is not constructable.\n\n### Affected versions\n\n`\u003c fleet-v4.89.0`. Fixed in `fleet-v4.89.0`.\n\n### Credit\n\nThanks to @axel-corsiez for the report.",
"id": "GHSA-rxhg-vcww-2mpw",
"modified": "2026-08-20T18:44:36Z",
"published": "2026-08-20T18:44:36Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/fleetdm/fleet/security/advisories/GHSA-rxhg-vcww-2mpw"
},
{
"type": "PACKAGE",
"url": "https://github.com/fleetdm/fleet"
},
{
"type": "WEB",
"url": "https://github.com/fleetdm/fleet/releases/tag/fleet-v4.89.0"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N",
"type": "CVSS_V3"
}
],
"summary": "Fleet: ORDER BY column injection on activity list endpoints"
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.