跳到主要内容
我在 .npmrc 里加了一行 24 小时冷静期

我在 .npmrc 里加了一行 24 小时冷静期

一键三连
一键三连

· 阅读约 3 分钟

装新依赖这个动作,你一天做几回?我忙起来一天能装二十多次,装到后面手已经不过脑子了。所以我在 .npmrc 里放了这一行:

minimumReleaseAge=1440

pnpm v11 引入的,默认 1440 分钟,也就是 24 小时——发布不满一天的版本,装都装不进去。别小看这道闸,它挡的不只是多装一个包,还有装完查不清楚的账。

你知道 slopsquatting 吧?这词 2025 年才被造出来。套路是:攻击者盯着 AI 助手反复编造的包名,提前把名字抢注掉,然后坐在那儿等你上钩。USENIX 2025 那篇研究拿了 16 个模型,生成了 57.6 万段代码,结果 19.7% 被推荐的包根本不存在。一个包不存在,那你是世界上第一个装它的人。

更烦人的是,这种幻觉不是随机冒的。同一批模型跑十轮,43% 的幻觉包十轮轮轮都在,58% 出现在不止一轮,39% 从来没再现过。也就是说你栽在 A 项目上,回头换到 B 项目,它可能还在那儿等着。

我原来也靠那老三样:lockfile、漏洞扫描器、typosquat 检测。slopsquat 把这三样全绕了。lockfile 只记旧账,一个新名字根本还没出现在账本上。漏洞扫描器得等漏洞入库,可这包太新,新到漏洞号都排不上。typosquat 检测更好笑——它想抓“长得像真包”的,结果编辑距离一量,13% 是简单错拼,接近一半跟任何真实包高度不相似,它连该像谁都找不到。

这类例子不止发生在 JS 生态。最典型的是 huggingface-cli:研究员发现模型反复推荐这个包名,就注册了个空包上去,三个月被下载了一万五千多次。阿里的 GraphTranslator 项目 README 都让人这么装,可正规命令明明是 pip install -U "huggingface_hub[cli]"

在 npm 这套生态里,这类包更危险,因为安装时会跑 lifecycle script。好在工具自己补上了:pnpm 从 v10 起默认不执行依赖的安装脚本,npm v12 也默认关掉自动脚本执行——真正需要 install 脚本的 npm 包也就 2%。这条口子越缩越紧,剩下的就是那个只有名字、没有来历的包。

⚡ 所以别猜名字,卡年龄。幻觉包不管像不像真包、不管有没有进漏洞库,它一定很新,新到没人来得及验货。而 minimumReleaseAge=1440 干的事,就是逼这个新版本在门口站满一天。我用了几天才意识到,这个设置 pnpm v11 就默认开着,根本不用我配!但我还是显式写进 .npmrc——默认值最大的毛病就是会被悄悄改掉,写下来,意思是这个门槛是我们自己选的。

代价也不是没有。真急着用刚发布的新版本,要么等一天,要么临时改回 0。对我这种难得追新的人来说,这笔账怎么算都划算——一个下午的排查,换一行配置丢掉的半分钟,回本回得离谱!

你要是哪天翻到更狠的招,记得教教我。

更多「安全」的实战

评论

还没有评论,写下第一条讨论。