Cloudflare 是一家位于美国的网络安全服务商,为包括 Uber(优步),Fitbit,1password 等在内的众多公司提供网站安全管理,性能优化等服务。近日,Google 安全人员在研究中发现:某些情况下,Cloudflare 的系统可能会将服务器内存中的数据(包括 cookie,API 密钥和用户密码等)泄露到网页中——这可谓是数据泄漏的大事。由于会让人回忆起当年 OpenSSL 的 "心脏滴血" 事件,也有评论将这次事件称作 "云出血(cloudbleed)"。
这就意味着:当用户访问由 Cloudflare 提供支持的网站时,可能随机获取到他人网络会话(session)中的敏感信息——好比你在一家餐厅里刚刚就座,服务员不仅给你递上了菜单,还赠送了其他某个倒霉客人的钱包。没错,这位服务员就受雇于 Cloudflare。
这一问题是由 Google Project Zero 安全团队(该团队似乎长时间专注于漏洞发掘,我们曾前不久报道过他们公布了一个影响 Windows GDI 库的漏洞)的漏洞猎人(bughunter,也就是国内的白帽子)Tavis Ormandy 首先发现的。当时他在搞一个业余项目,无意间在 Google 搜索引擎的缓存页面中发现了包含完整的 https 请求,cookie,API 密钥和密码在内的大量数据。经过确认后他通知了 Cloudflare,后者则迅速成立了团队调查此事。
后来随着 Cloudflare 调查的深入,他们发现事情并没有那么简单——这种情况已经悄无声息地持续几个月了。
原来,在此之前 Cloudflare 曾为其边缘服务器开发一个新的 html 解析器。该解析器用 Ragel(一种有限状态机编译器)编写,后转换成 C 语言源码。这段代码存在一个缓冲区溢出漏洞,可由网页上不成对的 HTML 标签触发,本是作为指针检查机制来防止内存覆盖的。(如下)
- /* generated code. p = pointer, pe = end of buffer */
- if ( ++p == pe )
- goto _test_eof;
某些情况下,p 可能会大于 pe,从而避开长度检查,造成缓冲区数据溢出,最终引起了上文所述的信息泄露。Cloudflare 工程主管 John Graham-Cumming 在调查报告中总结道:
"这个问题的根源在于,缓冲区末端检查使用了相等运算符(==),导致指针可以跳过这一段。如果能使用 >= 而不是 ==,那么至少可以发现跳过缓冲区尾部的事件。"
另据补充,要致使数据泄露,最后的缓冲区必须以格式错误的脚本或 img 标签结尾,长度不能超过 4KB(否则 Nginx 会崩溃),并运行上述函数。
通常此类泄露的信息会隐藏在网页源码中,并不引人注意。这次 Ormandy 在 Google 缓存页面中发现了这个问题,意味着很可能在此之前一段相当长的时间里,已经有大量信息被分散泄露到各处,比如爬虫程序,甚至不法分子的手里。
这里简要回顾一下 Cloudflare 官方报告中给出的时间线:
去年 9 月 22 日,启用 Automatic HTTP Rewrites 函数
今年 1 月 30 日,Server-SideExcludes 移至新的解析器
今年 2 月 13 日,EmailObfuscation 部分移至新解析器
今年 2 月 18 日,Google 向 Cloudflare 通报了此情况
可以看出,早期的数据泄露事件可能在去年 9 月就开始了。官方认为,受到冲击最大的时间段可能在今年 2 月 13 日开始的 4 天内,因为当时 Automatic HTTP Rewrites 还没有开始广泛使用,Server-Side Excludes 也只针对恶意 IP 地址。
来源: http://www.tuicool.com/articles/uA7nEjM