From 0c6d64a5b230f970f985d8866fa48c25baa38494 Mon Sep 17 00:00:00 2001 From: Tai An Date: Fri, 17 Jul 2026 15:15:24 -0700 Subject: [PATCH] fix(security): bind balance_serve scheduler ZMQ socket to loopback (#2087) The balance_serve scheduler binds its ROUTER socket with tcp://*, i.e. 0.0.0.0 (all interfaces), and calls pickle.loads() on every received message with no authentication. Any host that can reach the auto-assigned sched_port can send a crafted pickle whose __reduce__ runs a shell command, achieving unauthenticated remote code execution as the server process (GHSA-83vp-v6wg-x93x). The scheduler RPC is purely inter-process: SchedulerClient always connects to tcp://localhost:{sched_port}, and the server is launched as a local subprocess. Binding to tcp://127.0.0.1 is therefore functionally identical for the legitimate local client while removing the socket from every non-loopback interface, closing the network attack surface. Applied to both the main and kt-sft copies of sched_rpc.py. --- archive/kt-sft/ktransformers/server/balance_serve/sched_rpc.py | 2 +- archive/ktransformers/server/balance_serve/sched_rpc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/archive/kt-sft/ktransformers/server/balance_serve/sched_rpc.py b/archive/kt-sft/ktransformers/server/balance_serve/sched_rpc.py index ccc30af58..589a696fb 100644 --- a/archive/kt-sft/ktransformers/server/balance_serve/sched_rpc.py +++ b/archive/kt-sft/ktransformers/server/balance_serve/sched_rpc.py @@ -28,7 +28,7 @@ def __init__(self, settings, main_args): self.context = zmq.Context() self.frontend = self.context.socket(zmq.ROUTER) print(f"sched zmq rpc server on port {main_args.sched_port}") - self.frontend.bind(f"tcp://*:{main_args.sched_port}") + self.frontend.bind(f"tcp://127.0.0.1:{main_args.sched_port}") self.backend = self.context.socket(zmq.DEALER) self.backend.bind("inproc://backend") diff --git a/archive/ktransformers/server/balance_serve/sched_rpc.py b/archive/ktransformers/server/balance_serve/sched_rpc.py index ab8b0dd7d..9fc835236 100644 --- a/archive/ktransformers/server/balance_serve/sched_rpc.py +++ b/archive/ktransformers/server/balance_serve/sched_rpc.py @@ -40,7 +40,7 @@ def __init__(self, settings, main_args): self.context = zmq.Context() self.frontend = self.context.socket(zmq.ROUTER) print(f"sched zmq rpc server on port {main_args.sched_port}") - self.frontend.bind(f"tcp://*:{main_args.sched_port}") + self.frontend.bind(f"tcp://127.0.0.1:{main_args.sched_port}") # 创建内部的 DEALER 套接字,用于与工作线程通信 self.backend = self.context.socket(zmq.DEALER)