Harden discovery rendezvous service

This commit is contained in:
Alexander Sellite 2026-08-11 10:37:03 -04:00
parent 804e19c51a
commit ef30369865
8 changed files with 57 additions and 7 deletions

View file

@ -47,6 +47,7 @@ class ServerConfig:
traversal_bind_host: str = "0.0.0.0"
traversal_port: int = 7771
traversal_public_host: str = "127.0.0.1"
build_revision: str = "unknown"
@classmethod
def from_environment(cls) -> "ServerConfig":
@ -82,6 +83,10 @@ class ServerConfig:
traversal_public_host=os.getenv(
"NETFISHING_DISCOVERY_TRAVERSAL_PUBLIC_HOST", "127.0.0.1"
),
build_revision=(
os.getenv("NETFISHING_DISCOVERY_BUILD_REVISION", "unknown").strip()
or "unknown"
)[:64],
)
@ -112,6 +117,7 @@ class DiscoveryRequestHandler(BaseHTTPRequestHandler):
"status": "ok",
"service": "netfishing-discovery-server",
"version": __version__,
"build_revision": self.server.config.build_revision,
"active_rooms": self.server.registry.room_count(),
},
)
@ -359,8 +365,10 @@ def _install_signal_handlers(server: BaseServer) -> None:
signal.signal(signal.SIGTERM, stop_server)
class TraversalUDPServer(socketserver.ThreadingUDPServer):
daemon_threads = True
class TraversalUDPServer(socketserver.UDPServer):
# Each packet performs one bounded JSON decode and one locked registry
# operation. A serial loop avoids creating an attacker-controlled thread
# for every untrusted datagram.
allow_reuse_address = True
def __init__(self, config: ServerConfig, registry: RoomRegistry) -> None:
@ -427,6 +435,7 @@ def main() -> None:
traversal_bind_host=config.traversal_bind_host,
traversal_port=config.traversal_port,
traversal_public_host=config.traversal_public_host,
build_revision=config.build_revision,
)
logging.basicConfig(
level=getattr(logging, arguments.log_level.upper(), logging.INFO),