Kong是开源的、"云原生"(cloud-native)的API Gateway应用程序,使用Kong gateway的各种插件可实现对访问流量的精细控制、访问鉴权。
其官方称Kong是针对与云与混合架构的下一代API平台.
Next-Generation API Platform for Multi-Cloud and Hybrid Organizations.
端口用途 | HTTP port | HTTPS port | 备注 |
---|---|---|---|
Admin Restful API | 8001 | 8444 | Kong社区版 Admin Restful API端口 应仅能被管理员访问 |
Proxy Port | 8000 | 8443 | 提供给公网访问 |
该漏洞根本原因:不恰当的配置导致"Admin Restful API的端口可被公网访问".
根据修复漏洞CVE-2020-11710的diff https://github.com/Kong/docker-kong/commit/18c4029ee3d4acfece679fa87b5dd081fb56fdd5
可知修复方法是把Admin Restful API端口(8001 和 8444) 的监听从0.0.0.0改成了127.0.0.1
复现漏洞:根据修复漏洞前的官方安装步骤 - 使用docker安装Kong Gateway Community进行安装:
可发现,以下命令中有不恰当的配置,导致了"Admin Restful API的端口可被公网访问":
(1)倒数第3行的8001:8001
表明,访问 0.0.0.0:8001 就等于访问容器"kong"的8001端口。
(2)倒数第2行的8444:8444
存在同样的情况。
$ docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest
所以根据修复漏洞前的安装步骤进行安装后,默认情况下,Kong的4个端口可被公开访问,其中包括了Admin Restful API所用的2个端口(HTTP port:8001 , HTTPS port:8444),攻击者可利用Admin Restful API来管理Kong Gateway的全部功能。
https://github.com/1135/Kong_exploit/
如,通过Kong的未授权漏洞实现了可回显的SSRF,对某内网系统进行访问:
(页面内的css资源使用了相对路径,没获取到,如果需要获取再创建一个"服务"即可)
因为Kong常搭建在云环境中,云环境中的SSRF漏洞的危害更大,参考云安全 - 研究云环境下对SSRF的检测与防御(以AWS为例) - 先知社区,简单说就是利用SSRF漏洞->访问云提供商自带的管理API->获取云服务器访问权限
。
1.仅本机可访问Admin Restful API. 修改 docker-compose.yaml: 将8001:8001
改为127.0.0.1:8001:8001
,将8444:8444
改为127.0.0.1:8444:8444
2.设置严格的ACL,仅允许必要的访问
Kong未授权漏洞根本原因:不恰当的配置导致"Admin Restful API的端口可被公网访问"。
所以不管使用哪个版本,只要进行了不恰当的配置,导致Admin Restful API可被攻击者访问,都会存在风险。
Kong的用途决定了它可以管理一些南北向流量,内网可访问的范围大。
而且Kong是"云原生"(cloud-native)应用,常部署在云环境上,如果Kong不恰当配置导致存在未授权漏洞,危害更大。
漏洞原理简单,但应重视不恰当配置导致的漏洞。