2023 年 10 月 25 日,美国国家标准与技术研究院(NIST)收到了三个影响为 Kubernetes 打造的 NGINX Ingress Controller 的 CVE 漏洞报告:
- CVE-2022-4886 – ingress-nginx 的路径验证功能可能被
log_format
指令绕开。 - CVE-2023-5043 – ingress-nginx 的注释注入可导致任意命令的执行。
- CVE-2023-5044 – 注解 nginx.ingress.kubernetes.io/permanent-redirect 引起的代码注入风险。
这个 CVE 漏洞报告以及随之而来的相关文章(比如《紧急:在为 Kubernetes 打造的 NGINX Ingress Controller 中发现新的安全问题》)引起了一些混淆(以及不少技术支持服务的请求)— 到底是哪个版本的 NGINX Ingress Controller 受到影响?以及谁应该为解决这些 CVE 所描述的漏洞而感到担忧?
混淆的情况完全可以理解 — 您知道实际上有不止一种 Ingress controller(Ingress 控制器)是基于 NGINX 开发的吗?
首先,有两个完全不同的项目都叫“NGINX Ingress Controller”:
- 社区项目 – 这个版本的 Ingress controller 可在 GitHub 上的 kubernetes/ingress-nginx 代码库中找到。它基于 NGINX 开源版作为数据平面,但由 Kubernetes 社区开发和维护,其文档也被托管在 GitHub 上。
- NGINX 的项目 – NGINX Ingress Controller 可在 GitHub 上的 nginxinc/kubernetes-ingress 代码库中找到。它是由 F5 NGINX 开发并维护的,其文档被发布在 docs.nginx.com。这个 NGINX 官方项目有两个版本:
- 基于 NGINX 开源版的 NGINX Ingress Controller(免费且开源)
- 基于 NGINX Plus 的 NGINX Ingress Controller(商用版本)
除此之外还有其他基于 NGINX 的 Ingress controller,比如 Kong。幸运的是,它们的名字很易于区分。如果您不确定您正在使用的是哪个版本的 Ingress controller,您可查看您正在运行的 Ingress controller 的容器镜像,然后将其 Docker 镜像名字与上面列出的代码库做对比。
上面提到的漏洞(CVE-2022-4886、CVE-2023-5043 和 CVE-2023-5044)只适用于社区版的 Ingress controller (kubernetes/ingress-nginx)。NGINX 的 NGINX Ingress Controller 项目(nginxinc/kubernetes-ingress,包括开源的和商业的)都不受这些 CVE 的影响。
欲了解 NGINX Ingress Controller 和 Ingress controller 之间差异的更多信息,请阅读我们的博客文章《Ingress Controller 选型指南,第四部分:NGINX Ingress Controller 选项》。