CVE-2011-4691
Google Chrome IFRAME装载信息泄露漏洞
漏洞基本描述
URL:http://sebug.net/vuldb/ssvid-26080
发布时间:2011-12-14
漏洞版本:Google Chrome <= 15.0.874.121
漏洞描述:
Bugtraq ID: 51068
CVE ID:CVE-2011-4691
Google Chrome是一款流行的WEB浏览器。
Google Chrome 15.0.874.121及其之前的版本中存在漏洞,在IFRAME加载尝试过程中,没有正确防止在违反同源策略所需的时间里采集数据,远程攻击者构建包含恶意JavaScript代码的WEB页,诱使用户解析,可判断目标用户浏览器缓存中的文件。
<* 参考
http://lcamtuf.coredump.cx/cachetime/
http://sip.cs.princeton.edu/pub/webtiming.pdf
*>
测试方法:
http://lcamtuf.coredump.cx/cachetime/
总结
本漏洞是一个危害性不大的隐私泄漏漏洞。可能被别有用心的黑客用来统计用户的站点访问记录。根据我的理解这个漏洞也不是新爆发的,而是根据iframe的一些工作特性来进行触发,与浏览器的缓存机制有关系,这个漏洞IE也是有的。
由于触发这个漏洞没有涉及很深的技术上的原因(IE有同样的问题,可以见后面的分析),因此该漏洞的修补可能需要浏览器厂商在缓存上进行策略性的修改。
可以参考文档:http://sip.cs.princeton.edu/pub/webtiming.pdf
漏洞基本表现
正确触发漏洞后,可以用于搜集用户机器上是否访问过某些站点,用于数据统计,暂未发现是否能获取更多的用户信息。
譬如在测试机上运行漏洞触发脚本后,有如下提示:
绿色表示访问过某某站点,灰色的表示没有访问(其实我只访问过Google Plus,其他三个可能是GooglePlus访问过或者引导的一些广告页面)。
漏洞原理分析
注:原理主要基于对js脚本的分析。
1、首先在页面上面创建了一个空白的iframe,把src设置为about:blank,<iframe id=f name=f height=20 width=200 style="opacity: 0.1" src="about:blank"></iframe>。
2、在js脚本里面建有一个大表,里面是枚举的需要检查的站点信息。类似:
3、然后就是遍历这个表,对每个站点执行检测逻辑。
4、js代码里面给上面创建的iframe设置一个大表中的URL,然后迅速去获取iframe的属性location.href,这里看代码可能更清楚:
function navigate_to_target()
{
cycles = 0;
setTimeout(wait_for_noread, 1);
urls++;
document.getElementById("f").src = current_url;
}
function wait_for_noread()
{
try {
if (frames['f'].location.href == undefined) throw 1;
if (cycles++ >= TIME_LIMIT) {/*重试3次*/
maybe_test_next();
return;
}
setTimeout(wait_for_noread, 1);
} catch (e) {
confirmed_visited = true; /*这里置用户以前访问过标志*/
maybe_test_next();
}
}
注:注释由magictong添加。
设置1ms后执行wait_for_noread之后(setTimeout(wait_for_noread, 1);),然后把iframe的URL设置为当前正在检测的URL,1ms后,执行if (frames['f'].location.href == undefined) throw 1的时候,如果用户已经有了缓存,frames['f'].location.href的值应该会比较快的获取,然后直接抛一个异常,认为用户访问过这个站点(这里有个问题是如果iframe里的网页和当前页面的url域名不一样时,这个值为出现未定义的状态),实际上代码这个地方有一个3次的递归重试,三次之后如果location.href的值还没有获取到则认为用户没有访问过测试站点。
代码的写作者应该是判断过这个时间差,执行3次的时间大约是50ms,因此这个地方的判断不一定是绝对正确的。