Arrow C++ IPC 實作的模糊測試
已發布 2020年3月31日
作者 Antoine Pitrou (apitrou)
Apache Arrow 旨在實現異質執行時期和環境之間快速且無縫的資料交換。無論是使用 Columnar IPC 串流協定、Flight RPC 層、Feather 檔案格式、Plasma 共享物件儲存區,或任何應用程式特定的資料分發機制,Arrow IPC 實作都可能會嘗試解碼來自不受信任輸入的資料。在這種情況下,回報錯誤是可以接受的,但 Arrow 不應在讀取此類資料時崩潰或從事危險行為。
為了驗證 Arrow C++ IPC 讀取器(也是 Python、C/GLib、R 和 Ruby 綁定的基礎)的穩健性,我們已成功提交 Arrow 專案至 OSS-Fuzz,這是 Google 提供的一項針對關鍵開源專案的持續模糊測試計畫。
正在模糊測試的內容
截至撰寫本文時,RecordBatchStreamReader
和 RecordBatchFileReader
C++ 類別正在透過饋送由模糊測試器產生的資料進行模糊測試。
當其中一個類別成功讀取記錄批次時,模糊測試設定會使用 RecordBatch::ValidateFull
驗證它。此方法可能會成功或失敗,但不應崩潰。
透過確保從 IPC 讀取記錄批次,然後驗證它,始終顯示確定性行為,我們希望使攝取來自不受信任來源的 Arrow IPC 資料相對安全。
(當然,對於安全性至關重要的應用程式,仍然建議使用加密方式進行身份驗證和完整性控制——例如,使用 Flight RPC 協定啟用 TLS)
我們如何幫助模糊測試器找到問題
模糊測試是一個暴力破解過程,它嘗試設計無效資料來測試實作的回應。預設情況下,模糊測試器對測試程式預期的資料表示一無所知。因此,模糊測試可能非常低效,測試大量無趣的變體,同時錯過關鍵的變體。
為了幫助引導模糊測試過程,我們新增了一個包含各種資料類型的有效 Arrow IPC 檔案的種子語料庫。透過從此資料開始並對其進行變異以找到無效的變體,OSS-Fuzz 能夠找到數十個資料驗證問題。所有這些問題都已修復。截至撰寫本文時,自 2020 年 3 月 4 日以來,IPC 層中未發現任何新問題。
接下來的計畫
當然,我們仍然監控 OSS-Fuzz,以查看是否在 C++ IPC 實作中發現任何新問題。例如,當向 Arrow IPC 格式新增功能時,可能會出現此類問題。
我們已經開始對 Parquet C++ 實作進行模糊測試。已經發現並修復了一些問題,但仍有更多問題出現。我們希望在未來一兩個月內穩定情況。
張量和稀疏張量 IPC 讀取路徑尚未進行測試。一旦有積極主動的核心開發人員想要負責此主題,就會進行測試。