From 9dfa0610e0243e60b295dac7d93aac805c67908d Mon Sep 17 00:00:00 2001 From: rustdesk Date: Wed, 7 Oct 2026 22:23:03 +0800 Subject: [PATCH] fix(hbbs): cap peer id length at 253 bytes RegisterPk accepted ids up to a whole UDP datagram, so 31 registered peers with ~64 KB ids still let the bounded punch-request store reach hundreds of MB. Reject longer ids in RegisterPk and RegisterPeer, the same bound the Pro server uses. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01PkpVy2ufxgEjKd3SjXPnJ8 --- src/peer.rs | 3 +++ src/rendezvous_server.rs | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/peer.rs b/src/peer.rs index 0f218df..9e4cbec 100644 --- a/src/peer.rs +++ b/src/peer.rs @@ -22,6 +22,9 @@ pub const IP_CHANGE_DUR: u64 = 180; pub const IP_CHANGE_DUR_X2: u64 = IP_CHANGE_DUR * 2; pub const DAY_SECONDS: u64 = 3600 * 24; pub const IP_BLOCK_DUR: u64 = 60; +// Same bound as the Pro server: a longer id is not a normal RustDesk id or hostname, +// and every peer entry and punch-request record keeps its own copy. +pub const MAX_PEER_ID_LEN: usize = 253; #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub(crate) struct PeerInfo { diff --git a/src/rendezvous_server.rs b/src/rendezvous_server.rs index 57bc5b8..54d24a2 100644 --- a/src/rendezvous_server.rs +++ b/src/rendezvous_server.rs @@ -373,7 +373,7 @@ impl RendezvousServer { match msg_in.union { Some(rendezvous_message::Union::RegisterPeer(rp)) => { // B registered - if !rp.id.is_empty() { + if !rp.id.is_empty() && rp.id.len() <= MAX_PEER_ID_LEN { log::trace!("New peer registered: {:?} {:?}", &rp.id, &addr); self.update_addr(rp.id, addr, socket).await?; if self.inner.serial > rp.serial { @@ -393,7 +393,7 @@ impl RendezvousServer { } let id = rk.id; let ip = addr.ip().to_string(); - if id.len() < 6 { + if id.len() < 6 || id.len() > MAX_PEER_ID_LEN { return send_rk_res(socket, addr, UUID_MISMATCH).await; } else if !self.check_ip_blocker(&ip, &id).await { return send_rk_res(socket, addr, TOO_FREQUENT).await;