打開網(wǎng)易新聞 查看精彩圖片

谷歌為 Go 編程語言開發(fā)者運(yùn)營(yíng)的一個(gè)鏡像代理,在長(zhǎng)達(dá)三年多的時(shí)間里一直在推送一個(gè)帶有后門的軟件包,直到本周一才停止。此前,發(fā)現(xiàn)惡意代碼的研究人員曾兩次請(qǐng)?jiān)敢髮⑵湎录堋?/p>

這個(gè)名為 Go 模塊鏡像的服務(wù),會(huì)緩存 GitHub 及其他地方的開源軟件包,以加快下載速度,并確保這些軟件包與 Go 生態(tài)系統(tǒng)的其他部分兼容。默認(rèn)情況下,當(dāng)有人使用 Go 內(nèi)置的命令行工具下載或安裝軟件包時(shí),請(qǐng)求會(huì)通過該服務(wù)進(jìn)行路由。該網(wǎng)站的介紹稱,這個(gè)代理由 Go 團(tuán)隊(duì)提供,“由谷歌運(yùn)營(yíng)”。

緩存隱患


安全公司 Socket 周一表示,自 2021 年 11 月以來,Go 模塊鏡像一直在托管一個(gè)廣泛使用模塊的后門版本。該文件使用了 “域名混淆(typosquatting)” 技術(shù),即給惡意文件起與廣泛使用的合法文件相似的名字,并將其植入熱門代碼庫。如果有人在使用命令行獲取文件時(shí)出現(xiàn)拼寫錯(cuò)誤,甚至只是對(duì)正確名稱做了微小變動(dòng),就會(huì)獲取到惡意文件,而非所需文件。(類似的域名混淆手段在域名方面也很常見。)

惡意模塊名為 boltdb - go/bolt,是被廣泛采用的 boltdb/bolt 的變體,有 8367 個(gè)其他軟件包依賴 boltdb/bolt 才能運(yùn)行。這個(gè)惡意軟件包最初出現(xiàn)在 GitHub 上。那里的文件最終被恢復(fù)為合法版本,但那時(shí) Go 模塊鏡像已經(jīng)緩存了帶后門的版本,并在接下來的三年里一直存儲(chǔ)著。

Socket 的研究人員寫道:“這次攻擊的成功依賴于 Go 模塊代理服務(wù)的設(shè)計(jì),該設(shè)計(jì)為了性能和可用性優(yōu)先考慮緩存。一旦某個(gè)模塊版本被緩存,即使原始源后來被修改,仍可通過 Go 模塊代理訪問。雖然這種設(shè)計(jì)對(duì)合法用例有益,但威脅行為者利用這一點(diǎn),盡管代碼庫后來發(fā)生了變化,仍持續(xù)分發(fā)惡意代碼?!?/p>

還有其他手段來吸引開發(fā)者使用這個(gè)軟件包。一是 boltdb - go/bolt 附帶的 README 文件是原始良性軟件包 README 文件的副本。另一個(gè)是原始軟件包已被歸檔。開發(fā)者通常會(huì)選擇活躍的分支版本,而非舊版本。還有些人可能會(huì)誤以為這個(gè)惡意軟件包就是原始 / 合法的軟件包。

后門潛入模塊,構(gòu)建了隱藏的 IP 地址和端口,并連接到攻擊者控制的服務(wù)器。然后它會(huì)執(zhí)行遠(yuǎn)程服務(wù)器發(fā)出的任何命令。該服務(wù)器的 IP 地址由 Hetzner Online(AS24940)托管,聲譽(yù)良好。Socket 的研究人員懷疑,該基礎(chǔ)設(shè)施是專門為此次攻擊行動(dòng)獲取的,以避免被發(fā)現(xiàn)。他們寫道:“與隨意傳播的惡意軟件不同,這個(gè)后門旨在融入可信賴的開發(fā)環(huán)境,增加了在被發(fā)現(xiàn)之前廣泛傳播并造成危害的可能性?!?/p>

發(fā)現(xiàn)該模塊后,Socket 上周五請(qǐng)?jiān)笇⑵湟瞥?。周一,Socket 再次請(qǐng)?jiān)?,該軟件包最終被下架。研究人員提供了以下事件順序:

  1. 威脅行為者在 GitHub 上創(chuàng)建一個(gè)仿冒倉庫(github.com/boltdb - go/bolt)
  2. 他們發(fā)布一個(gè)帶有隱藏遠(yuǎn)程訪問機(jī)制的后門版本(v1.3.1)
  3. Go 模塊鏡像獲取并緩存這個(gè)版本,存儲(chǔ)起來供未來安裝使用
  4. 威脅行為者修改 GitHub 倉庫,將 v1.3.1 替換為干凈版本
  5. 人工審查 GitHub 的人員現(xiàn)在只能看到干凈版本
  6. 盡管 GitHub 倉庫看起來是安全的,但 Go 模塊鏡像繼續(xù)向開發(fā)者提供惡意的 v1.3.1 版本
  7. 我們于 2025 年 1 月 30 日識(shí)別出惡意緩存軟件包,并請(qǐng)?jiān)笍?Go 模塊鏡像中移除它,2 月 3 日再次請(qǐng)?jiān)浮?/li>
  8. 我們還于 2 月 3 日向 GitHub 報(bào)告了該 GitHub 倉庫及相關(guān)賬戶,以供進(jìn)一步調(diào)查和下架處理。

盡管在檢測(cè)時(shí) GitHub 倉庫已 “干凈”,但通過 Go 模塊代理提供的緩存軟件包仍然是惡意的。這就是為什么 Go 的模塊緩存行為存在安全風(fēng)險(xiǎn),因?yàn)樗试S攻擊者在軟件包被緩存后隱藏蹤跡。

谷歌和 Go 團(tuán)隊(duì)的代表均未回復(fù)關(guān)于采取了哪些措施來確保通過該鏡像提供的模塊安全性的郵件詢問。

這項(xiàng)研究警示我們,在生產(chǎn)設(shè)備上運(yùn)行代碼之前,正確審查代碼非常重要。這個(gè)過程包括在安裝前驗(yàn)證軟件包的完整性、分析依賴關(guān)系是否存在異常,以及使用能更深入檢查已安裝代碼的安全工具。

黑客聯(lián)盟】帶你走進(jìn)神秘的黑客世界