在 NAS 或者一台小主机上跑 Docker,早就成了折腾党的常规操作:装个面板,拉一堆容器,相册、博客、网盘、代码仓库,一气呵成。
但今天(8 月 17 日)流传的两篇安全文章,可能会让这种安逸稍微刺一下:一篇讲的是 Gitea 官方 Docker 镜像的认证绕过漏洞(CVE-2026-20896,CVSS 9.8),另一篇复盘的是 Docker Compose 默认配置组合出来的匿名 RCE 攻击链。两篇文章本身是 AI 辅助整理的安全专栏,具体细节建议以官方公告为准,但它们指出的问题并不新鲜——都是自建圈反复踩的那类坑:默认配置。

今天这两篇文章,说了什么
先说 Gitea 这条。按文章的描述,漏洞的根因是 CWE-1188(不安全默认值):Gitea 官方文档里,反向代理信任地址的默认值是仅回环(127.0.0.0/8),但官方 Docker 镜像的 app.ini 模板里,这一项被硬编码成了通配符 `*`——等于信任来自任何 IP 的身份头。如果你开启了反向代理认证(ENABLE_REVERSE_PROXY_AUTHENTICATION),攻击者只要能给容器发请求,注入一个 X-WEBAUTH-USER 头,服务器就把他当成指定的任何用户;要是再开着自动注册,对方甚至可以建一个和管理员同名的账号,直接拿到完整权限。文章还提到,漏洞披露 13 天后就有安全厂商观察到针对公网暴露 Gitea 实例的自动化扫描。知乎
再说第二条。这篇讲的不是单个 CVE,而是一条经典的组合攻击链:扫描公网 → 发现暴露的 Redis、MongoDB、Jenkins 端口 → 匿名连接 → 利用未授权接口写文件、执行命令 → 反弹 Shell → 再通过挂载的 docker.sock 或宿主目录逃逸到宿主机。知乎这条链在安全圈属于老熟人了,每一步都有大量真实案例,它的四个环节——默认暴露、默认无认证、默认 root、默认全权限——恰好也是大多数人跟着教程部署时的"默认状态"。
先别慌:看看自己在不在射程内
这类消息最容易引发两种反应:一种是立刻想重装一切,另一种是"跟我没关系"。更值得做的是先花一分钟判断自己的暴露面:
第一,你的服务有没有暴露在公网?纯内网使用、路由器没做端口映射的容器,被公网扫描到的概率基本为零,风险等级完全不同。
第二,Gitea 这个洞有明确前提:启用了反向代理认证才会中招。如果你只是普通的账号密码登录,这条对你影响有限。但如果你用的是 Gitea 官方 Docker 镜像,顺手检查一下这个配置项没有坏处。
第三,真正普遍的问题不是某一个 CVE,而是部署习惯。教程怎么省事怎么写,compose 文件里一行 `“6379:6379”`,端口就对所有网卡开放了——这个习惯不改,堵完这个洞还有下一个。
10 分钟自查清单:5 项,按顺序查
第 1 项:盘点你在跑什么。用 Portainer、Dockhand 这类面板,或者直接 `docker ps`,把容器列一遍,重点看每个容器映射了哪些端口、绑在哪个地址上。知乎很多人容器装完就再没看过,这一眼本身就值回票价。

第 2 项:看端口绑定。compose 里写 `“3000:3000”`,容器端口就绑到 0.0.0.0;写成 `“127.0.0.1:3000:3000”`,就只有本机能访问。所有不需要对外提供的服务(数据库、管理后台、内部 API),都建议加上 `127.0.0.1:` 前缀,需要远程访问的交给内网穿透工具去管入口。
第 3 项:高危服务必须上锁。Redis、MongoDB、Jenkins、Elasticsearch 这类服务,默认配置基本都是"裸奔"状态。只要有任何暴露到公网的可能,先把认证配上:Redis 设 requirepass 强密码,MongoDB 开 auth,Jenkins 别用默认匿名权限。裸奔的 Redis 被写入定时任务挖矿,是过去几年最常见的入侵剧本之一。
第 4 项:检查挂载。两类挂载要特别警惕:`/var/run/docker.sock` 和宿主机根目录。把 docker.sock 挂进容器,等于把宿主机的 root 权限交了出去,这类挂载一般只有监控、备份类工具需要,且容器本身必须可信;根目录挂载则意味着容器被攻破后,你的照片、文档全部敞开。
第 5 项:Gitea 用户专项。查两个配置:ENABLE_REVERSE_PROXY_AUTHENTICATION 是否开着;REVERSE_PROXY_TRUSTED_PROXIES 是不是 `*`。用不到反向代理认证就直接关掉;用得到就把信任地址收窄到代理实际所在的网段。另外按漏洞文章的建议,官方镜像建议升级到 1.26.4(1.26.3 有代码页回归问题)。
官方也在补位:免费的安全强化镜像
顺带说个背景。今天微博上也有账号在转"Docker 官方强化镜像免费开源"的消息。微博这其实是去年底的事:2025 年 12 月,Docker 把此前收费的 Hardened Images(DHI)改为免费发布,并以 Apache 2.0 协议开源,数量超过 1000 款,覆盖 PHP、Redis、Python、PostgreSQL、Node.js 等常用基础镜像,主打从源码构建、CVE 透明披露和供应链可验证。微博微博

对自建用户来说,它的意义在于:换基础镜像的成本被官方打下来了。如果你的服务对安全敏感(比如面向公网的 Gitea、博客),把基础镜像换成对应的 hardened 版本,相当于少踩一层"上游镜像自带漏洞"的雷。当然,它解决的是镜像本身的安全基线,上面清单里的端口、认证、挂载问题,还是得自己查——镜像再干净,`“6379:6379”` 照样裸奔。
写在最后
上个月 Docker 引擎层的逃逸漏洞(CVE-2026-17106)闹过一轮,引擎层的洞官方会修、会发版;但默认配置这类问题,修复责任永远在部署的人手上。容器不是安全边界,配置才是——默认配置是给开发环境用的,不是给公网用的。
最后留个互动:你的 NAS 或小主机上现在跑着几个容器?有没有哪个端口是对公网开放的?评论区聊聊,顺便把这篇转给那个"教程抄完就没管过"的朋友。