⚠️ 供应链攻击:不可见 Unicode 字符
安全
供应链攻击
Unicode
恶意软件
🔴 严重警告: 攻击者使用 Unicode Private Use Areas (PUA) 字符隐藏恶意代码,对人类和静态分析工具完全不可见
🎯 攻击原理
攻击者利用 Unicode 规范中的 Private Use Areas (PUA) 范围来隐藏恶意代码:
- 0xFE00 - 0xFE0F - 变体选择符
- 0xE0100 - 0xE01EF - 变体选择符补充
这些字符:
- 对人类完全不可见
- 静态分析工具只能看到空白
- 但 JavaScript 解释器可以执行它们
🕵️ 攻击过程
1. 攻击者在代码中插入看似空白的字符串(实际包含不可见字符)
2. 运行时,解码器提取实际字节并传递给 eval()
3. 恶意负载执行,可窃取令牌、凭据和密钥
💻 解码器代码示例
const s = v => [...v].map(w => (
w = w.codePointAt(0),
w >= 0xFE00 && w <= 0xFE0F ? w - 0xFE00 :
w >= 0xE0100 && w <= 0xE01EF ? w - 0xE0100 + 16 : null
)).filter(n => n !== null);
eval(Buffer.from(s(``)).toString('utf-8'));
注释:传递给 s() 的反引号字符串在任何查看器中看起来都是空的,但实际上充满了不可见字符,一旦解码就会产生完整的恶意负载。
📊 攻击范围
151
检测到的包
GitHub
主要目标
npm
也受影响
已在以下平台发现类似包:
- GitHub
- npm
- VS Code 市场
📜 历史背景
这种 Unicode 技术最初在 2024 年被用于:
- 向 AI 引擎隐藏恶意提示 (Prompt Injection)
- 虽然文本对人类和文本扫描器不可见,但 LLM 可以读取并遵循恶意指令
- AI 引擎后来设置了防护措施,但这些防御经常被绕过
🛡️ 防御建议
- 仔细检查包及其依赖
- 仔细检查包名称,搜索拼写错误
- 如果怀疑使用了 LLM,恶意包可能看起来是合法的
- 特别警惕使用不可见字符编码恶意负载的包