InvisibleJS是一款利用不可见零宽度Unicode字符隐藏JavaScript代码的新型开源工具,其潜在恶意用途已引发安全警报。该工具由开发者oscarmine托管在GitHub上,采用隐写术技术将源代码嵌入看似空白的文件中。
工作原理
该工具将JavaScript转换为二进制字符串,其中0映射为零宽度空格(U+200B),1映射为零宽度非连接符(U+200C)。运行时,一个小型引导加载程序会解码并执行隐藏的有效载荷,使得代码在VS Code等编辑器中肉眼不可见。
针对不同环境的两个版本
代码库提供两个版本:
- 版本1(经典eval版):专为CommonJS和传统Node.js环境设计,原生支持require和module.exports
- 版本2(现代import版):面向ES模块,使用动态await import()实现顶层await和exports,但需要.mjs文件或"type": module配置
通过CLI隐藏代码非常简单:
- 版本1:
node hideV1.mjs -i input.js -o hidden.js - 版本2:
node hideV2.mjs -i input.js -o hidden.js
执行时只需运行node hidden.js,虽然文件看似空白,但能正常输出结果。
版本特性对比
| 特性 | 版本1(eval) | 版本2(import) |
|---|---|---|
| 隐形效果 | 100% | 100% |
| CommonJS支持 | 原生 | 有限 |
| ESM支持 | 无 | 完整 |
| 顶层await | 不支持 | 支持 |
| 执行方式 | 同步 | 异步 |
| 解码器长度 | 短 | 长 |
安全威胁分析
这种技术呼应了2018年以来的零宽度JS概念验证,现已被武器化用于网络钓鱼攻击。攻击者曾滥用类似的Unicode混淆技术(如使用韩文字符表示二进制)来隐藏脚本中的有效载荷,并通过反调试检查规避扫描器。
InvisibleJS可能加剧此类威胁,使攻击者能够在Node.js环境或Web应用中部署隐形恶意软件加载器,大大增加威胁检测难度。随着混淆工具的激增,安全团队必须加强支持Unicode的扫描和行为分析能力。虽然InvisibleJS目前仅作为实验性项目发布,但它凸显了编码创新在网络安全领域的双重用途特性。