挖洞经验 | 看我如何发现价值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模拟/测试环境:

  1. 上传包含手动扩展的App应用
  2. 修改Host头为特定格式:
    • <PROJECT-NAME>.prom-<qa/nightly>.sandbox.google.com
    • qa对应模拟环境,nightly对应测试环境

4.2 stubby API利用

分步调用流程:

  1. 获取stub_id:
{
  "host": "<HOST>"
}

目标主机格式:

  • 外部:"google.com:80"
  • 内部:"blade:monarch-cloud_prod-streamz"
  1. 调用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. 学习要点总结

  1. 信息收集:从响应头、网络扫描、逆向分析中收集线索
  2. 协议分析:理解Protobuf和gRPC等内部协议
  3. 环境差异:比较生产与非生产环境的差异
  4. API枚举:通过多种方式发现隐藏API
  5. 安全测试:在授权范围内谨慎测试内部接口

7. 防御建议

对于企业安全团队:

  1. 限制内部API的暴露范围
  2. 实施严格的访问控制
  3. 监控异常API调用
  4. 定期审计权限配置

对于开发者:

  1. 避免在生产代码中保留调试接口
  2. 最小化API暴露面
  3. 实施输入验证和输出编码
  4. 使用最小权限原则配置服务
谷歌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消息: 消息结构: service_ name: API名称 method: API方法 request: 二进制Protobuf消息 request_ id: 安全票据(必需) 2.3 安全票据获取 Java代码获取安全票据: 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启动参数: 发现关键参数: 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: 目标主机格式: 外部:"google.com:80" 内部:"blade:monarch-cloud_ prod-streamz" 调用stubby.Send: 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暴露面 实施输入验证和输出编码 使用最小权限原则配置服务