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