Checkmarx 研究團隊最近發現了一場針對軟體供應鏈的攻擊活動,有證據顯示已有多個受害者收到攻擊。其中包括 Top.gg GitHub 組織(擁有超過 17 萬使用者的社群)和多位個人開發者。資安威脅者在這次攻擊中使用了多種 TTPs,包括透過竊取的瀏覽器 cookie 接管帳戶、向經過驗證的提交中加入惡意程式碼、設定自定義的 Python 鏡像以及將惡意套件發佈到 PyPi 註冊表內。本次報告將介紹此次攻擊以及攻擊者使用的技術。
關鍵點
「我今天使用我的筆記型電腦,只是在命令列上執行 python 和其他指令,直到我在命令行上看到一條奇怪的消息,說 python 上的 colorama 有問題,起初並沒有太在意,因為已經習慣了這些東西,所以我跳過了它,幾分鐘後,在另一個我在用的腳本中也收到了相同的錯誤訊息。當我看到這個的時候,我就知道發生了什麼事,我被駭了。」
這個令人不寒而慄的敘述來自Mohammed Dief 最近的一篇部落格文章,他是一位 Python 開發人員,在複製(Clone)儲存庫「maleduque/Valorant-Checker」時成為複雜惡意程式攻擊的受害者。
Mohammed Dief 的故事只是這場惡意程式活動廣泛影響的一個例子。該活動背後的攻擊者採用了一種狡猾的策略,透過惡意 GitHub 儲存庫散播惡意程式。
攻擊基礎設施包括一個看似 Python 套件鏡像的網站,並在網域"files[.]pypihosted[.]org"下註冊。
這個網域選擇是對官方 Python 鏡像"files.pythonhosted.org"的巧妙地錯字仿冒,因為後者通常是存放 PyPi 套件的官方文件的地方。

根據攻擊者的蹤跡,我們看到他們利用了 pip(Python 的套件管理器)中的一項功能,你可以在其中指定 URL 來獲取套件相依性並使用他們偽冒的 Python 鏡像來下載套件。

Requirement.txt 文件中的假鏡像 URL 與合法 URL
資安威脅者使用 Colorama 並在其中添加惡意程式碼,然後將含有惡意的 Colorama 套件託管在其偽冒的網域上;攻擊者能夠使用與熱門的"Colorama"套件完全相同的名稱,而不會立即引起懷疑。這種策略使得使用者更難檢測到套件的惡意性質,因為乍看下它似乎是合法的相依性。
為了進一步隱藏他們的惡意意圖,攻擊者在對許多惡意儲存庫提交變更時採用了一種策略方法。他們會同時提交多個文件,包括包含惡意連結的要求文件以及其他合法文件。這項經過深思熟慮的措施旨在最大限度地減少檢測的機會,因為惡意連結會與合法的相依性混合在一起,從而降低使用者在粗略審查已提交的變更時發現異常的可能性。
攻擊者在多個文件的提交中隱藏偽冒鏡像 URL 的範例
攻擊者的影響力不僅僅是透過他們自己的帳戶創建惡意存儲庫。他們成功劫持了一位名為"editor-syntax"使用者的 GitHub 帳戶,該使用者是 top-gg 公司的成員,也是其中一個儲存庫的貢獻者。透過控制這個可信任帳戶,攻擊者進行了一系列惡意活動:
"editor-syntax"的 GitHub 帳戶很可能是透過被盜的 cookie 而被劫持的。攻擊者獲得了對帳戶會話 cookie 的存取權限,從而允許他們繞過身份驗證並使用 GitHub UI 執行惡意活動。這種帳戶接管方法尤其令人擔憂,因為它不需要攻擊者知道帳戶的密碼。

該事件在 top-gg 社群(擁有超過 17 萬名會員)引起了恐慌,因為使用者在 Discord 上公告了關於"editor-syntax"其帳戶發出的可疑活動。至少可以說,"editor-syntax"非常震驚,因為他透過自己的 GitHub 帳戶意識到發生了什麼事。很明顯,該惡意軟體已經危害了很多人,凸顯了攻擊的規模和影響。

有趣的是,攻擊者的 Typosquatting 技術是如此令人信服的,甚至 GitHub 上的使用者在不知不覺中成為了受害者。當惡意的網域"piphosted[.]org"停止運作時,該使用者在其中一個惡意儲存庫上提出問題,並對此進行了抱怨,但沒有意識到它是惡意負載的主機。

除了透過惡意 GitHub 儲存庫散播惡意軟體外,攻擊者還利用名為"yocolor"的惡意 Python 套件進一步發佈包含惡意程式的"colorama"套件。他們採用了相同的 Typosquatting 技術,將惡意套件託管在網域"files[.]pypihosted[.]org"上,並使用與合法"colorama"套件相同的名稱。
透過操縱套件安裝過程並利用使用者對於 Python 套件生態系統中的信任,攻擊者確保只要在專案要求中指定惡意相依性,就會安裝惡意「colorama」套件。這種策略使攻擊者得以避開懷疑,並滲透到依賴 Python 套件系統完整性且毫無戒心的開發人員的系統中。

第一階段是,毫無戒心的使用者從偽冒的網域"files[.]pypihosted.org"下載包含惡意相依性的惡意儲存庫或套件-"colorama"。

ycolor 套件中惡意程式碼的範例
惡意套件"colorama"包含與合法套件相同的程式碼,除了一小段額外的惡意程式碼。最初,該程式碼位於"colorama/tests/__init__.py"檔案中,但攻擊者後來將其移至"colorama/init.py",可能是為了確保惡意程式碼更可靠地執行。該程式碼為攻擊的後續階段奠定了基礎。
攻擊者採用了一種巧妙的技術將惡意負載隱藏在程式碼中。他們使用大量的空白將惡意程式碼推離螢幕,要求檢查包的人在發現隱藏的惡意內容之前水平滾動很長一段時間。該技術目的是使惡意程式碼在快速查看套件的來源檔案時不那麼引人注目。
此程式碼從"hxxps[:]//pypihosted[.]org/version"取得並執行另一段 Python 程式碼,該程式碼安裝必要的函式庫並使用 fernet 函式庫解密硬編碼資料。然後,被解密的程式碼會搜尋有效的 Python 直釋器,並執行保存在暫存檔案中的另一個混淆的程式碼片段。
惡意軟體進一步發展,從另一個外部連結獲取額外混淆的Python程式碼:hxxp[:]//162[.]248[.]100[.]217/inj,並使用"exec"執行它。

經過分析,攻擊者很明顯地已經對他們的程式碼進行了混淆。使用中文和日文字串、zlib 壓縮和誤導性變數名等技術只是使程式碼分析和理解複雜化的一些技術。
簡化的程式碼檢查受感染主機的作業系統,並選擇一個隨機的資料夾和檔案名稱來託管最終的 Python 惡意程式碼,該程式碼從"hxxp[:]//162[.]248[.]100.217[:] 80/grb"中取得。
惡意軟體也採用持久化機制,透過修改 Windows 註冊表來建立新的運行鑰,確保每次系統重新啟動時都會執行 Python 惡意程式碼。這使得惡意軟體即使在重新啟動後也能在受感染的系統上保持運作。

惡意軟體的最後階段,從遠端伺服器提取及揭示了其資料竊取能力的真實程度。它針對各種熱門的軟體應用程式並竊取敏感訊息,其中一些資訊包括:
對最終有效負載的進一步分析表明,該惡意軟體還包含鍵盤記錄(keystrokes)元件。它捕獲受害者的擊鍵並將其保存到檔案中,然後將其上傳到攻擊者的伺服器。此功能允許攻擊者監視和記錄受害者的鍵入的輸入,從而可能暴露密碼、個人訊息和財務詳細資訊等敏感資訊。
使用各種技術將被竊取的資料外洩到攻擊者的伺服器。程式碼包括將檔案上傳到匿名檔案共用服務(例如 GoFile 和 Anonfiles)的功能。它還使用 HTTP 請求將竊取的資訊以及硬體 ID 或 IP 位址等唯一識別碼傳送到攻擊者的伺服器,以追蹤受害者。
該活動是惡意行為者採用複雜策略透過 PyPI 和 GitHub 等可信任的平台散佈惡意軟體的典型例子。這個事件凸顯在安裝套件和儲存庫時保持警覺的重要性,即使是來自可信任來源的套件和儲存庫。徹底審查相依性、監控可疑網路活動並保持強大的安全實踐,以降低成為此類攻擊受害者的風險至關重要。
隨著網路安全社群不斷發現和分析這些威脅,協作和資訊共享對於持續打擊軟體供應鏈中的惡意行為者仍然至關重要。我們向 Cloudflare 報告了被濫用的網域,而且它們已被刪除。
作為 Checkmarx 供應鏈安全解決方案的一部分,我們的研究團隊持續監控開源軟體生態系統中的可疑活動。我們追蹤並標記可能表明不法行為的「信號」,並及時提醒我們的客戶以幫助保護他們。共同努力維護開源生態系統的安全。
時間軸:

