剛輸一行代碼就報(bào)5次假漏洞,npm讓程序員們累覺(jué)不愛
這或許也是CVE的問(wèn)題
明敏 發(fā)自 凹非寺
量子位 報(bào)道 | 公眾號(hào) QbitAI
有這樣一個(gè)命令,它可以幫助開發(fā)人員分析復(fù)雜的代碼、查明特定漏洞。
哇,這是什么好東西,快來(lái)試試!
然而,當(dāng)你真的開始執(zhí)行這個(gè)命令時(shí),卻發(fā)現(xiàn)這事不對(duì)味了
它怎么老是報(bào)錯(cuò)???
甚至從項(xiàng)目剛開始創(chuàng)建時(shí)就報(bào)錯(cuò),一路報(bào)到你自閉。
更可怕的是,這些報(bào)錯(cuò)的漏洞還都是假漏洞。
這就是npm audit,它是npm v6中新增的一個(gè)命令。
本來(lái)想化身程序員的貼心小助手,結(jié)果因?yàn)榭偸恰皝y報(bào)錯(cuò)”卻變得飽受詬病。
最近,一位程序員小哥實(shí)在忍無(wú)可忍,發(fā)帖直指npm audit的設(shè)計(jì)存在大問(wèn)題,在網(wǎng)上引起了大家的廣泛關(guān)注和討論。
這個(gè)話題在Reddit上發(fā)布僅僅11小時(shí),熱度就飆升到459。
Hacker News上也得到了700+的關(guān)注。
網(wǎng)友們紛紛表示這些“漏洞”太荒謬了。
npm audit不能理解代碼的上下文,也不懂程序員。
有網(wǎng)友曬出自己之前的血淚史:
我之前創(chuàng)建一個(gè)項(xiàng)目,它告訴我有97個(gè)漏洞(85個(gè)中等漏洞,12個(gè)高危漏洞)……
也有人指出,這種亂報(bào)錯(cuò)的現(xiàn)象恐怕要從不合理的CVE流程上說(shuō)起…
所以,npm audit的問(wèn)題到底出在哪?
過(guò)度報(bào)錯(cuò)令人頭大
發(fā)帖吐槽的程序員小哥用一個(gè)非常生動(dòng)形象的比喻指出了問(wèn)題的關(guān)鍵。
npm audit就像是狼來(lái)了中的小孩,而開發(fā)人員就是那些被小孩戲耍的人。
理論上,使用npm audit后,它會(huì)分析代碼然后找出漏洞。
比如,你的Node.js應(yīng)用程序有一個(gè)依賴樹。
現(xiàn)在在network-utility@1.0.0中存在一個(gè)漏洞。
這個(gè)漏洞在首次被發(fā)現(xiàn)后,將會(huì)發(fā)布在一個(gè)漏洞表中,下次運(yùn)行npm audit時(shí),npm將訪問(wèn)這個(gè)表。
發(fā)現(xiàn)漏洞后,npm audit會(huì)標(biāo)出漏洞的數(shù)量和嚴(yán)重程度,然后可以執(zhí)行下一步命令進(jìn)行修復(fù)。
現(xiàn)在來(lái)執(zhí)行npm audit fix,npm就會(huì)嘗試安裝最新的network utiltiy@1.0.1來(lái)修復(fù)漏洞。
只要database-layer指定它不完全依賴network-utility@1.0.0,在一些允許范圍內(nèi)允許1.0.1, 然后就能修復(fù)成功了:
如果database-layer@1.0.0完全依賴network-utility@1.0.0;這種情況下就需要database-layer有新版本允許network-utility@1.0.1:
如果還是沒(méi)能修復(fù),還可以嘗試npm audit fix — force。
看上去,這個(gè)流程完全沒(méi)毛病啊。
但是放在實(shí)際應(yīng)用中,就完全不是這樣了!
小哥用Create React App來(lái)做了個(gè)測(cè)試。
Create React App通過(guò)獲取JavaScript源代碼,再將其轉(zhuǎn)化為靜態(tài)HTML+JS+CSS文件夾。
結(jié)果,剛輸入創(chuàng)建項(xiàng)目的代碼,就出現(xiàn)了報(bào)錯(cuò)。
而且居然有5個(gè)!其中2個(gè)還是高風(fēng)險(xiǎn)。
這是哪個(gè)程序員能承受的住的??!
事不宜遲,趕緊執(zhí)行npm audit看看哪里出了問(wèn)題。
先看第一個(gè)“漏洞”:正則表達(dá)式拒絕服務(wù) (ReDoS)。
從報(bào)錯(cuò)中可以看到,漏洞存在于browserslist上。
這是用來(lái)做什么的呢?
Create React App可以生成針對(duì)你的目標(biāo)瀏覽器優(yōu)化的CSS文件,比如,你可以用它把目標(biāo)現(xiàn)代瀏覽器放到package.json中:
由于多個(gè)工具依賴于目標(biāo)瀏覽器的相同配置格式,因此Create React App使用共享browserslist包來(lái)解析配置文件。
所以這里的漏洞是什么?
正則表達(dá)式拒絕服務(wù)是指browserslist 中有一個(gè)正則表達(dá)式,這意味著如果有人惡意輸入,那當(dāng)字符串傳遞給browserslist 時(shí),運(yùn)行速度將會(huì)指數(shù)級(jí)降低。
這聽起來(lái)真的非常糟糕,是個(gè)大漏洞。
但問(wèn)題是,如果都有人能訪問(wèn)你的電腦并更改配置文件了,那你要面臨的情況恐怕比這要糟糕上百倍?。?/p>
所以這個(gè)所謂的“中等級(jí)別漏洞”,真的既不是中等,也不是漏洞。
再來(lái)看看第二個(gè)“漏洞”。
這一次要看看webpack-dev-server>chokidar>glob-parent依賴鏈。
在這條依賴鏈上,webpack-dev-server是一個(gè)僅用于開發(fā)的服務(wù)器,它可以在本地快速為應(yīng)用程序提供服務(wù)。
chokidar被用來(lái)監(jiān)視文件的更改。
glob-parent可以從文件系統(tǒng)監(jiān)視模式中提取一部分文件系統(tǒng)路徑。
這個(gè)報(bào)錯(cuò)顯示,glob-parent上存在漏洞。如果一個(gè)攻擊者提供了一個(gè)特制的文件路徑,這會(huì)讓運(yùn)行變得非常非常慢……
橋豆麻袋!這不合理啊。
如果有人可以在你本地開發(fā)時(shí)入侵你的電腦,那么他最不會(huì)做的就是通過(guò)長(zhǎng)文件路徑來(lái)減慢你的開發(fā)速度了,他更想要的是竊取電腦中的信息啊!
所以,第二個(gè)“漏洞”也很荒謬。
第三個(gè)“漏洞”和第二個(gè)一樣,只是換了個(gè)路徑,同樣不合理。
第四個(gè)“漏洞”可是高危型的啊,讓我們來(lái)看看問(wèn)題出在哪。
報(bào)錯(cuò)顯示,css-what存在漏洞。
如果有人控制了你的電腦或者源代碼,他就可以放置特殊的SVG文件,其中包含一個(gè)特殊的CSS選擇器,這會(huì)讓你的開發(fā)過(guò)程變得非常慢。
emmm……我實(shí)在不理解黑客在什么情況下會(huì)這么做。
除非可以使用SVG挖礦。
好吧,第四個(gè)“漏洞”依舊是沒(méi)意義的。
最后一個(gè)“漏洞”也是如上這種情況,換湯不換藥。
是CVE不夠合理
如果這是發(fā)生在真實(shí)的開發(fā)過(guò)程中,看完npm audit這一通報(bào)錯(cuò),很難有人血壓不飆升……
但這還僅僅只是小哥舉的一個(gè)栗子。
類似的假漏洞,實(shí)際上多達(dá)數(shù)百個(gè)。
它們這樣搗亂,不僅浪費(fèi)開發(fā)人員的時(shí)間和精力,甚至?xí)?dǎo)致一個(gè)項(xiàng)目的失敗。
而且這對(duì)維護(hù)人員和初學(xué)者也非常不友好。
有人就表示,這是因?yàn)楹芏嗳硕荚谔峤徽齽t表達(dá)式拒絕服務(wù)的漏洞報(bào)告。
這么多人在大量不同的項(xiàng)目中報(bào)告,無(wú)論如何這都很煩人,因?yàn)樗麄兤茐牧薾pm audit的機(jī)制。
修復(fù)所有可能的漏洞是好事,但是他們夸大了漏洞的嚴(yán)重程度。
有網(wǎng)友則認(rèn)為:
這不是npm audit設(shè)計(jì)的問(wèn)題,而是漏洞報(bào)告的問(wèn)題。
有人補(bǔ)充,因?yàn)榛颐焙诳拖胍@得更多的獎(jiǎng)勵(lì),所以很多影響小甚至沒(méi)影響的CVE報(bào)告激增。
激勵(lì)機(jī)制導(dǎo)致現(xiàn)在一團(tuán)糟。
甚至連SQLite的開發(fā)人員也曾在官網(wǎng)“吐槽”過(guò)CVE:
在大多情況下,這些錯(cuò)誤并不是真正的漏洞,因?yàn)樗旧聿⒉粫?huì)導(dǎo)致數(shù)據(jù)的丟失或危害。
對(duì)此,發(fā)帖小哥也提出了一些自己的建議和看法,希望能夠讓npm audit有所改進(jìn):
- 在發(fā)布期間內(nèi)聯(lián)所有依賴項(xiàng)。例如Vite和Next.js都只是將它們的依賴項(xiàng)直接捆綁在包里,而不是依賴于npm的node_modules機(jī)制。從維護(hù)人員的角度來(lái)看,這樣的啟動(dòng)時(shí)間更快、下載量更小,并且還不會(huì)有來(lái)自用戶的假漏洞報(bào)告。不過(guò)內(nèi)聯(lián)機(jī)制可能有些違背npm的初衷。
- 提供一些反訴漏洞報(bào)告的途徑。有人就提議可以手動(dòng)下架一些假漏洞報(bào)告,或者對(duì)一些假漏洞進(jìn)行標(biāo)記,提醒其他用戶。
參考鏈接:
[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
- 4o-mini華人領(lǐng)隊(duì)也離職了,這次不怪小扎2025-08-19
- 宇樹機(jī)器人“撞人逃逸”火到國(guó)外,王興興回應(yīng):下次不遙控了2025-08-16
- 突破Claude-4編程上限!自進(jìn)化Agent框架拿下新SOTA,已開源2025-08-19
- 讓OpenAI只領(lǐng)先5天,百川發(fā)布推理新模型,掀翻醫(yī)療垂域開源天花板2025-08-11