随着客户端Web应用的日益增多,越来越多的逻辑已经开始从服务器端转移至客户端,这些逻辑通常都是使用JavaScript语言所编写。但遗憾的是,目前开发人员普遍不太关注JavaScript代码的安全性。
在本文中,我们就对客户端所使用的JavaScript库进行了全面的研究,并详细说明由JavaScript库漏洞而产生的Web安全隐患。
于是我们使用Bower和Wappalyzer的热门统计数据,手动构建了72个最流行的开源库的所有发行版本的漏洞资料库。之所以这样采取样本,就是为了能够比较各类网站的JavaScript的使用情况。
然后对Alexa排行榜上的前7.5万个网站以及随机选取的另外7.5万个.com网站进行扫描,以检查这15万个网站是否安装了这72个有漏洞的JavaScript库。结果发现有37%的网站至少包括一个具有已知漏洞的JavaScript库,并且有的漏洞的补丁已经好几年没有修复了;有10%的网站使用了2个以上含有漏洞的JavaScript库。而在Alexa排行榜上的前7.5万个网站所使用的JavaScript库,有87.3%的YUI3、86.6%的Handlebars、40.1%的Angular、36.7%的jQuery,以及33.7%的jQ-UI都使用的是有漏洞的版本。
其实根据我们的估计,37%这个比例可能还是被低估了,因为我们只选择了72个JavaScript库。
由于开发人员经常重新格式化,重组或附加代码,使我们其难以检测到JavaScript库在野外使用的情况,所以我们使用静态和动态分析技术来进行分析,以便在实现Web应用中的跟踪。
通过这种特定的分析,我们发现了JavaScript库所存在的普遍性问题。下面以一些使用jQuery框架的JavaScript 库为例 。
第一种情况,在ALEXA的排行榜上大约有20.7%的网站使用包括jQuery(17.2%在COM)在内的多个框架,比如Prototype,MooTools。而在.com网站中这个比例是17.2%。
第二种情况,在ALEXA的排行榜上大约有5.7%的网站,在同一个JavaScript库中使用多个版本的jQuery框架的相同文档。
第三种情况,在ALEXA的排行榜上大约有4.2%的网站,会在同一JavaScript库中多次使用同一个版本的jQuery框架的相同文档,而在.com网站中这个比例是5.1%。
jQuery依然是迄今为止最流行的库, ALEXA排行榜上84.5%的网站都用到了jQuery。另外尽管SWFObject在2013年已经被停用,但ALEXA排行榜上仍然在10.7%的网站在使用SWFObject(Adobe Flash)。
当从外部加载时,脚本大多从CDN加载:
总的来说,在内部托管和CDN提供的脚本库之间似乎有一个很好的分隔:
虽然目前各个JavaScript库已经更新过很多次了,但不知为什么仍有不少网站继续使用含有漏洞的JavaScript库。
JavaScript库的漏洞分布
虽然在ALEXA排行榜排名较高的网站往往不太可能加载有漏洞的JavaScript库,但则不意味着它们所加载的JavaScript库就一定没有漏洞,很可能只是它们没有发现而已。然后顺着ALEXA排行榜往后,排名越低,漏洞越多,如下图所示。
37.4%的COM网站至少使用一个易受攻击的JavaScript库。其中,金融和*网站所使用的漏洞是最多的,52%地金融和50%的*网站都在使用有漏洞的JavaScript库。
另一个有趣的分析就是大多数网站使用的这些有漏洞的JavaScript库都是很久以前发布的版本了,这表明开发人员很少更新他们网站的JavaScript库。但是根据我们的分析,其中有61.7%的ALEXA排行榜上的网站所使用的JavaScript库至少有一个补丁版本。
我们猜想可能问题出在了漏洞分散性这个问题上,在我们手动构建那72个最流行的开源库的漏洞资料库时,我们发现,没有JavaScript库漏洞的集中数据库,于是我们只能手动来编译来自开源漏洞数据库(OSVDB),国家漏洞数据库(NVD),公开漏洞跟踪,GitHub评论,博客文章和Retire.js检测到的相关漏洞信息。总的来说,我们经过努力,在我们的漏洞资料库中获得11个JavaScript库的漏洞详细信息。
所以对于网站开发人员而言,他们必須先知道网站使用了哪些JavaScript库,才能进行更有针对性的维护。
为了解决这个问题,我们进行了因果树漏洞分析。
因果树漏洞分析
为了弄清楚到底是哪个JavaScript库被加载,我们开发了一个chrome的因果树扩展,因为在漏洞调查时运用因果树时, 能列出程序的主要步骤, 并叙述出与这些步骤相关联的要点,树中的节点是特定时间点DOM中元素的快照,表示加载JavaScript库之间的关系。例如:
和
ALEXA中的中间因果树包含133个节点,中值深度为4个包含。此外,我们还发现,绝大多数的JavaScript库都未建立专用的安全通知的邮件列表(Mailing List),也多缺乏详细的漏洞报告,还有就是快速更新的JavaScript库也让开发人员疲于更新。
因此我们总结造成客户端Web应用有如此多的JavaScript漏洞,最根本原因就是JavaScript的生态系统太复杂。没有可靠的漏洞数据库,没有由库供应商维护的安全邮件列表,发行说明中也很少或没有关于安全问题的细节,这样我们通常就很难确定哪些JavaScript库受到了哪些漏洞的影响。