我如何在 npm install 运行前检测 typosquatting 攻击

发布: (2026年1月13日 GMT+8 07:09)
3 min read
原文: Dev.to

Source: Dev.to

介绍

上周我发布了 Sapo,一个预安装安全扫描器。今天我将展示它是如何检测最常见的攻击之一:typosquatting(拼写抢注)

什么是 typosquatting?

攻击者注册与流行包名相似的包,例如:

  • lodahs 替代 lodash
  • axois 替代 axios
  • reacct 替代 react
  • expresss 替代 express

这些假包通常依赖真实的包(所以看起来一切正常),并加入窃取凭证的恶意代码。

检测逻辑

1. 相似度检查

Sapo 使用 Levenshtein 距离计算请求的包名与已知流行包的“接近程度”:

fn levenshtein_distance(a: &str, b: &str) -> usize {
    // Returns the number of single‑character edits needed
    // to transform string a into string b
}

如果距离在 1–2 个字符之间,则认为该名称可疑。

2. 常见拼写错误模式

Sapo 会寻找人们实际会犯的错误模式:

  • 字母颠倒axoisaxios
  • 缺少字母expresexpress
  • 重复字母expresssexpress
  • 相邻键盘按键reacyreact

3. 热度对比

关键洞察在于下载量比例不匹配:

  • 目标包:47 次下载
  • 相似的流行包:4000 万+ 次下载
  • 最近的创建日期

这种差距强烈表明该包是恶意的。

示例运行

$ npm install lodahs
[>] Scanning: lodahs@1.0.0
[!] BLOCKED: Typosquatting detected

    Similar to: lodash
    - lodash: 337,000,000 downloads
    - lodahs: 47 downloads
    - Levenshtein distance: 1

Installation cancelled.

真实的 lodash 有 3.37 亿次下载,而假冒的 lodahs 只有 47 次——这是一个巨大的红旗。

Sapo 工作原理

Sapo 在 npm 开始下载之前 拦截 命令:

You type: npm install lodahs

Sapo intercepts

API check: is "lodahs" safe?

Response: TYPOSQUATTING DETECTED

Installation blocked

npm never runs

你的机器保持干净。

安装

curl -fsSL https://sapo.salta.world/install.sh | bash

重新打开终端后,尝试:

npm install lodahs

你将在任何东西被安装之前看到警告。

未来工作

  • 基于机器学习的异常检测
  • 沙箱分析
  • VS Code 插件

如果你对接下来要检测的内容有想法,请在评论中告诉我!

链接

Back to Blog

相关文章

阅读更多 »

依赖过山车:驾驭 NPM 主题公园

“啊哈!”的瞬间,一切由此开始 我在实现一个新功能,感觉自己像个代码巫师 🧙‍♂️。我提交了 PR,随后我的 TL 留下了一条评论……