近日,京东安全獬豸实验室携最新技术研究,在 Black Hat Asia 2025 上,与参会者进行了广泛而深入的交流 。京东安全实验室研究员分享了 "KubeAPI-Inspector: discover the secrets hidden in apis" 的议题,与参会者探讨了 Kubernetes Extension API Server 在特定场景下存在的安全漏洞,以及如何开发一款工具来发现潜在的 K8S API 安全风险。该工具也为弥补目前鲜有面向 K8s API 安全检测的开源工具这一短板提供了一些思路和方法。
K8s 以声明式 API 为核心,可以说“一切皆 API”。无论是用户、控制平面组件(如 Kubelet、Controller Manager),还是外部系统,都必须通过 API Server 进行通信和交互。
一般情况下,创建 CustomResourceDefinition (CRD) 对象即可在 K8s API Server 中完成新的数据类型注册,并且根据资源定义自动生成 OpenAPI Schema,一同合并到 API Server 的 OpenAPI 端点。创建 CRD 后,开发者可以像使用内置资源一样,对自定义资源 (Custom Resource, CR) 进行 CRUD 操作,并根据 API 定义实现 Operator/Controller 的处理逻辑,从而完成集群的功能扩展。
如果业务需求相对复杂,例如需要自定义 subresources 或实现复杂的 authz/authn 功能,K8s 还提供了另一种扩展功能机制 —— Extension API Server。这种机制允许开发者按照 Kubernetes API 规范添加自定义 API,并以“独立”API Server 的形式处理特定 API 组(例如 workshop.io/v1)的请求。为了使主 K8s API Server 感知到新的 API,需要通过 APIService 对象进行注册,将特定 API 组的请求转发至指定 Service 对应的 Extension API Server(见扩展 API 工作流程图)。此外,Extension API Server 需要自行提供 OpenAPI 端点,供主 APIServer 聚合和公开 API 定义。
当使用 Extension API Server 机制增强功能时,K8s APIServer 充当聚合/代理转发的角色。请求通过主 K8s API Server 认证后,将会转发至Extension APIServer。路由系统会根据请求的 GVR (Group Version Resource) 和 HTTP 方法匹配到对应的 REST Handler。通常情况下,开发者会参考 K8s 官方示例项目,使用“结构体嵌入”(方法提升)特性来实现默认的 CRUD 逻辑。另外,开发者也可以根据需求,按照 rest.StandardStorage 的定义自行实现 CRUD 处理逻辑。
在自定义 API 发现方面,我们采用了 client-go 所包含的 DiscoveryClient ,以实现发现 K8s 所有 API 端点,其原理是访问 /apis 接口获取所有已注册的 API 组,并循环访问每个 API 组的版本以获取资源列表。通过这种方法,再结合 OpenAPI 端点定义的 API 结构,即可找到所有待测目标。
为了覆盖所有的 API Verb 请求,其中包括可能中断流程或执行危险操作的方法,如 Watch、DeleteCollection,在 Kubernetes 的 rest.Storage 实现中可以发现,Kubernetes 开发者为 API Verb 开发了许多可选参数,其中包括 dryRun 模式以及限制请求长度和时间的选项。这样,我们就可以使用 dryRun 安全地覆盖检测 DeleteCollection 方法。
Kubernetes 可扩展性虽然强大,但也带来了新的安全风险,知名云安全公司 Wiz 发现的 “IngressNightmare” 严重漏洞为此敲响了警钟。希望通过分享此次研究发现,能够使大家了解到不当使用 Extension API Server 机制同样存在安全风险,并为发现和检测此类漏洞提供一些思路。