挖洞经验 | 看我如何发现价值3万6千美金的谷歌RCE漏洞
字数 1738 2025-08-18 11:37:19
谷歌GAE RCE漏洞挖掘技术分析
1. 背景知识
1.1 Google App Engine (GAE)
GAE是谷歌提供的PaaS平台,允许开发者构建和托管Web应用。关键特性:
- 支持多种语言:Node.js、Java、Ruby、C#、Go、Python和PHP
- 自动扩展和负载均衡
- 使用谷歌数据中心资源
1.2 Google Protocol Buffer (Protobuf)
谷歌内部使用的数据序列化格式:
- 语言无关、平台无关
- 比XML/JSON更高效
- 用于RPC系统和数据存储
- 支持C++、Java、Python等语言
2. 漏洞发现过程
2.1 初始发现
- 观察到GAE应用响应头中包含"X-Cloud-Trace-Context"
- 发现appengine.google.com运行在GAE上但拥有特殊权限
2.2 内部API调用机制
在Java 8环境中发现GAE向内部服务发送Protobuf消息:
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>
消息结构:
- service_name: API名称
- method: API方法
- request: 二进制Protobuf消息
- request_id: 安全票据(必需)
2.3 安全票据获取
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());
2.4 网络探测
使用Nmap扫描内部网络(169.254.169.253)发现:
- 开放端口:4/tcp和10001/tcp
- 10001端口运行gRPC服务
2.5 gRPC客户端开发
创建C++ gRPC客户端与内部服务交互,发现:
- API名称:"apphosting.APIHost"
- 支持JSON和二进制Protobuf编码
3. 隐藏API发现技术
3.1 逆向分析
从JAR和二进制文件中提取Protocol Buffer定义:
- 关键文件:apphosting/base/appmaster.proto
- 发现"AppMaster" API接口
3.2 Java启动参数分析
通过C++代码获取Java启动参数:
int argc = -1;
char **argv = NULL;
static void getArgs(int _argc, char **_argv, char **_env) {
argc = _argc;
argv = _argv;
}
__attribute__((section(".init_array"))) static void *ctr = (void*) getArgs;
发现关键参数:
--api_call_deadline_map=app_config_service:60.0,blobstore:15.0,...
3.3 隐藏API枚举
通过分析发现多个内部API:
- stubby: Google内部RPC框架
- app_config_service: 应用配置服务
- basement: 包含用户认证相关方法
4. 漏洞利用技术
4.1 非生产环境访问
访问GAE模拟/测试环境:
- 上传包含手动扩展的App应用
- 修改Host头为特定格式:
<PROJECT-NAME>.prom-<qa/nightly>.sandbox.google.com- qa对应模拟环境,nightly对应测试环境
4.2 stubby API利用
分步调用流程:
- 获取stub_id:
{
"host": "<HOST>"
}
目标主机格式:
- 外部:"google.com:80"
- 内部:"blade:monarch-cloud_prod-streamz"
- 调用stubby.Send:
{
"stubby_method": "/ServerStatus.GetServices",
"stubby_request": "<PB>"
}
4.3 app_config_service利用
关键危险方法:
app_config_service.ConfigApp:修改应用配置app_config_service.SetAdminConfig:设置管理员配置
可执行操作:
- 修改邮件发件人白名单
- 更改服务账户ID
- 设置权限忽略规则
- 提升为"SuperApp"权限
- 授予FILE_GOOGLE3_ACCESS权限
5. 漏洞影响与修复
5.1 漏洞评级
- 被谷歌评为最高级别的远程代码执行(RCE)漏洞
- 影响非生产环境中的GAE部署
5.2 修复措施
- 谷歌拦截了对相关API的访问
- 大量请求返回429状态码
- 关键API添加访问控制
6. 学习要点总结
- 信息收集:从响应头、网络扫描、逆向分析中收集线索
- 协议分析:理解Protobuf和gRPC等内部协议
- 环境差异:比较生产与非生产环境的差异
- API枚举:通过多种方式发现隐藏API
- 安全测试:在授权范围内谨慎测试内部接口
7. 防御建议
对于企业安全团队:
- 限制内部API的暴露范围
- 实施严格的访问控制
- 监控异常API调用
- 定期审计权限配置
对于开发者:
- 避免在生产代码中保留调试接口
- 最小化API暴露面
- 实施输入验证和输出编码
- 使用最小权限原则配置服务