區塊鏈技術如何修復Node.js 生態系統
對於所有從事Web或Node應用的人而言,噩夢可能正在喚醒我們:
媒體迅速報道了這件事,現在也出現了關於密碼貨幣和安全的大規模醜聞,而JavaScript則是最好的處方。而且不止這些:這個醜聞從根本上合法地質疑了我們用Node.js構建(開源)軟體的方式。
NPM模組應該是多重簽名的。而證書和信任模式應該是在區塊鏈上完成的。開源開發者可簽署package,並根據他們對付費軟體的貢獻來接收共享。這可以通過密碼支付和智慧合約來自動實現。相比釋出許可權,新的維護者 = 潛在黑客,只能被授予相對簽名許可權。模組管理器中的自動簽名和驗證檢查,可以確定未知和不可信的新簽名,並根據規則和各個威脅模組接受或拒絕更新。然後可通過更有針對性的方式稽核這些模組。
免責宣告:本文意見僅代表作者自己。
那到底發生了什麼?
我們在GitHub和NPM上的 ofollow,noindex" target="_blank">event-stream儲存庫 中找到答案:
7年前,開發者dominictarr(好意)建立了一個名為“event-stream”的NPM模組,這是一個易於建立和使用stream的工具包。該模組非常成功,其每週的下載量約為200萬。
在大約兩個月後(經歷了82個版本的更新),4.0.1 版本的模組被髮布了。但是,這次是一個名為@ right9ctrl的黑客釋出了它,而不是dominictarr。並且這個版本模組的目的並不是輕鬆建立和使用stream,而是竊取使用者的密碼貨幣。並且因為沒有人會自願使用這樣的模組,所以他們對程式碼進行加密處理,並使用event-stream模組的品牌,將惡意程式碼隱藏到數百萬個其它專案當中。
那麼他們是如何進入官方NPM賬戶的呢?他們入侵了賬戶嗎?他們是否使用了社會工程,他們是否脅迫了dominictarr?還是他是在槍口下被迫交出憑證的?
並沒有,黑客只是通過電子郵件進行了請求,顯然,這已經足以獲得每週200萬(或每年1.12億)次安裝的完全釋出權!
很多開發者會是魯莽的,他們把使用者置於危險之中,人們可能因此已經或將會損失他們的資金。
面對來自外部的巨大壓力,最初的開發者兩天前釋出了一份 官方宣告 ,陳述了一些非常有效的觀點:
嗨,大家好,這不僅僅是一件小事,在您的依賴樹中可能還有很多其它模組,這些模組現在成了作者的負擔。我不是為了利他主義動機而建立的程式碼,我只是為了樂趣而做的這件事。[…]
如果它變得不再有趣了,那麼維護一個流行的package實際上什麼也得不到。[…] 所以現在,我們正處在一個奇怪的山谷,那裡有一大堆依賴關係,這些依賴關係被失去興趣的人所“維護”著,或者甚至他已經耗盡了興趣,並且連他們自己都不再去使用。
我看到了這個問題的兩個強有力的解決方案…… 1、支付維護費! 2、當你依賴某件事時,你應該參與維護它。
開原始碼
我還沒見到有哪個行業能夠像軟體行業一樣,其中有很多工作是免費的,開源開發者們經常會這樣做,很多隻是為了“樂趣”,或者他們想要得到“反饋”,因為他們知道如果沒有開源軟體,我們就無法實現那麼多的進步。然而,我們對這些專案的責任和期望與付費軟體卻是相同的。開發人員和維護人員經常因“不做”工作或沒有“及時”迴應,而受到騷擾。但是,我們忘記了大多數開發者都是按照自己的時間表來工作的,如果你有一份主業,並且希望和家人一起生活,或者對編程式碼並不是那麼熱衷,那麼“及時”反饋根本就是一種奢望。人們常常忘記開發者不欠任何人任何東西。
維護是一個巨大的負擔,這就是在付費軟體行業中通過維護賺取大量資金的原因。但我們忘記了 npm install cat-ascii-faces --save 並不包含終身維修服務這種要求。
一旦使用統計數字或付款下降,就很容易造成專案的停止。那些已停產的專案,正在成為一個大規款的安全問題,現在應該讓每個人都清楚。或者引用Electron核心開發人員之一Paul Betts的話就是:
想要進行正確的更新,是極其困難的,而具有諷刺意味的是,這些天用於構建最流行程式碼編輯器以及密碼錢包的Electron框架,現在存在著大量問題,例如具有公開記錄長達一年之久的Chromium漏洞。很多依賴Electron 的應用,致使數百萬使用者面臨風險。但即使你經常更新自己的軟體(正如你希望的那樣!),是什麼阻止惡意NPM程式包偷偷潛入應用的程式碼庫?我還沒有檢查它,但如果event-stream 進入了非常流行的應用,例如VS Code,它可以很容易地升級到相同的完整遠端程式碼執行(RCE)攻擊。擁有完整的主機系統,就好像黑客正坐在它前面,他可以完全訪問鍵盤、滑鼠、檔案系統、相機…?攻擊場景不僅僅限於從錢包從竊取密碼貨幣。
NPM模組安全性
這個月初,我在以太坊 Devcon IV 大會上就瀏覽器和錢包安全性問題發表了演講。其中有一張演講幻燈片,它討論了過去基於Electron應用的攻擊向量以及成功的攻擊案例。
這張幻燈片基於Luca Carettoni令人敬畏的黑帽演示“ Electronegativity ”和威脅模型:
NPM模組打開了一個巨大的攻擊面,在3周前,我就向聽眾進行了警告,他們不知道在當時正在發生另一起攻擊。NPM 或依賴項安全性對於Electron或Node.js而言,並不是一個特定的問題(即使那裡會更糟糕)。它也不是新的或未知的,不幸的是,它也不會被新的審計特性所解決。而且,在GitHub上進行更好的AV整合或掃描,或者AI或漏洞檢查和標記,並不能解決此問題。儘管這些都是巨大的進步,它表明我們最終可以清醒過來,並且更加意識到我們面臨的安全問題。
那麼,我們怎樣才能修復我們的生態系統呢?
在dominictarr釋出的宣告中,他寫道:
“開源是由共享驅動的!這很棒!在比特幣流行之前,這種方式就工作得很好了。”
有趣的是,我認為區塊鏈技術並不是一個問題,而是一個解決方案,我們需要兩件事來創造一個更好的生態系統:
- 我們需要一種更簡單的方法,來根據某些規則自動向開源開發人員進行支付。
- 程式碼和模組需要進行多重簽名,並且證書應該更便宜且易於驗證。
傳統上,這兩件事都是很難的,但我們幾乎可通過“區塊鏈技術”的最新進展來免費獲得到它們。
那麼,我們如何用區塊鏈技術來避免這些場景呢?
比方說,我們有一個專案,它使用了開源模組,並使用密碼貨幣作為應用內建支付方式。
我們的依賴項之一可能變成一個惡意package,就像event-stream事件中看到的那樣。但是,原開發人員不給予新合作者完全維護或完全釋出許可權,而是給予新維護者或CI系統僅簽署許可權。所以新開發者會在他們釋出的版本上簽名,而原作者經過仔細的審查後,會附籤宣告,表示他檢查並批准了這些更改。
【隨著每次釋出和附加簽名,新作者自己的簽名當然會獲得更多的信任。】
如果稍後有人收到使用此模組軟體的付款,那麼在執行環境中可能有一些邏輯,這些邏輯基於此開原始碼的影響或貢獻,將自動把每筆付款的一部分資金分發給模組作者,而每年1.12億次下載,足以積累成一筆巨大的財富,並實際鼓勵作者維護流行和有用的專案。
雖然這聽起來有點未來主義,但今天我們實際上可能已經擁有了,我們應該儘快到達那裡。
其他簽署模組的專案已開始基於PGP金鑰,並且採用此標準,聽起來是符合邏輯的下一步驟,該標準在其他軟體領域已經是一種常見做法。
我敢肯定會有更多的改進方案,而簽名和支付有望很快成為普遍現象,並幫助生態系統建立更高質量的程式碼,鼓勵更多的開源開發人員做出貢獻,因為我們非常需要它們。