前言
jQuery源码中有赌博网站?
起因是公司发的一份自查文件,某银行在日常安全运营过程中发现在部分jQuery源码中存在赌博和黄色网站链接。
链接分为好几个:
- www.cactussoft.cn
- blindsignals.com
- www.planeart.cn/?p=877
如果你的代码中使用了jQuery或者间接使用了jQuery,请最好自查一下。
不要以为只有从网上随便抄来的jQuery源码才会存在这个问题,正常的jQuery源码也可能有,比如阿里的CDN上的jQuery源码中就有。
自查jQuery发现存在问题,追溯至阿里的CDN
在如今React和Vue,Angular占据前端主流的情况下,仍有大量的网站使用jQuery。
不过因为我现在做的项目比较新,并且使用React,所以以为这份自查文件跟我完全没关系。
只是因为以前见识过有人在开源js代码中埋挖矿的代码,所以谨慎起见还是查了查,没想到我还真的查出了点东西。
自查步骤:
- 第一步,我在代码中全局搜索上面三个网址,没发现问题,果然符合预期。
- 第二步,为了保险起见,我搜了node_modules里的文件,还是没有发现问题,符合预期。
- 第三步,全局搜索jQuery这个字符串,因为据自查文件描述这个问题主要存在于jQuery中。项目中除了single-spa源码对jQuery做了兼容处理,其他代码一切正常,没有引用jQuery的地方。
只是有个地方有点奇怪,我在一个奇怪的demo.html中,发现了下面这行引用:
上面标注了一个jQuery,下面是一个阿里的CDN的地址。
那么这个引用里面是个jQuery?查一查吧。
打开这个js,搜索三个网址,最后真的找到了一个,代码如下:
// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
type = type || "fx";
return this.queue( type, function( next, hooks ) {
var timeout = setTimeout( next, time );
hooks.stop = function() {
clearTimeout( timeout );
};
});
},
麻了,是个注释,但是这个网站真的存在,还是个中文站点呢。
这个网站虽然不是赌博网站,但是怎么看都不是那么正经,并且和jQuery完全没关系。
然后我又查了一下这个demo.html的来源,来自阿里的矢量图标库网站:https://www.iconfont.cn/,做前端的对这个站点应该非常熟悉。
然后这个demo.html就是下载个人项目的图标库后的演示用例。
正常情况下应该是用不到这个东西的,所以直接删掉就好了,不过阿里有没有别的地方用到这个CDN文件就不好说了。
思考
这次我们在阿里CDN上的jQuery库中都能发现赌博网站的链接。
虽然它是个注释,但是万一它不是呢?
毕竟这三个网址中可能就这个温和点,另外两个据描述直接重定向到黄色网站和赌博网站。
这个温和点的其实也没有那么温和,当这个jQuery文件被一些信誉度较高的站点,比如政府站点引用后,即使是注释里的网址可能也会被一些搜索引擎解析后用于提高这个垃圾网站的信誉度。
这个事情其实只是冰山一角而已,采用的方式虽然隐蔽但也总算有迹可循,之前爆出的js挖矿代码,更加隐蔽。
不谈这种引用外链的方式,对现在的前端而言,node_modules更是一个大黑盒。
主流的React这类库可能安全性还行,毕竟一天到晚读源码背八股文面试的朋友那么多,所以没什么问题。
像很多依赖库都是一两个人维护,就算他们不使坏,依赖库的依赖库呢?
这么庞大的依赖库链,实际上隐藏着的是巨大的安全隐患。
像上面提到的这个网站,你看链接里有个2009,可见这玩意并不年轻,一直默默地在每个jQuery网站中运行,并没有被人发现。
那么更多的这种代码是不是已经存在于各种各样的网站中了呢?
无脑复制粘贴的前端那么多,他们甚至都不愿意读一下自己复制的代码,更何况审查依赖库?
如果今天阿里这个CDN里面埋的是个挖矿代码,那么我们的讨论风格还会这么轻松有趣吗?
想了想,答案是:更加有趣了。O(∩_∩)O