/

CVE-2026-111444

Severity:

CRITICAL RISK

(9.8)

SQL Injection (CWE-89) in Wheels MySQL Query Paths

CVE-2026-111444

Deferred

Vulnerability type

Category:

SQL Injection

CWE:

CWE-89

Impact:

Database compromise and unauthorized data access

Severity:

CRITICAL RISK

(9.8)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

Wheels can allow SQL injection when application-controlled request data reaches query paths that inline literals instead of using bound parameters. On MySQL or MariaDB configurations where backslash escaping is enabled, an attacker may alter query logic, access unauthorized data, or modify database contents.

Wheels can allow SQL injection when application-controlled request data reaches query paths that inline literals instead of using bound parameters. On MySQL or MariaDB configurations where backslash escaping is enabled, an attacker may alter query logic, access unauthorized data, or modify database contents.

Affected context

The issue affects Wheels applications using MySQL or MariaDB with backslash escaping enabled, meaning NO_BACKSLASH_ESCAPES is not active. Risk is concentrated in inline-literal query paths, including opt-in non-parameterized queries, IN lists, and developer-written where clauses containing positions such as BETWEEN bounds, function arguments, or LIKE ESCAPE literals that the parser does not bind. Queries that consistently use bound parameters are not affected by this behavior.

The issue affects Wheels applications using MySQL or MariaDB with backslash escaping enabled, meaning NO_BACKSLASH_ESCAPES is not active. Risk is concentrated in inline-literal query paths, including opt-in non-parameterized queries, IN lists, and developer-written where clauses containing positions such as BETWEEN bounds, function arguments, or LIKE ESCAPE literals that the parser does not bind. Queries that consistently use bound parameters are not affected by this behavior.

Exploit preconditions

  • Attack surface: Application endpoints or services that incorporate request data into database queries
  • Required access: The ability to submit or influence request parameters consumed by vulnerable query-building paths
  • Trigger point: Construction and execution of an inline-literal SQL expression
  • Database condition: MySQL or MariaDB with backslash escaping enabled
  • Why exploitation is possible: Quote doubling alone does not safely encode values when backslash escape processing can change how delimiters are interpreted
  • Attack surface: Application endpoints or services that incorporate request data into database queries
  • Required access: The ability to submit or influence request parameters consumed by vulnerable query-building paths
  • Trigger point: Construction and execution of an inline-literal SQL expression
  • Database condition: MySQL or MariaDB with backslash escaping enabled
  • Why exploitation is possible: Quote doubling alone does not safely encode values when backslash escape processing can change how delimiters are interpreted

Why this happens

The vulnerability is caused by incomplete escaping in SQL construction paths that emit values directly into query text. The escaping logic accounts for single-quote doubling but does not adequately account for MySQL and MariaDB backslash escape semantics, allowing a crafted value to change the structure or meaning of the resulting statement. This maps to CWE-89: Improper Neutralization of Special Elements used in an SQL Command, commonly known as SQL injection.

The vulnerability is caused by incomplete escaping in SQL construction paths that emit values directly into query text. The escaping logic accounts for single-quote doubling but does not adequately account for MySQL and MariaDB backslash escape semantics, allowing a crafted value to change the structure or meaning of the resulting statement. This maps to CWE-89: Improper Neutralization of Special Elements used in an SQL Command, commonly known as SQL injection.

Potential impact

  • An attacker may bypass intended query conditions
  • Unauthorized records may be read or enumerated
  • Application data may be modified or deleted
  • Authentication or authorization logic implemented in SQL could be undermined
  • Database availability may be reduced through abusive queries
  • Sensitive data may be exposed depending on database permissions
  • An attacker may bypass intended query conditions
  • Unauthorized records may be read or enumerated
  • Application data may be modified or deleted
  • Authentication or authorization logic implemented in SQL could be undermined
  • Database availability may be reduced through abusive queries
  • Sensitive data may be exposed depending on database permissions

General mitigation guidance

Mitigation generally centers on ensuring that application-controlled values are represented as bound parameters rather than concatenated into SQL text.

Common defensive patterns include:

  • Prefer parameterized queries for predicates, lists, ranges, function arguments, and pattern-matching expressions
  • Avoid opt-in inline-literal query modes for any data influenced by requests
  • Use query-builder APIs that preserve parameter binding across all supported clause types
  • Treat identifiers and structural SQL fragments separately from values, allowing only validated selections from fixed application-defined options
  • Reduce database account privileges so compromised query behavior has limited reach
  • Apply database configuration and driver settings that minimize ambiguous escape interpretation where compatible with the application
  • Validate input for business requirements, while not relying on validation as a replacement for parameterization

Mitigation generally centers on ensuring that application-controlled values are represented as bound parameters rather than concatenated into SQL text.

Common defensive patterns include:

  • Prefer parameterized queries for predicates, lists, ranges, function arguments, and pattern-matching expressions
  • Avoid opt-in inline-literal query modes for any data influenced by requests
  • Use query-builder APIs that preserve parameter binding across all supported clause types
  • Treat identifiers and structural SQL fragments separately from values, allowing only validated selections from fixed application-defined options
  • Reduce database account privileges so compromised query behavior has limited reach
  • Apply database configuration and driver settings that minimize ambiguous escape interpretation where compatible with the application
  • Validate input for business requirements, while not relying on validation as a replacement for parameterization

How teams detect issues like this

Detection can combine static analysis, review practices, and runtime monitoring:

  • Search for query-builder options that disable parameterization or emit inline literals
  • Flag string concatenation, interpolation, or manual quote escaping near SQL construction
  • Review IN lists, range predicates, LIKE ESCAPE expressions, function arguments, and custom where strings for binding coverage
  • Test database interactions against MySQL and MariaDB modes with backslash escaping enabled
  • Enforce code-review policies requiring bound parameters for request-derived values
  • Monitor database logs and application telemetry for anomalous syntax errors, condition manipulation, or unexpected query volume
  • Automated security scanners and source-analysis tools may help identify common SQL construction patterns, but findings should be validated against actual binding behavior

Detection can combine static analysis, review practices, and runtime monitoring:

  • Search for query-builder options that disable parameterization or emit inline literals
  • Flag string concatenation, interpolation, or manual quote escaping near SQL construction
  • Review IN lists, range predicates, LIKE ESCAPE expressions, function arguments, and custom where strings for binding coverage
  • Test database interactions against MySQL and MariaDB modes with backslash escaping enabled
  • Enforce code-review policies requiring bound parameters for request-derived values
  • Monitor database logs and application telemetry for anomalous syntax errors, condition manipulation, or unexpected query volume
  • Automated security scanners and source-analysis tools may help identify common SQL construction patterns, but findings should be validated against actual binding behavior

Sources

SourceLink
github.comgithub.com/wheels-dev/wheels/security/advisories/GHSA-mvr9-2h5x-w6cq

Frequently asked

questions

It can be remotely exploitable when a reachable application endpoint passes attacker-influenced request data into an affected inline-literal query path and the database uses the relevant escaping behavior.

Not necessarily. The required access depends on the application endpoint and its authorization controls. Any user, including an unauthenticated user, who can influence a vulnerable query input may be relevant.

Use parameterized queries or bound query-builder values for every request-derived value, including list members, range bounds, function arguments, and pattern-matching values. Avoid relying on manual escaping.

Standardize parameter binding, prohibit unnecessary inline-literal modes, review custom where expressions, test all supported database configurations, and restrict database privileges according to least-privilege principles.

It can be remotely exploitable when a reachable application endpoint passes attacker-influenced request data into an affected inline-literal query path and the database uses the relevant escaping behavior.

Not necessarily. The required access depends on the application endpoint and its authorization controls. Any user, including an unauthenticated user, who can influence a vulnerable query input may be relevant.

Use parameterized queries or bound query-builder values for every request-derived value, including list members, range bounds, function arguments, and pattern-matching values. Avoid relying on manual escaping.

Standardize parameter binding, prohibit unnecessary inline-literal modes, review custom where expressions, test all supported database configurations, and restrict database privileges according to least-privilege principles.

Find out what's already
exploitable in your codebase.