K8S爆特权提升漏洞,用户请即刻升级!

概述

通过精心设置的Web请求,使得任何用户都可以通过K8s API服务器与后端服务器建立连接。一旦建立,攻击者就可以通过网络连接直接向该后端发送任意请求。K8s API服务器的传输通过TLS凭证对用户请求进行身份验证。 在默认配置中,未对该特权提升API进行限制,允许所有用户(经过身份验证和未经身份验证的用户)执行操作,可以实现对K8s集群中所有节点机器的所有控制操作,包括ROOT权限。

目前还没有简单的方法来审计该漏洞是否已被漏洞。由于未经授权的请求是通过已建立的连接进行的,因此它们不会出现在Kubernetes API服务器审计日志。只会出现在kubelet或聚合的API服务器日志中,但是在这些日志中,无法与正确授权和代理的请求进行区分。

影响范围

· Kubernetes V1.0.x-1.9.x

· Kubernetes vV1.10.0-1.10.10 (V1.10.11修复)

· Kubernetes V1.11.0-1.11.4 (V1.11.5修复)

· Kubernetes V1.12.0-1.12.2 (V1.12.3修复)

漏洞分析

从kube-api服务器到kubelet 的连接是依靠 kube-api服务器的 TLS(SSL) 凭证实现的,只要拥有已经建立的TLS连接, 那么kubelet 就会认可来自kube-api服务器的请求并且完成相应的操作。默认情况下kubelet是允许执行所有API权限的操作。

漏洞的产生是在k8s apimachinery/pkg/util/proxy/upgradeaware.go 接口的权限没有严格判断,使得用户对该接口访问后就可以获得对应特权的TLS连接。

涉及的函数为(h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Request):

通过ServeHTTP调用tryUpgrade函数处理代理响应请求,在 UpgradeRequestRoundTripper接口描述中,所有有关Upgrade的响应都会经由代理(Proxy)处理。在用户通过API向后端发起请求时,API Server 会预先进行一次判断,通过函数 httpstream.IsUpgradeRequest判断 Http请求的头部是否包含 Upgrade 字段进,如果不包含Upgrade,则判断失败结束。该处理过程中,使用了 http.Hijacker包, Golang常用于对Http请求消息进行转发。而此刻 Proxy服务器具有全访问权限,由于处理逻辑漏洞,致使转发任意的请求(正常特权请求和非特权请求)也附上了所有权限。

漏洞修补中,新增加了一个函数getResponseCode函数来获取请求状态码?转发之前对rawResponseCode进行判断,对非特权请求予以关闭:

新增加的getResponseCode函数返回状态码:

对rawResponseCod状态码判断:

当客户端请求和服务端状态不一致则关闭该连接,就不会获得相应的特权凭据了。

修复建议

由于该漏洞影响巨大,属于严重漏洞,建议即刻升级到对应系列的最新版本:

Kubernetes V1.10.11

Kubernetes V1.11.5

Kubernetes V1.12.3

Kubernetes V1.13.0-rc.1

安全设置建议:

针对匿名用户通过一些安全设置限制提对应权限:

暂停使用聚合的API服务器(影响使用聚合服务器API的用户)

设置 --anonymous-auth = false传递到kube-apiserver禁用匿名请求(影响kube-apiserver的负载均衡器或kubelet运行状况检查,并中断kubeadm join设置流程)

删除对所有聚合API的所有匿名访问;对非聚合API的完全访问权限的用户删除对所有聚合API访问权限;

非特权kubelet API 用户中删除pod exec/attach/ portforward权限

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181207A0BDYO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券