蔡秀吉 Hsiu-Chi Tsai

Open Source · Audits

系統性正確性稽核

找到一個錯誤之後,我會把它的成因整理成一條檢查,再拿去看別的專案有沒有同樣的問題。這一頁是四條稽核線:跨專案的資源會計錯誤、多家廠商的 DRA driver、OCUDU 的 NTN 更新路徑、Kueue 的配額會計。每一項都附回報、修正與回歸測試的連結。精選的代表工作在 Overview,所有合併紀錄在 Ledger。

Variant Analysis

資源會計錯誤的跨專案追查

12 個缺陷變體 · 6 個獨立維護的上游專案 · 11 項修正已合併

從第一個資源會計錯誤開始,我把它的成因歸納成幾條檢查:配額與用量在相加、相乘、換算型別、共用與生命週期變動時,數字要放得下、狀態要一致,不能因為溢位、截斷、漏算或重複計算而失真。

接著我拿這幾條檢查去看其他排程器與 Kubernetes 的動態資源配置(DRA)。其中一條是「已經分配出去的資源,不能因為庫存資料更新就看起來像空的」,我另外寫成預印本 《No Capacity Resurrection》(SSRN),附可重現的實驗,見 Publications。

下表十二個問題都是我找到的,其中十一個開了 issue;Kueue 型別邊界那一項是前一項的後續,直接送了修正。十一個已經修好合併:十個是我送的修正,每一支都附回歸測試;KAI-Scheduler 的不限量配額那一項由 eladb 修好。剩下一個是 KEDA 的,我找到原因也備好修正,但那個 scaler 即將淘汰,維護者以 wontfix 關閉。

同一子系統的縱深:Kubernetes DRA structured allocator

除了跨專案比對,我也在 Kubernetes 本身的 DRA 配置器裡往下查同一類問題,修好五個並已合併:數值溢位與表示範圍(#140666、#140442)、不同 driver 的計數器快取互相撞名(#140435)、候選裝置被拒或回溯時留下的殘餘狀態(#140431),以及共享裝置的計數器被重複計算(#140437)。

這五支修正都已合併並列入 v1.37,每支都關閉一個我回報的 issue,也都附針對原本失效路徑的回歸測試。這部分程式碼會由 Kubernetes 的同步機器人複製到唯讀的 k8s.io/dynamic-resource-allocation 與 k8s.io/apimachinery 模組,下一節各家廠商的 driver 引用的正是這一份。鏡像 repo 只接受機器人同步,不另計為合併,Merged 只算 kubernetes/kubernetes 這一邊。

上游制度化:SIG API Machinery 的 Quantity int64 burndown

這類 int64 溢位後來被上游整理成正式的工作項目。SIG API Machinery 的維護者 jpbetz 開了 #141166,系統性追蹤 Kubernetes 數量型別在 int64 邊界的各種錯誤,並點名請我參與。我先送了第一項 #141170:把每個取值函式今天實際回傳什麼記成測試基準,之後的修正都能對著它比對。接著 #141305 讓這些取值函式溢位時停在上下限,不再悄悄繞成錯的數字,並新增能告訴呼叫端「放不下」的版本;同一天 #141349 修好驗證那一端:像 10P、1E 這樣的整數,原本會被誤判成「必須是整數」而拒絕。隔天再合併三支:#142013 修好數量比較本身的溢位;#141348 讓 LimitRanger 的上下限與比例改用這個比較,審查時發現得先修比較函式,所以順序是先修它;#141618 讓 PVC 指定 PV 時的容量檢查也用同一個比較。用錯取值函式的呼叫端與取值函式本身,到這裡都已合併。

不變量的最新延伸(回報中)

同一組檢查後來也在排程器以外找到問題。opencontainers/cgroups #73:把很大的 CPU 配額換算成 cgroup 設定時會溢位,寫進去的是一個極小的值,程式被悄悄限速;kolyshkin 10/2 送了修正 #79,審查中;Kubernetes 這一側的修正 #141327 也還在審查。kubernetes #141323:DRA 配置器檢查每個請求的裝置數上限時,用一般整數相加而溢位;修正 #141307 已合併,也回移到 1.34 到 1.37 四個版本,這則 issue 已列入 Found & Fixed。兩者都是我回報的,因為是同一條檢查延伸到新的專案,沒有算進上表的變體。

Kubernetes DRA

跨廠商 DRA driver 正確性稽核

9 個 driver · 8 個組織 · 其中 5 家同一個「多-driver claim」缺陷(★)

Kubernetes 的動態資源配置(DRA,1.34 起正式可用)讓每家廠商用自己的 driver 把硬體交給排程器。我逐一檢查多家 driver,發現它們常帶著同一個假設:一個請求的配置結果裡,每一筆都屬於自己這個 driver。但同一個請求可以由好幾個 driver 一起滿足,所以這個假設在五家廠商的 driver 上各自出錯(★ 標記)。已合併的修正見 Ledger 合併清單。

O-RAN / NTN

OCUDU NTN SIB19 路徑正確性稽核

12 個缺陷 · 分屬 5 種類別 · 同一 NTN SIB19 更新路徑

OCUDU(Open Centralized Unit Distributed Unit)是 srsRAN Project 的下一代,沿用它的 5G 基地台(CU/DU)程式碼,搬到 GitLab,授權也從 AGPLv3 改成較寬鬆的 BSD 類授權。初始軟體由美國政府出資,交給 DeepSig 與 Software Radio Systems(SRS)建置。

2026 年 3 月,Linux Foundation 成立 OCUDU Ecosystem Foundation,讓專案在中立的開源治理下發展,創始成員包括 AMD、AT&T、Ericsson、Nokia、NVIDIA、SoftBank 與 Verizon 等。SRS 是主要的程式碼貢獻者之一。

OCUDU 的前身 srsRAN Project 從 24.4 版就支援同步軌道衛星的非地面網路(NTN),OCUDU 的第一個版本也保留了這項功能。2026 年 7 月,開發分支密集合併了一批 NTN 擴充:衛星資訊廣播(SIB19)、地面與衛星的鄰區資訊、衛星切換、饋電鏈路的時間提前量,以及動態更新衛星資訊。

我用同樣的方法,把這條剛落地的衛星資訊更新路徑從頭看到尾(從 DU 的管理流程到 MAC 排程與軌道計算),找到 12 個問題,分成五類:記憶體生命週期、時間與編號的邊界、數值退化、錯誤處理與交易性、狀態不同步。

8 月中有了實質進展。!1153 在審查時縮小成只修一個 use-after-free,已合併並關閉 #643(見下方縱深一);原本一起修的另外六項(#652、#653、#654、#655、#656、#657)被移出範圍,issue 仍開。!1242 修好 #695 的 SI 視窗計算,已合併。!1162 處理 #658 的全 0 廣播,也已合併。!1096 裡衛星資訊時間基準的部分已合併,但和本次稽核的 issue 無關;它原本也修 #649,因為和開發分支重複而撤回,issue 仍開。#659 的修正沒有合併,issue 已由維護者關閉;#660 也由維護者關閉。#643、#695 是我回報並修好的,!1153、!1242、!1162、!1096 都已合併。

縱深一:非同步生命週期安全(#643 → !1153)

衛星資訊的更新流程,把指向函式內暫存資料的參照,交給一個稍後才執行的協程。原本的處理函式一返回,那些資料就已經釋放,之後的 DU 更新與 MAC 重新設定讀到的都是已釋放的記憶體。

已合併的 !1153 讓請求自己持有這些資料,一路以值傳遞到協程與後續流程。新加的端到端回歸測試用 ASan 驗證過:修正前會報錯,修正後通過;我也把兩個成因分別放回去(mutation testing),確認測試各自抓得到。合併後關閉 #643。

縱深二:整條 NTN 更新程序的錯誤處理缺口

#653、#654、#655 與 #657 都在同一個 NTN 參數更新流程上,合起來看,是這個流程從頭到尾沒有處理失敗:佇列滿了就悄悄丟掉、中途失敗留下改到一半的狀態、忽略失敗還回報成功、多個封包中途失敗不撤回。這四項不在已合併的 !1153 範圍裡,仍在回報中,等之後的修正。

另記兩項

#642 時間基準的設定項:文件說這個設定可以覆寫衛星資訊裡的時間基準,但程式從來沒有讀它。維護者後來在 !1216 把這個設定和 epoch_sfn_offset 兩個參數整個拿掉,8/6 關閉這則。

#633 CI 的相依版本(和 NTN 無關):CI 用的 CodeChecker 停在 6.26.1,它附帶的工具受 CVE-2025-40843 影響,6.26.2 已修。目前的 CI 沒有用到受影響的功能,所以這是預防性的升級。

已合併的 OCUDU NTN 修正

在這次稽核之前,OCUDU 已經合併了兩個我回報並修好的 NTN 設定問題,都是 3GPP Release 17 規定的數值範圍沒有檢查:!1045 檢查 k_mac 參數必須在 1 到 512 之間(關閉 #577),!1047 檢查共同時間提前量的總和落在規格範圍內(關閉 #579)。見 Issues。

Kueue · Resource transformation

Kueue 配額會計正確性稽核

7 個缺陷 · Kueue 配額會計與資源轉換驗證

Kueue 會依設定把資源換算成別的資源,再連同工作本身的請求一起計入配額。我用三條標準檢查這條路徑:設定要先驗證、計費不能悄悄算錯、同一份設定每次要算出一樣的結果。目前找到七個問題:負的係數變成在做減法、保留名稱沒有擋、名稱相撞時結果不固定、「保留原量」寫回的是乘過的值、Pod 的額外開銷沒有驗證、大數相乘被截斷、替換延伸資源時連帶刪掉別的計費。

以下七項都是我回報的。六項已由我的修正合併:#13986 一次修好三項,另有 #13989、#14042 與 #14154;第七項的修正(#13995)為了不超過 Kueue 開著 PR 數量的上限,10/11 先關掉;隔天 nareshpatel1015 另開 #17090 修這一項,我審了三輪後給 lgtm,10/14 合併,七項都已修好。

Audits in flight

進行中的系統性稽核

5 條稽核線 · 橫跨可觀測性、批次排程、嵌入式驅動、宣告式基礎設施與節點執行期

上方四區是已經告一段落的稽核;這裡是還在進行的,多數已經回報,部分修正已合併或還在上游審查。