需在docker运行时阻断权限提升、网络逃逸、命令注入等攻击:强制非特权用户(uid 1001)、启用no-new-privileges、禁用网络栈(network: none)、限制资源与高危系统调用(seccomp)、实施命令白名单与人工审批、挂载只读卷并禁用敏感路径。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

防止Hermes Agent容器被恶意攻击,需在Docker运行时层面阻断权限提升、网络逃逸、命令注入等常见攻击路径,避免因配置疏漏导致宿主机沦陷或敏感数据泄露。
启用强制非特权用户与权限锁定
容器内进程若以root身份运行,一旦被攻破即可直接操控宿主机文件系统与内核资源。必须从镜像构建阶段就切断该风险链。
第一步:打开项目根目录下的Dockerfile,在复制代码后、声明CMD前插入两行:
RUN groupadd -g 1001 -f hermes && useradd -r -u 1001 -g hermes hermes
USER hermes
第二步:构建镜像后验证用户身份——执行docker run --rm your-image id,输出中uid必须为1001且无root字样;若仍显示uid=0(root),说明USER指令被覆盖或位置错误。
第三步:检查tools/environments/docker.py中是否启用--security-opt no-new-privileges,该参数禁止容器内进程获取新权限,是防御提权攻击的硬性前提。【未启用此参数将使非root用户配置形同虚设】
彻底禁用网络栈并验证隔离效果
多数攻击依赖网络通道外连C2服务器、下载恶意载荷或横向渗透,对无需联网的任务场景,应直接拔掉网线。
方法一:修改environments/benchmarks/terminalbench_2/default.yaml,显式设置network: none;
方法二:启动容器时强制传参——docker run --network=none -it hermes-agent;
验证是否生效:进入容器执行ip addr,输出中不应出现eth0或任何IPv4地址;若看到lo以外的接口,说明--network=none被其他配置覆盖。
限制容器资源并阻断危险系统调用
攻击者常通过fork炸弹耗尽CPU、内存溢出触发OOM killer杀掉关键进程,或利用ptrace、mount等syscall实现容器逃逸。
在docker run命令中加入以下参数:
--memory=512m --cpus=1.0 --pids-limit=100 --security-opt seccomp=tools/seccomp/default.json
其中seccomp策略文件需包含对unshare、clone(带CLONE_NEWNS标志)、open_by_handle_at等高危syscall的SCMP_ACT_ERRNO拦截;若该文件缺失或路径错误,Docker会静默忽略seccomp配置,导致防护失效。
执行docker stats hermes-agent确认内存与CPU使用率始终被压制在设定阈值内,超出即自动OOM终止。
实施技能级输入过滤与命令审批
动态生成的shell脚本或Python代码可能携带os.system("rm -rf /")类恶意逻辑,仅靠静态扫描无法捕获所有变种,必须在执行前介入校验。
方法一:启用tools/skills_guard.py模块,在EXTERNAL_DOMAIN_BLOCKLIST中添加正则规则拦截可疑域名;
方法二:配置skills/registry.py中的command_whitelist,仅允许ls、cat、grep等安全命令通过,其余一律拒绝;
方法三:对高危操作(如chmod、curl、python -c)开启人工审批模式,执行前需管理员在Web UI点击确认——该开关位于skills/mcp/servers/auth.py的enable_command_approval字段。
挂载只读卷并禁用敏感路径访问
容器若挂载宿主机/etc、/proc或/sys目录,攻击者可篡改系统配置、读取进程内存或修改内核参数。
检查所有docker run命令中的-v参数,确保:
• 挂载的配置目录(如/app/config)使用:ro后缀标记为只读;
• 绝不挂载/、/etc、/usr、/bin等系统路径;
• 工作目录/workspace需独立于宿主机任何系统目录,避免符号链接绕过。
执行docker inspect hermes-agent | jq '.[].Mounts',输出中每个Destination字段都应指向容器内非系统路径,且Mode字段为ro。











