Bug 2460984 (CVE-2026-71217)
| Summary: | CVE-2026-71217 iperf3: iperf3 server accepts unbounded peer-controlled JSON parameters enabling remote denial of service via resource exhaustion | ||
|---|---|---|---|
| Product: | [Other] Security Response | Reporter: | OSIDB Bzimport <bzimport> |
| Component: | vulnerability | Assignee: | Product Security <prodsec-ir-bot> |
| Status: | NEW --- | QA Contact: | |
| Severity: | high | Docs Contact: | |
| Priority: | high | ||
| Version: | unspecified | CC: | kshier, rhel-process-autobot, security-response-team, stcannon, teagle, watson-tool-maintainers, yguenane |
| Target Milestone: | --- | Keywords: | Security |
| Target Release: | --- | ||
| Hardware: | All | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Fixed In Version: | Doc Type: | --- | |
| Doc Text: |
A flaw was found in iperf3. A remote attacker can exploit this vulnerability by sending crafted control-channel JSON with oversized numeric parameters, such as `parallel` and `len`, which are not properly validated by the server. This improper input validation can lead to excessive stream and thread creation, as well as large buffer allocations, causing resource exhaustion. Consequently, this can result in a Denial of Service (DoS) on the affected iperf3 server.
|
Story Points: | --- |
| Clone Of: | Environment: | ||
| Last Closed: | Type: | --- | |
| Regression: | --- | Mount Type: | --- |
| Documentation: | --- | CRM: | |
| Verified Versions: | Category: | --- | |
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
| Cloudforms Team: | --- | Target Upstream Version: | |
| Embargoed: | |||
| Bug Depends On: | 2513850 | ||
| Bug Blocks: | |||
AI_ONLY_REPORT package: iperf3-3.17.1-5.el10_1 ------ Summary: Unbounded numeric parameters from peer JSON can trigger resource exhaustion (blksize / num_streams / duration etc.): The server accepts peer-controlled numeric values from the control-channel JSON without server-side bounds checks; confirmed exploitation through oversized `parallel` and `len` values can drive excessive stream/thread creation and large per-stream buffer allocation, causing remote denial of service. Requirements to exploit: Network reachability to an `iperf3` server and the ability to send crafted control-channel JSON during parameter exchange. No user interaction is required. If iperf authentication is not enabled, no credentials are needed. Component affected: `iperf3` server control-channel parameter handling in `get_parameters()` (`src/iperf_api.c`), server `CREATE_STREAMS` processing (`src/iperf_server_api.c`), and `iperf_new_stream()` buffer/stream setup (`src/iperf_api.c`) Version affected: Confirmed on the `3.17.1` source baseline and present through the inspected current `HEAD`; older versions may also be affected, but were not confirmed. Patch available: No upstream patch identified. A minimal patch sketch is included below. Version fixed (if any already): unknown Upstream coordination: Not yet notified. This report is prepared for initial disclosure to the project maintainers. CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - 7.5 (HIGH) AV:N - Reachable over the network through the `iperf3` control channel. AC:L - Exploitation only requires sending oversized numeric parameters during normal parameter exchange. PR:N - No credentials are required when the server accepts unauthenticated clients. UI:N - No user interaction is required. S:U - The impact remains within the `iperf3` service scope. C:N - No confidentiality impact was demonstrated. I:N - No integrity impact was demonstrated. A:H - Oversized `parallel` and `len` values can drive large buffer mapping, heavy `readentropy()` work, and excessive stream/thread creation, causing serious service disruption. Impact: Important. The strongest confirmed impact is server-side availability loss: oversized `parallel` and `len` values drive per-stream buffer allocation, `readentropy()` work, and stream/thread creation in the server path. No direct confidentiality or integrity impact was demonstrated, but a remote client can cause substantial service disruption or keep the service unavailable by repeatedly triggering resource-intensive or failing tests. Embargo: yes Reason: The issue is reachable over the network against exposed `iperf3` servers, requires no user interaction, and no fixed release is known. Coordinated disclosure gives upstream time to add server-side validation before public release of detailed reproduction steps. Suggested public date: 19-Jul-2026 Acknowledgement: Aisle Research Steps to reproduce: 1. Build the current source and start the server with `./src/iperf3 -s`. 2. Build a modified client, or a custom control-channel client, that overwrites the parameter JSON before `JSON_write()` and sends out-of-range values such as `"parallel": 100000` and `"len": 1073741824`. 3. Connect the malicious client to the server and let it proceed through the normal control handshake and stream setup. 4. Observe repeated large `ftruncate()` / `mmap()` attempts per stream, heavy memory/CPU pressure, excessive stream/socket/thread creation attempts, and test abort/reset. Repeated requests can keep the service degraded or unavailable. Vulnerability Details `get_parameters()` accepts peer-controlled numeric fields from the control-channel JSON and assigns them directly without reapplying the bounds enforced by CLI parsing: ```c if ((j_p = iperf_cJSON_GetObjectItemType(j, "parallel", cJSON_Number)) != NULL) test->num_streams = j_p->valueint; ... if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL) test->settings->blksize = j_p->valueint; ``` The strongest confirmed reachable sink is on the server path. During `CREATE_STREAMS`, the server eventually calls `iperf_new_stream()`, where `len` controls per-stream buffer sizing and `parallel` controls how many streams and worker threads are created: ```c sp = iperf_new_stream(test, s, flag); ... if (ftruncate(sp->buffer_fd, test->settings->blksize) < 0) ... sp->buffer = (char *) mmap(NULL, test->settings->blksize, ...); ret = readentropy(sp->buffer, test->settings->blksize); ``` CLI parsing applies checks such as `MAX_STREAMS` and `MAX_BLOCKSIZE`, but equivalent validation is not performed when values come from peer JSON. The same missing-validation pattern also affects other numeric peer fields such as `time`, `omit`, `burst`, and `mss`; however, the strongest confirmed availability impact in the source material is via oversized `parallel` and `len`. Most relevant CWEs: `CWE-20` (Improper Input Validation): peer-controlled control-channel integers are accepted without range checks. `CWE-400` (Uncontrolled Resource Consumption): oversized values can drive excessive memory, CPU, socket, and thread use. Affected Versions The reviewed repository history indicates that the vulnerable assignments in `get_parameters()` are present in the `72fc90d` `3.17.1` baseline and remain present in the inspected current `HEAD` (`15586ce`). The corresponding sink code in `iperf_new_stream()` and server stream setup is also present in that baseline. Older versions may also be affected, but were not confirmed from the available history. Proposed Fix ```diff diff --git a/src/iperf_api.c b/src/iperf_api.c @@ static int get_parameters(struct iperf_test *test) if ((j_p = iperf_cJSON_GetObjectItemType(j, "parallel", cJSON_Number)) != NULL) test->num_streams = j_p->valueint; + if ((j_p = iperf_cJSON_GetObjectItemType(j, "parallel", cJSON_Number)) != NULL) { + if (j_p->valueint < 1 || j_p->valueint > MAX_STREAMS) { + i_errno = IENUMSTREAMS; + r = -1; + goto done; + } + test->num_streams = j_p->valueint; + } @@ if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL) test->settings->blksize = j_p->valueint; + if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL) { + int blksize = j_p->valueint; + if ((test->protocol->id != Pudp && (blksize <= 0 || blksize > MAX_BLOCKSIZE)) || + (test->protocol->id == Pudp && + blksize > 0 && + (blksize < MIN_UDP_BLOCKSIZE || blksize > MAX_UDP_BLOCKSIZE))) { + i_errno = (test->protocol->id == Pudp) ? IEUDPBLOCKSIZE : IEBLOCKSIZE; + r = -1; + goto done; + } + test->settings->blksize = blksize; + } @@ +done: cJSON_Delete(j); return r; ``` Peer numeric fields such as `time`, `omit`, `burst`, and `mss` should also be reviewed and validated using the existing max/min constants where applicable. ------ This report was generated using AI technology. Always review AI-generated content prior to use