RUSTSEC-2026-0435 (CVE-2026-43868)
Vulnerability from osv_rustsec – Published: 2026-11-02 12:00 – Updated: 2026-11-02 11:45 – Source websiteAffected versions of the thrift crate size a buffer directly from an attacker-controlled 4-byte length read off the wire, before reading any payload and with no upper bound, allowing a hostile peer to force a large eager allocation or an immediate abort (denial of service, CWE-400 / CWE-789). This is the Rust implementation's instance of the CVE-2020-13949 pattern, published by the Apache Thrift PMC as CVE-2026-43868.
Details
In TBinaryInputProtocol::read_bytes (src/protocol/binary.rs), the length is read as a i32 from the transport and cast straight to usize to size a zeroing buffer before any payload is read:
fn read_bytes(&mut self) -> crate::Result<Vec<u8>> {
let num_bytes = self.transport.read_i32::<BigEndian>()? as usize; // length from the wire
let mut buf = vec![0u8; num_bytes]; // unbounded eager allocation
self.transport.read_exact(&mut buf).map(|_| buf).map_err(From::from)
}
There is no check that num_bytes is non-negative or that it fits within the data actually available:
- A length of
0x7FFFFFFFforces a ~2 GiB allocation;0x20000000forces 512 MiB; and so on, from only a 4-byte input. - A negative length casts to a huge
usize(up tousize::MAX), causing an immediate allocation failure / abort.
read_string routes through read_bytes, so string fields are affected the same way. The sink is reachable from any peer sending binary-protocol data, so this is an unauthenticated, network-reachable denial of service.
The fix
From thrift 0.23.0 onward, read_bytes goes through read_binary_len, which rejects negative sizes and enforces TConfiguration::max_string_size (default 100 MiB), alongside default message, frame, and recursion limits.
A separate, related gap on the non-strict message-name path was published as CVE-2026-58389 and fixed in 0.24.0; this advisory covers the read_bytes unbounded allocation (CVE-2026-43868), fixed in 0.23.0.
{
"affected": [
{
"database_specific": {
"categories": [
"denial-of-service"
],
"cvss": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"informational": null
},
"ecosystem_specific": {
"affected_functions": null,
"affects": {
"arch": [],
"functions": [
"thrift::protocol::binary::TBinaryInputProtocol::read_bytes",
"thrift::protocol::binary::TBinaryInputProtocol::read_string"
],
"os": []
}
},
"package": {
"ecosystem": "crates.io",
"name": "thrift",
"purl": "pkg:cargo/thrift"
},
"ranges": [
{
"events": [
{
"introduced": "0.0.0-0"
},
{
"fixed": "0.23.0"
}
],
"type": "SEMVER"
}
],
"versions": []
}
],
"aliases": [
"CVE-2026-43868"
],
"database_specific": {
"license": "CC0-1.0"
},
"details": "Affected versions of the `thrift` crate size a buffer directly from an attacker-controlled 4-byte length read off the wire, before reading any payload and with no upper bound, allowing a hostile peer to force a large eager allocation or an immediate abort (denial of service, CWE-400 / CWE-789). This is the Rust implementation\u0027s instance of the CVE-2020-13949 pattern, published by the Apache Thrift PMC as CVE-2026-43868.\n\n## Details\n\nIn `TBinaryInputProtocol::read_bytes` (`src/protocol/binary.rs`), the length is read as a `i32` from the transport and cast straight to `usize` to size a zeroing buffer **before** any payload is read:\n\n```rust\nfn read_bytes(\u0026mut self) -\u003e crate::Result\u003cVec\u003cu8\u003e\u003e {\n let num_bytes = self.transport.read_i32::\u003cBigEndian\u003e()? as usize; // length from the wire\n let mut buf = vec![0u8; num_bytes]; // unbounded eager allocation\n self.transport.read_exact(\u0026mut buf).map(|_| buf).map_err(From::from)\n}\n```\n\nThere is no check that `num_bytes` is non-negative or that it fits within the data actually available:\n\n- A length of `0x7FFFFFFF` forces a ~2 GiB allocation; `0x20000000` forces 512 MiB; and so on, from only a 4-byte input.\n- A negative length casts to a huge `usize` (up to `usize::MAX`), causing an immediate allocation failure / abort.\n\n`read_string` routes through `read_bytes`, so string fields are affected the same way. The sink is reachable from any peer sending binary-protocol data, so this is an unauthenticated, network-reachable denial of service.\n\n## The fix\n\nFrom `thrift` 0.23.0 onward, `read_bytes` goes through `read_binary_len`, which rejects negative sizes and enforces `TConfiguration::max_string_size` (default 100 MiB), alongside default message, frame, and recursion limits.\n\nA separate, related gap on the non-strict message-name path was published as CVE-2026-58389 and fixed in 0.24.0; this advisory covers the `read_bytes` unbounded allocation (CVE-2026-43868), fixed in 0.23.0.",
"id": "RUSTSEC-2026-0435",
"modified": "2026-11-02T11:45:44Z",
"published": "2026-11-02T12:00:00Z",
"references": [
{
"type": "PACKAGE",
"url": "https://crates.io/crates/thrift"
},
{
"type": "ADVISORY",
"url": "https://rustsec.org/advisories/RUSTSEC-2026-0435.html"
},
{
"type": "WEB",
"url": "https://lists.apache.org/thread/zj76dtwnbbs1m7z3focf4wd51pqpsmn9"
}
],
"related": [],
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"type": "CVSS_V3"
}
],
"summary": "Unbounded memory allocation in `thrift` binary protocol `read_bytes`"
}
Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline
Sightings and recorded dates, grouped by day · UTC
Loading timeline…
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.