价值$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。

非生产环境访问方法

  1. 上传一个缩放类型为手动缩放的版本
  2. 向"www.appspot.com"发送请求,修改Host头部为:
    • Staging环境: <project-name>.prom-qa.sandbox.google.com
    • 测试环境: <project-name>.prom-nightly.sandbox.google.com

漏洞利用细节

stubby API利用

  1. 调用"stubby.GetStubId"方法:

    {
      "host": "<HOST>"
    }
    

    返回包含stub_id的响应

  2. 调用"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.GetAppConfig
  • app_config_service.ConfigApp
  • app_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奖励

技术要点总结

  1. GAE内部使用Protocol Buffer进行RPC通信
  2. 通过反射可以获取关键安全票据
  3. 非生产环境存在未受保护的内部API端点
  4. stubby和app_config_service API暴露了危险功能
  5. 漏洞利用链最终导致远程代码执行

防御建议

  • 严格隔离生产与非生产环境
  • 内部API应实施强认证机制
  • 限制反射等可能暴露内部信息的功能
  • 监控异常的内部API调用模式
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)消息执行内部操作: PB消息格式为"apphosting.ext.remote_ api.Request",包含: service_name : 要调用的API名称 method : 要调用的API方法 request : 内部PB请求的字节数据(二进制编码) request_id : 安全票据(必需) 获取安全票据 Java代码获取安全票据的方法: 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 漏洞利用细节 stubby API利用 调用"stubby.GetStubId"方法: 返回包含 stub_id 的响应 调用"stubby.Send"方法: 可通过设置 stubby_method 为"/ServerStatus.GetServices"获取所有可用服务列表 app_ config_ service API利用 发现的其他内部API方法: app_config_service.GetAppConfig app_config_service.ConfigApp app_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调用模式