专栏首页贺嘉的专栏一篇文章带你看懂 Cloudflare 信息泄露事件
原创

一篇文章带你看懂 Cloudflare 信息泄露事件

1.问题描述

近期根据 Hacker News 的报道,以及国际 CDN 厂商 cloudflare 的公告,我们注意到了一起敏感信息、API 密钥被 Cloudflare 泄露给了随机的 requesters 请求,同时相关敏感数据也被搜索引擎给收录的问题。

这一问题持续了 2016-09-22至 2017-02-18近半年时间,最为严重的阶段是2-13至2-18 每 3,300,000 HTTP 请求就有可能泄露一份内存数据(近总请求量的0.00003%),预计是100k-200k 页面涉嫌数据泄露。包括 uber 在内的一系列知名互联网企业可能受到影响。

以下是可能受到这一问题影响的网站清单:https://github.com/pirate/sites-using-cloudflare/blob/master/README.md

2.信息泄露问题原因

Cloudflare CDN 服务 会对 HTML 标签进行重新解析,比如将 Google Analytics 的标签插入到 HTML 中, 安全地重写 http:// 链接成为 https:// , 模糊 email 邮箱地址等等。但是由于 NGINX 模块中的 HTML 解析功能存在指针问题,导致在用户之间共享的反向代理存在信息泄露问题,最早是由 Google’s Project Zero 的研究员 Tavis Ormandy 发现。

之前 Cloudflare 的 HTML 解析一直使用标准的 Ragel 有限状态机编译器( www.colm.net/open-source/ragel/) ,但是前段时间Cloudflare为了提升代码效率对解析器进行了升级,将其升级为 cf-html 并测试了其对 HTML5 的解析是没有问题的。但是问题出在了开发团队错误的使用了 Ragel 的编码规范,Ragel 的代码会被自动编译为 C 语言的代码,而 C 语言允许更加灵活的使用指针。

/* generated code */ if ( ++p == pe ) goto testeof;

以上Ragel自动生成的代码会导致指针越界,也就是常见的内存泄露问题。但是之前Ragel实现的HTML 解析模块单独使用并不会触发信息泄露问题,而是仅当基于 Ragel 解析器与 Cloudflare 升级后的 cf-html 解析器一起工作的时候才会触发这一问题。

3.解决方案

3.1迁移至腾讯云CDN

腾讯云CDN提供基于角色的CDN权限控制,并且支持以API接口方式调用。同时新用户开通CDN即连续6个月,每月赠送50G流量包。

* 财务管理员
* 超级管理员
* 云资源管理员

超级管理员拥有创建者的所有权限,可以进行其他子用户的分配;而云资源管理员拥有对所有云资源的管理权限,但不可以创建其他子用户。部分功能仅能够供预设管理员使用,具体如下:

* 使用云API DescribeCdnHosts 获取账户下所有域名详细信息;
* 使用云API UpdateCdnProject 或在 CDN控制台 进行域名所属项目的切换;

项目管理员除了预设管理员外,还可以按照项目维度划分权限,即项目管理员。项目管理员可以管理指定项目中所有的云资源。

项目管理员可以通过自定义策略 中服务类型为项目管理的策略进行指派,该策略拥有两个功能:

* 管理 CDN 业务项目内云资源
* 管理其他业务项目内云资源

3.2考虑在你的应用中实现 Keyless (无密钥加载)架构

对证书稍微熟悉的朋友都知道,SSL 密钥和证书都是成对使用的,一个证书一定唯一对应一个私钥。整个 HTTPS 最重要的一个数据就是 SSL 的私钥了,如果私钥泄露,整个握手过程就可以被劫持,签名可以被伪造,对称密钥也可以被破解。整个 HTTPS 就毫无安全可言。

传统的私钥使用方案和风险传统的私钥方案就是将私钥和应用程序绑定在一起。比如大家熟知的 nginx, apache,如果想使用 HTTPS,必须在部署 nginx 的接入机器上部署相关的证书和私钥。

这种方案会有如下安全上的问题:私钥部署在云端或者 CDN,如果泄露了怎么办?

无秘钥方式虽然腾讯云的内网非常安全,但是出于对客户的安全负责,彻底打消用户对私钥泄露的顾 虑,确保用户对私钥的绝对控制,腾讯云提供一种无私钥的加载方案。这个方案核心是「不需要把私钥存储在腾讯云,允许用户使用自己的服务器保管私钥,完成 HTTPS 的接入」。 腾讯云完全接触不到私钥,客户甚至可以把私钥保存在自己家里的服务器上。

它的接入过程如下:

1. 用户发起 HTTPS 握手请求。
2. 在涉及到私钥计算的时候,腾讯云 CLB 会将这个私钥计算请求通过加密的自定义协议,转发给用户自己的 keyless 服务器上。
3. keyless 服务调用用户的私钥完成计算。
4. keyless 服务将计算结果返回给腾讯云 CLB。
5. CLB 继续进行 HTTPS 请求的处理。

整个过程,腾讯云接触不到 HTTPS 私钥,需要注意一点的,keyless server 是腾讯云提供一个服务端程序,代码开源,用户自主部署,服务端行为用户掌握得一清二楚。

总结来说Keyless(无密钥加载)架构可以更好的实现用户的私钥安全性,但是会对于开发者而言增加一次网络交互,一般来说100-200ms的网络延时,除非是对于安全性有非常高要求的应用,才会考虑这一方式,是用腾讯云的这一架构需要和我们的技术人员单独沟通以明确需求。

4.参考资料list

https://www.qcloud.com/document/product/228/6689

https://www.qcloud.com/community/article/207618001486449512

《List of Sites possibly affected by Cloudflare's》

《report of bugs》

《Incident report on memory leak caused by Cloudflare parser bug》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序发布后最全解析!

    笔者近期在知乎上写的一篇技术教程《无内测资格,如何用腾讯云1小时开发小程序demo》在短短2天内收获了超12万的阅读。小程序的热度可见一斑,就在我写今天这篇文章...

    贺嘉
  • 腾讯云总监手把手教你,如何成为 AI 工程师?

    虽然现在 “智能”的取得建立在大量的人工前期工作基础上,缺乏无监督学习,但是人工智能方兴未艾,如何入门成为高薪抢手的AI工程师值得学习,腾讯云总监分享了如何入行...

    贺嘉
  • Python 分析231份招聘需求,如何成为 AI 工程师?

    人工智能已经成为越来越火的一个方向,基于腾讯云上的Python爬虫,我们抓取了几家主流招聘网站的AI相关的技术岗位。用数据告诉你什么样的人可以成为AI工程师?

    贺嘉
  • 密码学是如何保护区块链的?

    本文摘自Logan Brutsche的图书《The Layman's Guide to Bitcoin》。

    懂啵
  • 区块链节点的密钥管理

            本文主要讨论一种区块链节点的密钥管理方案。区块链节点都会有各自的私钥,将一段随机数分成两段,一段存在配置文件,一段写在节点的运行代码里,通过某种...

    tylerwen
  • 利用人工智能“解锁”世界音乐

    颜萌 编译整理 量子位 出品 | 公众号 QbitAI ? 人们喜欢感受的是音乐带来的那种氛围。 整理过歌单的任何人都知道,好的歌单往往有一种贯穿始终的情感。...

    量子位
  • 零基础学区块链(一)

    最近因为项目需要,都在学习区块链,提到区块链,大家第一反应肯定是比特币,在我最刚开始学习的时候是去看的比特币的相关知识。这次先讲解大概的概念。后续再写详细的技术...

    青蛙要fly
  • 分布式系统架构理论 - CAP、BASE

    任何分布式架构设计的系统,只能同时满足 CAP 中的任意两种,无法同时三种并存。

    用户1577699
  • JavaScript设计模式--代理模式

    代理模式:为一个对象提供一个代用品或占位符,以便控制对它的访问。 代理分为:保护代理和虚拟代理 保护代理:用于控制不同权限的对象对目标对象的访问,在Java...

    奋飛
  • 机器学习算法如何调参?这里有一份神经网络学习速率设置指南

    作者:Jeremy Jordan 机器之心编译 参与:黄小天、许迪 每个机器学习的研究者都会面临调参过程的考验,而在调参过程中,学习速率(learning ra...

    机器之心

扫码关注云+社区

领取腾讯云代金券