价值$36k的Google App Engine RCE漏洞详情
字数 1550 2025-08-29 08:32:18
Google App Engine RCE漏洞分析与利用教学文档
漏洞概述
本漏洞是一个Google App Engine (GAE)的远程代码执行(RCE)漏洞,发现于2018年初,漏洞奖励金额高达$36,337美元。漏洞允许攻击者通过内部API访问GAE的非生产环境(staging/测试环境),执行未授权的操作。
漏洞发现背景
- 每个GAE应用都使用"X-Cloud-Trace-Context"头部响应HTTP请求
- "appengine.google.com"本身运行在GAE上,但能执行普通应用无法完成的操作
- 这些特殊操作通过内部API、接口实现,只有Google自己的应用才能访问
内部API发现
HTTP端点发现
在Java 8环境中,GAE应用通过向内部HTTP端点发送ProtocolBuffer(PB)消息执行内部操作:
POST /rpc_http HTTP/1.1
Host: 169.254.169.253:10001
X-Google-RPC-Service-Endpoint: app-engine-apis
X-Google-RPC-Service-Method: /VMRemoteAPI.CallRemoteAPI
Content-Type: application/octet-stream
Content-Length: <LENGTH>
<PROTO_MESSAGE>
PB消息格式为"apphosting.ext.remote_api.Request",包含:
service_name: 要调用的API名称method: 要调用的API方法request: 内部PB请求的字节数据(二进制编码)request_id: 安全票据(必需)
获取安全票据
Java代码获取安全票据的方法:
import com.google.apphosting.api.ApiProxy;
import java.lang.reflect.Method;
Method getSecurityTicket = ApiProxy.getCurrentEnvironment().getClass().getDeclaredMethod("getSecurityTicket");
getSecurityTicket.setAccessible(true);
String security_ticket = (String)getSecurityTicket.invoke(ApiProxy.getCurrentEnvironment());
gRPC服务发现
通过端口扫描发现169.254.169.253:4运行gRPC服务,提供"apphosting.APIHost" API。
非生产环境访问方法
- 上传一个缩放类型为手动缩放的版本
- 向"www.appspot.com"发送请求,修改Host头部为:
- Staging环境:
<project-name>.prom-qa.sandbox.google.com - 测试环境:
<project-name>.prom-nightly.sandbox.google.com
- Staging环境:
漏洞利用细节
stubby API利用
-
调用"stubby.GetStubId"方法:
{ "host": "<HOST>" }返回包含
stub_id的响应 -
调用"stubby.Send"方法:
{ "stubby_method": "/<SERVICE>.<METHOD>", "stubby_request": "<PB>", "stub_id": "<STUB_ID>" }可通过设置
stubby_method为"/ServerStatus.GetServices"获取所有可用服务列表
app_config_service API利用
发现的其他内部API方法:
app_config_service.GetAppConfigapp_config_service.ConfigAppapp_config_service.SetAdminConfig
危险功能:
- 设置电子邮件发件人
- 修改应用程序服务帐户ID
- 忽略配额限制
- 将应用设为"SuperApp"
- 授予"FILE_GOOGLE3_ACCESS"权限
漏洞修复与影响
- Google在2018年3月6-13日期间封锁了对非生产性GAE环境的访问
- 访问尝试会返回"429 Too Many Requests"错误
- 漏洞被评定为高危RCE漏洞
时间线
- 2018年2月: 漏洞发现
- 2018年2月25日: 初次报告(stubby API)
- 2018年3月4-5日: 发现并报告app_config_service API
- 2018年3月6-13日: 访问被封锁
- 2018年3月13日: 颁发$36,337奖励
技术要点总结
- GAE内部使用Protocol Buffer进行RPC通信
- 通过反射可以获取关键安全票据
- 非生产环境存在未受保护的内部API端点
- stubby和app_config_service API暴露了危险功能
- 漏洞利用链最终导致远程代码执行
防御建议
- 严格隔离生产与非生产环境
- 内部API应实施强认证机制
- 限制反射等可能暴露内部信息的功能
- 监控异常的内部API调用模式