我如何找到 Google 一个价值 9 万美元的远程代码执行漏洞
来源:simonkoeck.com — 2026-10-12
📋 概述
Simon Koeck 在梳理 Google 开发者文档站共享的 OAuth 流程时,抓取了 /oauth2authorize 下发的 Flask session cookie:它有约 1200 字节,远超一个 CSRF token 加 return_url 所需,于是他把内容解码出来。Flask 会话 cookie 只签名不加密,前导点意味着 payload 经过 zlib 压缩;解压后里面是一个 pickle 序列化的 oauth2client OAuth2WebServerFlow 对象,并且明文带着 Google 的 OAuth client_id 与 client_secret。最致命的是他把这个 client_secret 当作 Flask SECRET_KEY 一试,发现给自己签发的 cookie 签名完全验证通过——签名密钥就藏在它签名的对象里。他没有停在侥幸猜测上,而是按 itsdangerous 的 cookie-session 派生方式离线重算签名加以确认,最终把伪造会话变成跨越七个 Google 域名的代码执行,获 9 万美元赏金。
🔑 核心要点
- 入口是 /oauth2authorize 下发的 Flask session cookie,约 1200 字节,远大于所需
- Flask 会话 cookie 只签名不加密,前导点表示 payload 经 zlib 压缩,内容对持有者完全可见
- 解出来是 pickle 序列化的 oauth2client OAuth2WebServerFlow 对象
- cookie 里明文带着 OAuth client_id 与 client_secret
- 核心缺陷:client_secret 同时被用作 Flask 的 SECRET_KEY,签名密钥藏在它签名的对象里
- 他用 itsdangerous 的 cookie-session 派生方式离线复算签名确认,而不是靠侥幸,最终打通跨七个 Google 域名的 RCE
💡 金句
developers.google.com 上的一个 Flask cookie,用一把它自己也随身携带的密钥签名。
👍 0
👎 0
← 返回 Lobsters 首页