⚠️ 供应链攻击:不可见 Unicode 字符

安全 供应链攻击 Unicode 恶意软件 ⭐⭐⭐⭐⭐ 5星
🔴 严重警告: 攻击者使用 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,恶意包可能看起来是合法的
  • 特别警惕使用不可见字符编码恶意负载的包