CVE-2024-28867: Github.com/swift server/swift prometheus Un-sanitized Metric Name Or Labels Vulnerability

MODERATE
Advisory Identifier: GHSA-x768-cvr2-345r
CVSS 5.9
CWE-74
Published
Advisory Summary

CVE-2024-28867 is a MODERATE (CVSS 5.9) un-sanitized metric name or labels vulnerability (CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')) affecting Github.com/swift server/swift prometheus libraries in the SwiftURL ecosystem. The issue involves un-sanitized metric name or labels can be used to take over exported metrics. Remediation is available by upgrading affected packages to version 2.0.0-alpha.2.

CVE-2024-28867 at a Glance

CVE Identifier CVE-2024-28867
GHSA Identifier GHSA-x768-cvr2-345r
Severity MODERATE
CVSS v3.1 Base Score 5.9
CWE Classification CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')
Affected Product Github.com/swift server/swift prometheus
Package Ecosystem SwiftURL
Published Date
Last Updated

Security Impact

CVSS: 5.9

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N).

Attack Vector Network (AV:N)
Attack Complexity High (AC:H)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality None (C:N)
Integrity High (I:H)
Availability None (A:N)

How to Fix CVE-2024-28867

To remediate this vulnerability, upgrade all affected Github.com/swift server/swift prometheus dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

github.com/swift-server/swift-prometheus fixed: 2.0.0-alpha.2
Upgrade github.com/swift-server/swift-prometheus to 2.0.0-alpha.2
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for github.com/swift-server/swift-prometheus

How to Check if You Are Affected

To determine whether your application is affected by CVE-2024-28867, inspect your project dependencies for Github.com/swift server/swift prometheus:

inspect dependencies for github.com/swift-server/swift-prometheus

Analyze the terminal output to locate any version of Github.com/swift server/swift prometheus in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.0.0-alpha.2), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection'), where the product constructs all or part of a command, data structure, or record using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify how it is parsed or interpreted when it is sent to a downstream component. In Github.com/swift server/swift prometheus, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Impact In code which applies _un-sanitized string values into metric names or labels_, like this: ```swift let lang = try? request.query-get(String.self, at: "lang") Counter ( label: "language", dimensions: [("lang", lang ?? "unknown" )] ) ``` an attacker could make use of this and send a `?lang` query parameter containing newlines, `}` or similar characters which can lead to the attacker taking over the exported format -- including creating unbounded numbers of stored metrics, inflating server memory usage, or causing "bogus" metrics. ### Patches The default strategy to sanitize labels was moved deeper into the library, preventing illegal characters from appearing in name, label keys and values. Metric names and label names are now validated against the following requirement: `[a-zA-Z_:][a-zA-Z0-9_:]*` (for metric names) and `[a-zA-Z_][a-zA-Z0-9_]*` (for metric label names). Label values are not validated as they are allowed to contain any unicode characters. Developers _must_ validate labels themselves and not allow malicious input. The approach taken here mirrors the approach taken in the Go reference implementation. ### Discussion It is **strongly discouraged** to use un-sanitized user input as names or labels in general, because they can lead to un-bounded growth of metrics, even as this vulnerability is patched and result in a Denial-of-Service attack opportunity -- **regardless** how well the library is sanitizing the inputs. We strongly recommend only using a sanitized set of values for your metrics names and labels. E.g., a `"lang"` label, should only use an expected set of values that can be used, and ignore other ones -- otherwise a determined attacker could create one metric per different label key, leading to unbounded memory use growth as metrics with distinct values must be kept in memory. **Validating label values:** The library will **NOT** automatically validate and replace strings offered as label values. Developers **must** validate label values themselves, and it is strongly recommended to only accept a well known set of values. It is possible to configure the `PrometheusSanitizer` to apply whatever validation you deem necessary: ```swift let mySanitizer = PrometheusSanitizer { metricName, labels in // ... your logic here ... (metricName, labels) } let registry = PrometheusCollectorRegistry(sanitizer: mySanitizer) let factory = PrometheusMetricsFactory(factory: registry) // swift-metrics MetricsSystem.bootstrap(factory) ``` ### Workarounds Developers must validate user input before using it as metric names, label names or values. This follows common practice of not trusting any user input without sanitization. ### Credits We would like to thank Jonas Dörr for bringing out attention to the issue.

CVE-2024-28867 Affected Github.com/swift server/swift prometheus Versions

1 component(s)
Fixed Versions:
2.0.0-alpha.2
Product / Package Ecosystem Affected Versions Fixed Version
github.com/swift-server/swift-prometheus
SwiftURL
≥ 2.0.0-alpha.1
< 2.0.0-alpha.2
All 1 versions
2.0.0-alpha.1
2.0.0-alpha.2

References

Frequently Asked Questions

What is CVE-2024-28867?
CVE-2024-28867 is a security vulnerability in Github.com/swift server/swift prometheus involving Un-sanitized metric name or labels can be used to take over exported metrics under CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection').
Which Github.com/swift server/swift prometheus versions are affected?
Affected versions include releases prior to 2.0.0-alpha.2 across affected packages: github.com/swift-server/swift-prometheus.
What version fixes CVE-2024-28867?
Upgrading to 2.0.0-alpha.2 (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/swift-server/swift-prometheus affected?
Yes, github.com/swift-server/swift-prometheus is affected in releases prior to 2.0.0-alpha.2. Upgrade your dependency to 2.0.0-alpha.2 or later.
What is the CVSS score of CVE-2024-28867?
CVE-2024-28867 has a CVSS v3.1 base score of 5.9 (MODERATE) with vector string CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N.
What CWE is associated with CVE-2024-28867?
CVE-2024-28867 is classified under CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') (The product constructs all or part of a command, data structure, or record using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify how it is parsed or interpreted when it is sent to a downstream component.).
How can I check SwiftURL dependencies for CVE-2024-28867?
Run the dependency tree command: 'inspect dependencies for github.com/swift-server/swift-prometheus'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-x768-cvr2-345r",
  "modified" : "2024-03-29T19:05:26Z",
  "published" : "2024-03-29T19:05:26Z",
  "aliases" : [ "CVE-2024-28867" ],
  "summary" : "Un-sanitized metric name or labels can be used to take over exported metrics",
  "details" : "### Impact\n\nIn code which applies _un-sanitized string values into metric names or labels_, like this:\n\n```swift\nlet lang = try? request.query-get(String.self, at: \"lang\")\nCounter (\n  label: \"language\", \n  dimensions: [(\"lang\", lang ?? \"unknown\" )]\n)\n```\n\nan attacker could make use of this and send a `?lang` query parameter containing newlines, `}`  or similar characters which can lead to the attacker taking over the exported format -- including creating unbounded numbers of stored metrics, inflating server memory usage, or causing \"bogus\" metrics.\n\n### Patches\nThe default strategy to sanitize labels was moved deeper into the library, preventing illegal characters from appearing in name, label keys and values.\n\nMetric names and label names are now validated against the following requirement: `[a-zA-Z_:][a-zA-Z0-9_:]*` (for metric names) and `[a-zA-Z_][a-zA-Z0-9_]*` (for metric label names). Label values are not validated as they are allowed to contain any unicode characters. Developers _must_ validate labels themselves and not allow malicious input.\n\nThe approach taken here mirrors the approach taken in the Go reference implementation.\n\n### Discussion\n\nIt is **strongly discouraged** to use un-sanitized user input as names or labels in general, because they can lead to un-bounded growth of metrics, even as this vulnerability is patched and result in a Denial-of-Service attack opportunity -- **regardless** how well the library is sanitizing the inputs. We strongly recommend only using a sanitized set of values for your metrics names and labels. E.g., a `\"lang\"` label, should only use an expected set of values that can be used, and ignore other ones -- otherwise a determined attacker could create one metric per different label key, leading to unbounded memory use growth as metrics with distinct values must be kept in memory.\n\n**Validating label values:**\n\nThe library will **NOT** automatically validate and replace strings offered as label values.\nDevelopers **must** validate label values themselves, and it is strongly recommended to only accept a well known set of values.\n\nIt is possible to configure the `PrometheusSanitizer` to apply whatever validation you deem necessary:\n\n```swift\nlet mySanitizer = PrometheusSanitizer { metricName, labels in\n  // ... your logic here ...\n  (metricName, labels)\n}\n\nlet registry = PrometheusCollectorRegistry(sanitizer: mySanitizer)\nlet factory = PrometheusMetricsFactory(factory: registry)\n\n// swift-metrics\nMetricsSystem.bootstrap(factory)\n```\n\n\n\n### Workarounds\n\nDevelopers must validate user input before using it as metric names, label names or values. This follows common practice of not trusting any user input without sanitization.\n\n### Credits\n\nWe would like to thank Jonas Dörr for bringing out attention to the issue.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "SwiftURL",
      "name" : "github.com/swift-server/swift-prometheus"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "2.0.0-alpha.1"
      }, {
        "fixed" : "2.0.0-alpha.2"
      } ]
    } ],
    "versions" : [ "2.0.0-alpha.1" ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/swift-server/swift-prometheus/security/advisories/GHSA-x768-cvr2-345r"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2024-28867"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/swift-server/swift-prometheus/commit/bfcd4bbfabe11aae4b035424ee9724582e288501"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/swift-server/swift-prometheus"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-74" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2024-03-29T19:05:26Z",
    "nvd_published_at" : "2024-03-29T15:15:11Z"
  }
}