明敏 发自 凹非寺
量子位 报道 | 公众号 QbitAI

有这样一个命令,它可以帮助开发人员分析复杂的代码、查明特定漏洞。

哇,这是什么好东西,快来试试!

然而,当你真的开始执行这个命令时,却发现这事不对味了

它怎么老是报错啊?

甚至从项目刚开始创建时就报错,一路报到你自闭。

更可怕的是,这些报错的漏洞还都是假漏洞

这就是npm audit,它是npm v6中新增的一个命令。

本来想化身程序员的贴心小助手,结果因为总是“乱报错”却变得饱受诟病。

最近,一位程序员小哥实在忍无可忍,发帖直指npm audit的设计存在大问题,在网上引起了大家的广泛关注和讨论。

这个话题在Reddit上发布仅仅11小时,热度就飙升到459。

Hacker News上也得到了700+的关注。

网友们纷纷表示这些“漏洞”太荒谬了。

npm audit不能理解代码的上下文,也不懂程序员。

有网友晒出自己之前的血泪史:

我之前创建一个项目,它告诉我有97个漏洞(85个中等漏洞,12个高危漏洞)……

也有人指出,这种乱报错的现象恐怕要从不合理的CVE流程上说起…

所以,npm audit的问题到底出在哪?

过度报错令人头大

发帖吐槽的程序员小哥用一个非常生动形象的比喻指出了问题的关键。

npm audit就像是狼来了中的小孩,而开发人员就是那些被小孩戏耍的人。

理论上,使用npm audit后,它会分析代码然后找出漏洞。

比如,你的Node.js应用程序有一个依赖树。

现在在network-utility@1.0.0中存在一个漏洞。

这个漏洞在首次被发现后,将会发布在一个漏洞表中,下次运行npm audit时,npm将访问这个表。

发现漏洞后,npm audit会标出漏洞的数量和严重程度,然后可以执行下一步命令进行修复。

现在来执行npm audit fix,npm就会尝试安装最新的network utiltiy@1.0.1来修复漏洞。

只要database-layer指定它不完全依赖network-utility@1.0.0,在一些允许范围内允许1.0.1, 然后就能修复成功了:

如果database-layer@1.0.0完全依赖network-utility@1.0.0;这种情况下就需要database-layer有新版本允许network-utility@1.0.1:

如果还是没能修复,还可以尝试npm audit fix — force。

看上去,这个流程完全没毛病啊。

但是放在实际应用中,就完全不是这样了!

小哥用Create React App来做了个测试。

Create React App通过获取JavaScript源代码,再将其转化为静态HTML+JS+CSS文件夹。

结果,刚输入创建项目的代码,就出现了报错。

而且居然有5个!其中2个还是高风险。

这是哪个程序员能承受的住的啊!

事不宜迟,赶紧执行npm audit看看哪里出了问题。

先看第一个“漏洞”:正则表达式拒绝服务 (ReDoS)。

从报错中可以看到,漏洞存在于browserslist上。

这是用来做什么的呢?

Create React App可以生成针对你的目标浏览器优化的CSS文件,比如,你可以用它把目标现代浏览器放到package.json中:

由于多个工具依赖于目标浏览器的相同配置格式,因此Create React App使用共享browserslist包来解析配置文件。

所以这里的漏洞是什么?

正则表达式拒绝服务是指browserslist 中有一个正则表达式,这意味着如果有人恶意输入,那当字符串传递给browserslist 时,运行速度将会指数级降低。

这听起来真的非常糟糕,是个大漏洞。

但问题是,如果都有人能访问你的电脑并更改配置文件了,那你要面临的情况恐怕比这要糟糕上百倍啊!

所以这个所谓的“中等级别漏洞”,真的既不是中等,也不是漏洞。

再来看看第二个“漏洞”。

这一次要看看webpack-dev-server>chokidar>glob-parent依赖链。

在这条依赖链上,webpack-dev-server是一个仅用于开发的服务器,它可以在本地快速为应用程序提供服务。

chokidar被用来监视文件的更改。

glob-parent可以从文件系统监视模式中提取一部分文件系统路径。

这个报错显示,glob-parent上存在漏洞。如果一个攻击者提供了一个特制的文件路径,这会让运行变得非常非常慢……

桥豆麻袋!这不合理啊。

如果有人可以在你本地开发时入侵你的电脑,那么他最不会做的就是通过长文件路径来减慢你的开发速度了,他更想要的是窃取电脑中的信息啊!

所以,第二个“漏洞”也很荒谬。

第三个“漏洞”和第二个一样,只是换了个路径,同样不合理。

第四个“漏洞”可是高危型的啊,让我们来看看问题出在哪。

报错显示,css-what存在漏洞。

如果有人控制了你的电脑或者源代码,他就可以放置特殊的SVG文件,其中包含一个特殊的CSS选择器,这会让你的开发过程变得非常慢。

emmm……我实在不理解黑客在什么情况下会这么做。

除非可以使用SVG挖矿。

好吧,第四个“漏洞”依旧是没意义的。

最后一个“漏洞”也是如上这种情况,换汤不换药。

是CVE不够合理

如果这是发生在真实的开发过程中,看完npm audit这一通报错,很难有人血压不飙升……

但这还仅仅只是小哥举的一个栗子。

类似的假漏洞,实际上多达数百个。

它们这样捣乱,不仅浪费开发人员的时间和精力,甚至会导致一个项目的失败。

而且这对维护人员和初学者也非常不友好。

有人就表示,这是因为很多人都在提交正则表达式拒绝服务的漏洞报告。

这么多人在大量不同的项目中报告,无论如何这都很烦人,因为他们破坏了npm audit的机制。

修复所有可能的漏洞是好事,但是他们夸大了漏洞的严重程度。

有网友则认为:

这不是npm audit设计的问题,而是漏洞报告的问题。

有人补充,因为灰帽黑客想要获得更多的奖励,所以很多影响小甚至没影响的CVE报告激增。

激励机制导致现在一团糟。

甚至连SQLite的开发人员也曾在官网“吐槽”过CVE:

在大多情况下,这些错误并不是真正的漏洞,因为它本身并不会导致数据的丢失或危害。

对此,发帖小哥也提出了一些自己的建议和看法,希望能够让npm audit有所改进:

  • 在发布期间内联所有依赖项。例如Vite和Next.js都只是将它们的依赖项直接捆绑在包里,而不是依赖于npm的node_modules机制。从维护人员的角度来看,这样的启动时间更快、下载量更小,并且还不会有来自用户的假漏洞报告。不过内联机制可能有些违背npm的初衷。

  • 提供一些反诉漏洞报告的途径。有人就提议可以手动下架一些假漏洞报告,或者对一些假漏洞进行标记,提醒其他用户。

参考链接:
[1]https://overreacted.io/npm-audit-broken-by-design/
[2]https://news.ycombinator.com/item?id=27761334
[3]https://www.reddit.com/r/programming/comments/ofk77t/npm_audit_broken_by_design/
[4]https://www.sqlite.org/cves.html

刚输一行代码就报5次假漏洞,npm让程序员们累觉不爱相关推荐

  1. ChatGPT、低代码等技术出现会不会导致底层程序员失业

    目录 1. ChatGPT会不会导致底层程序员失业 2. 低代码会不会导致底层程序员失业 3. 总结 1. ChatGPT会不会导致底层程序员失业 今天在浏览知乎时,看到一个问题,问题如下图: 同时, ...

  2. 写代码后你胖了几斤?(程序员健身的独特方式)

    原文链接 你觉得噼里啪啦敲键盘写代码时的你,是 屠龙的勇士.登塔的先锋! 然而屏幕前这个形容憔悴的你,更像刚 从80年代僵尸片的片场领了盒饭回来 . 你在幻想中严词拒绝了产品经理瞎改需求的要求,并把他 ...

  3. 代码应用jFinal+AngularJs未来javaEE开发的趋势——程序员的福音

    JFinal概述 JFinal 是基于Java 语言的极速 web 开辟框架,其核心设计目标是开辟敏捷.代码量少.学习简略.功能强大.轻量级.易扩展.Restful.在拥有Java语言全体优势的同时再 ...

  4. JAVA代码行数统计工具(是时候看看程序员真实的的代码量了)

    Author:天添豆浆 计算机科学与技术专业,迷摇滚的理科男 新手村码农,第二篇博客,康康有啥新的有趣玩意儿. 总所周知,代码就是程序员的刀程序员的剑,也是程序员的履历的映射. 有想过自己的代码量有多 ...

  5. 只会敲代码已经不行了,什么样的人才适合做程序员,程序员工作又是怎样的呢?

    相信有很多刚入门编程的小伙伴都在好奇一个问题,自己是否适合成为一名程序员呢,程序员工作又是怎样的呢,有没有前景呢?而技术交流群里甚至有小伙伴感叹,现在程序员只会敲代码已经不行了,竞争压力越来越大,埋头 ...

  6. c语言求婚代码大全,这是我见过最浪漫的程序员求婚方式

    [导读]在七夕这个节日里,源代码教育不仅会举办各种活动,我们还会给大家及时送上各种福(gou)利 (liang) (下面这个福利是外国味儿的). 为了向心中的女神求婚,每个男生都会挖空心思地想出一些非 ...

  7. 【辟谣】代码规范固然重要,但是不要再黑程序员了...

    昨晚第一次看到一侧关于程序猿代码没有规范而被枪杀的文章,开始有朋友在群里吐槽几个平时代码比较"诗意"的同事,大家也就一笑而过了. 但是,今天朋友圈突然爆发一阵转载热潮,并且还在持续 ...

  8. c语言代码表白_用微信表情翻译表白,程序员的小浪漫,赶紧Get起来

    "也许你不会发现,但我提及了,你肯定知道!" 微信作为一个社交的APP,被很多人使用,已经是人们离不开的软件. 它里面的很多功能在都在日常生活给了我们很多帮助,如手机话费支付,水电 ...

  9. 表白代码c语言_这段代码怎么啦?居然瞬间引起了所有程序员网友的注意!

    不知从何时开始,被黑了十几年的「理工男」得到了释放,人们开始把视线聚焦在了一个群体上,那就是「程序员」!比如,热播的电视大剧<欢乐颂2>里,「直男处女情结」引起了整个互联网热议,众网友纷纷 ...

最新文章

  1. 分分钟get「隔空传手」技能,网友:我想试试别的东西…
  2. Bootstrap入门(二十一)组件15:警告框
  3. boost::hana::make_set用法的测试程序
  4. How is error message Could not create note displayed from backend to ui
  5. 信工干货||C语言输入输出语句
  6. Linux查看进程并重启服务命令
  7. maven配置项目根路径_Maven基本概念——根目录、项目创建、坐标
  8. 数据缺失,如何智能修复?第一名方案源码分享
  9. android 修改APK
  10. Atitit 输入法原理与概论ati use
  11. 简述结构化程序设计、面向对象程序设计的概念及其区别
  12. List转JSON格式方法
  13. ppt课堂教学流程图_ppt怎么做流程图 ppt做流程图的方法是什么
  14. 计算机换位加密,基于位平面变换的数字图像加密算法
  15. 防火墙基础:ISA Server 防火墙客户端和Forefront TMG 客户端介绍
  16. 输出1-1000内 所有 7 的倍数或个位是7的整数。
  17. 怎么彻底禁用Cortana小娜?
  18. 基于SSM的校园医务室系统
  19. 使用Spring Security Oauth2 和 JWT保护微服务--资源服务器的编写
  20. 专题·网络流【资源集合

热门文章

  1. 滚动时背景ListView变为黑色
  2. 如何使用pip升级所有Python软件包?
  3. js数组中forEach/some/every/map/filter/reduce的区别
  4. Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型...
  5. JavaScript 简史
  6. [PYTHON] xml.etree.ElementTree 实例
  7. shell编程 字符串处理
  8. 用户控件的定制和使用
  9. php 提交成功后跳转,PHP提交后跳转的简单示例
  10. prd模板案例_第三课:产品需求文档——案例分析