最近,npm注冊(cè)庫(kù)經(jīng)歷了一次運(yùn)維的意外事件,導(dǎo)致一些被高度依賴的包變得不可用,比如require-from-string。盡管這個(gè)意外事件非常易于修復(fù),但是它暴露了一個(gè)較為嚴(yán)重的安全漏洞,借助該漏洞能夠嘗試將惡意代碼注入到使用npm的項(xiàng)目中。
按照官方報(bào)告的說(shuō)法,這次意外事件的根本原因在于錯(cuò)誤地將名為“floatdrop”的用戶移除,并使他們的包無(wú)法查找和下載。之所以做出這樣的決策是因?yàn)榘l(fā)布了一個(gè)包含垃圾軟件的包,該包中還包含了floatdrop的合法包timed-out的README。因?yàn)槠ヅ淞薘EADME,所以npm的反垃圾系統(tǒng)將floatdrop標(biāo)記為垃圾包,隨后導(dǎo)致了移除用戶及其所有的包的操作。
npm快速發(fā)現(xiàn)floatdrop確實(shí)是一個(gè)合法的用戶,并且他們的有些包被高度使用,所以他們立即采取行動(dòng)恢復(fù)所有的包。但就在這個(gè)過(guò)程所需的短短時(shí)間內(nèi),有一些與刪除包名稱相同的新包發(fā)布了,并且安裝數(shù)目不詳。
盡管npm的員工確認(rèn)所有這些上傳的替代包并非惡意的,但是這種事件有可能會(huì)給npm用戶的項(xiàng)目注入惡意代碼。需要注意的是,npm確實(shí)有一個(gè)策略,用來(lái)防止發(fā)布時(shí)間超過(guò)24小時(shí)的包被刪除掉,其目的在于讓其他人無(wú)法重用這些包的名字,但是這項(xiàng)策略之前并沒(méi)有應(yīng)用到垃圾軟件包的刪除上。這樣做的理由是不想讓垃圾軟件妨礙合法名稱的使用。
作為對(duì)這起事件的回應(yīng),npm的員工采取了幾項(xiàng)措施,其中最重要的就是對(duì)所有刪除的包名有一個(gè)24小時(shí)的冷卻(cooldown)時(shí)間,這項(xiàng)策略也包括含有垃圾內(nèi)容的包。這樣的話,通過(guò)替換已刪除的包來(lái)注入惡意代碼會(huì)變得更困難,但是如果有人試圖重用合法的包名的話,這需要npm的員工在24小時(shí)的時(shí)間窗口內(nèi)恢復(fù)該包名。
另外,npm的員工將會(huì)建立一系列的指導(dǎo)文檔,讓合法包名的誤刪更加難以出現(xiàn)。讀者可以在原始博客文章中了解更多信息。
查看英文原文:Last Npm Incident Uncovers Security Vulnerability