Vulnerability MediumRUSTSEC-2025-0004 · openssl
RUSTSEC-2025-0004: ssl::select_next_proto use after free
Short answerA security vulnerability in the openssl crate: ssl::select_next_proto use after free. GitHub rates it Medium. Fixed in 0.10.70: update to a fixed version.
| Crate | openssl |
|---|---|
| Type | Vulnerability (memory-exposure) |
| Affected versions | Before 0.10.70. |
| Fixed in | 0.10.70 |
| Severity | Medium (GitHub rating) |
| Published | 2025-02-02 |
| Last changed | 2026-10-12 |
| Also known as | CVE-2025-24898, GHSA-rpmj-rpgj-qmpm |
| Affected functions | openssl::ssl::select_next_proto |
What to do
- See which version you have:
cargo tree -i openssl(it also shows which of your dependencies pulls it in). - Update within your version requirement:
cargo update -p openssl. If the fix is a newer major or minor than your requirement allows, raise it in Cargo.toml (for exampleopenssl = "0.10.70") or update the dependency that pulls it in. - Check again with
cargo audit, or paste your Cargo.lock into our Cargo.toml checker.
Details from the advisory
In openssl versions before 0.10.70, ssl::select_next_proto can return a slice pointing into the server argument's buffer but with a lifetime bound to the client argument. In situations where the server buffer's lifetime is shorter than the client buffer's, this can cause a use after free. This could cause the server to crash or to return arbitrary memory contents to the client.
openssl 0.10.70 fixes the signature of ssl::select_next_proto to properly constrain the output buffer's lifetime to that of both input buffers.
In standard usage of ssl::select_next_proto in the callback passed to SslContextBuilder::set_alpn_select_callback, code is only affected if the server buffer is constructed *within* the callback. For example:
Not vulnerable - the server buffer has a 'static lifetime:
builder.set_alpn_select_callback(|_, client_protos| {
ssl::select_next_proto(b"\x02h2", client_protos).ok_or_else(AlpnError::NOACK)
});
Not vulnerable - the server buffer outlives the handshake:
let server_protos = b"\x02h2".to_vec();
builder.set_alpn_select_callback(|_, client_protos| {
ssl::select_next_proto(&server_protos, client_protos).ok_or_else(AlpnError::NOACK)
});
Vulnerable - the server buffer is freed when the callback returns:
builder.set_alpn_select_callback(|_, client_protos| {
let server_protos = b"\x02h2".to_vec();
ssl::select_next_proto(&server_protos, client_protos).ok_or_else(AlpnError::NOACK)
});
References
- Package: crates.io/crates/openssl
- Advisory: rustsec.org/advisories/RUSTSEC-2025-0004.html
- Web: github.com/sfackler/rust-openssl/pull/2360
- Web: github.com/sfackler/rust-openssl/pull/2360
From the RustSec Advisory Database (CC0-1.0) via the OSV export, downloaded Oct 24, 2026. Severity score computed from the published CVSS vector.
Other advisories for openssl
- Vulnerability HighRUSTSEC-2016-0001 · 2016-11-05SSL/TLS MitM vulnerability due to insecure defaults
- Vulnerability CriticalRUSTSEC-2018-0010 · 2018-06-01Use after free in CMS Signing
- VulnerabilityRUSTSEC-2023-0022 · 2023-03-24`openssl` `X509NameBuilder::build` returned object is not thread safe
- VulnerabilityRUSTSEC-2023-0023 · 2023-03-24`openssl` `SubjectAlternativeName` and `ExtendedKeyUsage::other` allow arbitrary file read
- VulnerabilityRUSTSEC-2023-0024 · 2023-03-24`openssl` `X509Extension::new` and `X509Extension::new_nid` null pointer dereference
- VulnerabilityRUSTSEC-2023-0044 · 2023-06-20`openssl` `X509VerifyParamRef::set_host` buffer over-read
- UnsoundRUSTSEC-2023-0072 · 2023-11-23`openssl` `X509StoreRef::objects` is unsound
- VulnerabilityRUSTSEC-2024-0357 · 2024-07-21`MemBio::get_buf` has undefined behavior with empty buffers
Up next
Same crateopenssl: security historyEvery advisory for this crate, and whether it is safe to use today.Read it next →Did this answer your question?