安全研究员 Simon Köck 在 DevSite 中发现一个未公开的远程命令执行漏洞后,Google 向其支付了 9 万美元奖励。DevSite 是支持 developers.google.com 及其他文档网站的共享平台。Köck 于 8 月 6 日报告了该问题,Google 于次日接受报告,并于 8 月 27 日同意支付奖励,但修复程序直到 10 月 7 日才部署到服务器。
Google 将该漏洞评定为 S0,这是其严重性评级中的最高级别,并向 Köck 支付了 7.5 万美元的基础奖励,作为应用层常规范围内 RCE 漏洞的奖励;由于报告质量特别高,奖励额外增加了 20%。
三个错误构成了利用链
DevSite 将已序列化的、来自已弃用 oauth2client 库的 OAuth2WebServerFlow 对象存储在 Flask 会话 Cookie 中。这导致 OAuth 客户端密钥泄露,但问题之所以更加严重,是因为同一个密钥还被用作 Flask 会话签名密钥。
Köck 得以在本地重新生成 Cookie 签名,并创建服务器能够接受的伪造会话。由于 OAuth 流程使用 pickle 对会话数据进行反序列化,他可以将该对象替换为经过签名的恶意 pickle 载荷,并随后证明能够远程执行 Python 代码。
研究人员使用了一个通过 sleep 命令延迟响应的载荷来确认执行,并在运行实际命令或访问文件、凭据及内部服务之前故意停止。根据他的说法,七个受影响域名都接受了伪造会话,而概念验证测试则在其中三个域名上执行,分别是 developers.google.com、docs.partner.android.com 和 web.dev。
影响范围尚未完全确定
Köck 没有证实服务器是否能够修改 Google 文档内容,或替换安装命令和下载链接;这种情况本可能为软件供应链攻击打开大门。他也没有测试伪造会话是否能够冒充用户或访问其数据。
研究人员 Arvin Shivram(以 @brutecat 为人所知)指出,内部 App Engine 应用通常可能访问 Stubby,即 Google 的内部服务间通信系统。Köck 表示,如果该进程确实拥有这种访问权限,影响范围可能会大幅扩大,但他没有验证 DevSite 的权限,或其对后端服务的访问范围。
为什么这条消息值得关注?
这一事件表明,风险并非源于单一错误,而是三种做法叠加的结果:在 Cookie 中暴露敏感密钥、将其重复用作签名密钥,以及对不可信数据进行不安全反序列化。修复其中任一环节都足以切断利用路径,这说明隔离密钥以及拒绝在会话数据中使用 pickle 是基本控制措施,而不是可有可无的改进。
另一方面,持续近两个月的修复期限引发了一些 Google 尚未回答的运营问题。公司没有说明是否采取了临时缓解措施,是否更换了 Köck 所称由七个域名使用的两个不同签名密钥,或是否使现有会话失效。公司也没有披露在发布补丁前该漏洞是否可能已被利用的取证结果;在 The New Stack 更新报道时,Google 尚未回应其置评请求。
新闻来源
The New Stack - Software Development
查看原始来源 ↗