對於許多初入行的工程師來說,我們習慣於信任套件管理工具(如 RubyGems, npm, PyPI),認為只要是從官方 Registry 下載的套件就是安全的。然而,最近被揭露的 SleeperGem 攻擊案例告訴我們,攻擊者可以透過操縱供應鏈,將惡意程式直接植入我們日常開發的工具鏈中。
這次的攻擊名為 SleeperGem,其核心目標不是伺服器,而是開發者的本地端機器。
什麼是供應鏈攻擊
供應鏈攻擊(Software Supply Chain Attack)是指攻擊者不直接攻擊目標公司的防火牆,而是攻擊該公司所依賴的第三方軟體或套件。一旦惡意程式被打包進一個受信任的套件中,所有下載該套件的開發者都會在不知不覺中執行攻擊者的程式碼。
SleeperGem 的兩種滲透策略
這次攻擊採取了兩種截然不同的心理戰術來欺騙開發者。
第一種是偽裝(Impersonation)。攻擊者發布了一個名為 git_credential_manager 的套件。對於開發者來說,這看起來就像是微軟官方的 Git 憑證管理工具,很容易在安裝時被誤認為是官方元件而直接下載。
第二種是喚醒休眠帳號(Account Hijacking)。這是 SleeperGem 命名由來的原因。攻擊者並不總是創建新帳號,而是劫持那些已經多年沒有更新、但具有一定信譽的舊帳號(例如 Dendreo 和 fastlane-plugin-run_tests_firebase_testlab)。對開發者而言,一個存在了五六年的舊套件看起來比新套件更可靠,但實際上這些帳號已被盜用,並被推送了帶有惡意程式碼的新版本。
惡意程式的運作邏輯與 evasion 技術
當開發者安裝這些惡意套件後,程式碼並不會立即大張旗鼓地破壞,而是採取分階段的 Loader 模式。
首先,它會執行環境偵測(Anti-Sandbox/CI Check)。惡意程式會掃描系統中約 30 個環境變數,檢查是否包含 GitHub Actions, GitLab CI, Jenkins 或 Vercel 等字樣。如果偵測到自己正運行在 CI 跑路器(Ephemeral CI Runners)中,它會立即停止執行。這是為了避開安全研究人員的自動化分析沙箱,確保攻擊只發生在真正的開發者個人電腦上。
接著,它會從攻擊者控制的 Forgejo 伺服器(一種類似 GitHub 的 Git 託管服務)下載第二階段的 Payload。在 Windows 上,它會透過 PowerShell 執行;在 Linux 上,則會安裝一個背景守護行程(Daemon)以實現持久化(Persistence),確保電腦重啟後惡意程式依然運行。
最後是權限提升(Privilege Escalation)。如果攻擊者發現當前使用者可以使用不需要密碼的 sudo 指令,它會直接以 root 權限執行,並在系統路徑中植入一個偽裝成網路工具(如 ping6)的 setuid root shell,讓攻擊者隨時能以最高權限掌控整台機器。
RubyGems 被當作死信箱(Dead Drop)的趨勢
值得關注的是,RubyGems 最近不僅被用作分發惡意軟體的管道,還被某些攻擊者當作死信箱(Dead Drop)。
死信箱是指一個看似正常且流量巨大的公開平台,用來暫存盜取的資料。某些惡意瀏覽器擴充功能會將偷來的密碼、SSH 金鑰或信用卡號碼,直接封裝成 .gem 檔案上傳到 RubyGems.org。由於 RubyGems 是開發者常用的信任域名,這種上傳行為不容易被防火牆攔截,攻擊者之後再回來下載這些檔案即可。
工程實務建議
面對這類攻擊,單純依賴視覺上的名稱檢查是不夠的。建議採取以下防禦措施。
第一,嚴格管理套件版本。在專案中使用 lock 檔案(如 Gemfile.lock)來固定版本,避免在執行更新時意外升級到被劫持的惡意版本。
第二,審核依賴關係。定期檢查專案的依賴樹,如果發現原本不常用的套件突然更新,或者出現名稱可疑的依賴項,應提高警覺。
第三,實行最小權限原則。盡量避免設定不需要密碼的 sudo 權限,這能有效阻斷惡意程式從使用者權限提升至 root 權限的路徑。
如果懷疑受影響,請立即檢查 ~/.local/share/gcm/ 路徑是否有異常檔案,檢查 /usr/local/sbin/ping6 是否被篡改,並立即更換所有儲存在本地端的 API Key 與金鑰。
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。