AutoAgent 在主机 0.0.0.0 上发布了一个未经过认证的命令执行 TCP 服务器 (tcp_server.py),在一个将主机工作空间挂载到其中的容器中,以 root 权限运行攻击者提供的命令。
作者: geo-chen创建于 2026年6月13日更新于 2026年6月13日
容器创建(autoagent/environment/docker_env.py):
docker_command = [
"Docker", "run", "-d", "--name", self.container_name, "--user", "root",
"-v", f"{self.local_workplace}:{self.docker_workplace}", # 将主机目录挂载到容器中
"-w", f"{self.docker_workplace}", "-p", f"{self.communication_port}:{self.communication_port}", BASE_IMAGES,
"/bin/bash", "-c",
f"python3 {self.docker_workplace}/tcp_server.py --workplace {self.workplace_name} --conda_path {self.conda_path} --port {self.communication_port}"不带主机 IP 的 -p {port}:{port} 会将端口发布到主机的 0.0.0.0(项目自己的 check_container_ports 文档记录了结果映射为 0.0.0.0:12345->12345/tcp)。命令服务器(autoagent/environment/tcp_server.py)读取命令并使用 shell 运行,没有身份验证和允许列表:
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", args.port))
server.listen(1)
...
while True:
conn, addr = server.accept()
while True:
command = receive_all(conn) # 从客户端接收原始字节
if not command:
break
modified_command = f"/bin/bash -c 'source {args.conda_path}/etc/profile.d/conda.sh && conda activate autogpt && cd /{args.workplace} && {command}'"
process = subprocess.Popen(modified_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)receive_all 简单地读取直到 recv 返回少于 4096 个字节,因此执行一个命令字符串的 send。默认的 --port 是 12347(autoagent/cli.py)。没有令牌、签名或来源检查;协议是“连接,发送命令,接收输出”。由于容器是 --user root 并挂载了主机工作空间,执行的命令以 root 权限运行,并且可以读写主机端的工作空间文件(并从中进行漂移)。
内容来源: HKUDS/AutoAgent