Meta Llama Stack 驚現高危漏洞,Oligo Security 緊急揭露

Oligo Security 的研究團隊在 Meta 的開源 Llama Stack 框架中發現了一個嚴重漏洞 (CVE-2024-50050)。此漏洞源自於對 pyzmq 程式庫的 recv_pyobj 函數的不安全使用,允許在受影響的伺服器上執行任意程式碼。此漏洞的 CVSS 評分較高(9.3),反映了其嚴重性,可導致資料外洩和資源竊取等行為。 Meta 很快就在 0.0.41 版本中修補了這個問題,Oligo 平台使用即時運行時分析檢測到了漏洞。這篇部落格文章強調了安全編碼實踐(Secure Coding Practice)和負責任的揭露的重要性。

 Meta Llama Stack 驚現高危漏洞 | 應用程式安全測試 | AST | 資訊安全

漏洞簡介

Oligo 研究團隊在 meta-llama 開源框架中發現了一個嚴重漏洞 CVE-2024-50050。此漏洞允許攻擊者透過網路在 llama-stack 推理伺服器(Inference server )上執行任意程式碼。這個漏洞源自於 pyzmq 函式庫的不安全使用,特別是 recv_pyobj 方法。

概念驗證(POC)演示

  • 有漏洞的方法(Vulnerable Method): Default meta reference python Inference API 中的 run_inference method使用 recv_pyobj 來接收序列化的 Python 物件。這些物件使用 Python 的 pickle.loads 方法自動反序列化。
  • Pickle 不安全性: pickle.loads 方法在與不受信任的資料一起使用時本質上是不安全的,因為它可以在反序列化過程中執行任意程式碼。
  • 漏洞攻擊:
    1. 攻擊者使用定義反序列化期間自訂行為的類別來製作惡意 Python 物件。提供的範例使用了一個名為 RCE 的類,該類別使用 _reduce_ 方法來指定它應該在解封(unpickle)時執行一個命令。
      • 當 pickle.loads 反序列化一個物件時,它會尋找像 _reduce_ 或 _reduce_ex_ 這樣的方法來定義如何還原該物件。
      • 如果實作了其中任何一種方法,它就允許物件為其反序列化指定自訂行為。 _reduce_ 方法可以包含在物件被解封時執行任意指令的程式碼。
    2. 攻擊者透過掃描監聽的 Python 程序來識別開放的 llama-stack 連接埠。
    3. 然後使用 pickle.dumps 序列化惡意物件並將其傳送至已識別的 ZeroMQ 套接字。
    4. 當受害程序呼叫 recv_pyobj() 時,它會在反序列化期間執行 pickle 的程式碼,從而導致任意程式碼執行。在提供的範例中,這會導致在 /tmp 目錄中建立一個文字文件,從而證明任意程式碼執行。

查找漏洞 :

  • Oligo Research 團隊正在研究開源 AI 框架,並注意到 pyzmq 程式庫存在不安全使用的常見問題。
  • 他們發現 llama-stack 框架在其預設推理 API 實作中使用了 recv_pyobj 方法。
  • 他們意識到,當 ZeroMQ socket在網路上暴露時,此方法使用不安全的 pickle.loads 方法反序列化資料。
  • 這種不安全的做法允許攻擊者發送惡意的 pickle 物件,這些物件可以被反序列化,從而在主機上實現任意程式碼執行 (RCE)。

檢測漏洞 :

  • Oligo ADR 使用廣泛且不斷更新的執行時間設定檔資料庫,其中包含眾多第三方程式庫。
  • 這些設定檔可辨識不尋常的函式庫行為,從而顯示漏洞的開始或進展。
  • 對於 llama-stack 函式庫,Oligo 的預先建置設定檔從未記錄過 Pickle 處理流程中合法的程式碼執行實例(Instance)。
  • 任何試圖觸發注入漏洞的行為都會被標記,並在 Oligo ADR 平台中產生事件報告。
  • Oligo 平台透過分析 Python 呼叫堆疊和函式庫層級設定檔偏差來偵測漏洞。
  • 即使沒有與 llama-stack 相關的預先存在的 CVE,這種檢測方法仍然有效。

總結:

總而言之,meta-llama 中的漏洞源於對 pickle.loads 的不安全使用,該腳本透過網路Socket接收不受信任的數據,從而允許攻擊者透過發送惡意的 pickle 物件來執行任意程式碼。 Oligo 透過監控庫的運行時行為並識別異常模式來檢測漏洞。修復涉及以類型安全的 Pydantic JSON 實作取代不安全的 pickle 序列化。