js病毒代码
凌晨三点,病毒我盯着控制台里疯狂刷新的代码报错日志,后背发凉。病毒那段只有12行的代码JavaScript代码,正把公司服务器上的病毒用户数据一点点传向某个境外IP。它藏在一个被精心混淆的代码setInterval回调里,看起来就像普通的病毒埋点统计。
写这段代码的代码人很聪明。他没有用document.write或者alert这种容易被发现的病毒粗暴手段,而是代码利用onerror事件捕获页面里所有未被处理的异常,在错误信息里拼接数据,病毒再伪装成图片请求发送出去。代码整个过程悄无声息,病毒连浏览器的代码网络面板都只显示一张200×200的透明gif。
真正的病毒JS病毒从来不弹窗,不锁屏,不删文件。它们只做一件事:在你觉得一切正常的时候,把属于你的东西搬走。
我见过最狠的一次攻击,是通过prototype污染实现的。攻击者往Object.prototype上挂了一个__defineGetter__,让页面里每一次对象属性读取都触发一段恶意逻辑。那代码写得像诗,短小精悍,却能让整个单页应用在用户毫无察觉的情况下,把表单输入、token、甚至剪贴板内容全部打包发送。等开发人员发现时,数据已经泄露了整整两周。
更让人头疼的是供应链攻击。有个npm包叫event-stream,被黑客植入后门代码后,下载量依然居高不下。因为大多数前端工程师根本不会去读node_modules里的源码,他们只关心npm install能不能跑通。那些恶意代码就藏在某个不起眼的依赖函数里,等到特定条件触发才激活,平时安静得像不存在。
你说这算不算病毒?从技术定义上,它没有自我复制的能力,也不感染其他文件。但从实际危害看,它比传统病毒可怕得多——因为它寄生在信任链上,借着你引以为傲的现代工程化体系,悄无声息地完成渗透。
我有个朋友在电商公司做前端,有天发现线上订单数据异常,排查了一整夜。最后定位到一个第三方埋点SDK,里面有个setTimeout延迟执行了eval调用,动态加载了一段混淆代码。那段代码读取了用户的收货地址和手机号,每十分钟往外传一次。SDK是老板让接的,说能提升转化率,没人会去质疑官方文档里没写到的那些参数。
写JS病毒的人最懂人性。他们知道开发者懒,懒得读依赖源码;知道用户盲,盲到授权弹窗永远点“允许”;知道企业急,急着上线新功能,没空做完整的安全审计。所以这些代码总能找到缝隙钻进去,在某个不起眼的角落安家。
最讽刺的是,很多所谓的“JS病毒”根本不需要多高深的技术。一个document.cookie的读取,一个fetch到第三方域名的请求,一段藏在console.log里的十六进制字符串——就足以构成完整的攻击链。工具本身没有善恶,但用的人有。
现在每当我看到那些“一行代码搞定XX”的帖子,都会多留个心眼。不是因为怕,而是因为知道,真正的危险往往藏在最不起眼的细节里。就像那段12行的代码,看起来只是统计用户点击的热力图,实际上却把整个用户画像卖给了黑产。
JS病毒不咬人,它吸血。而且吸得很有礼貌,连句“谢谢”都不说。
