蔡秀吉 Hsiu-Chi Tsai

Open Source · Audits

系統性正確性稽核

不是逐個修 bug,而是從一個缺陷抽象出審查不變量,跨專案追蹤同一失效模式。三條稽核線:跨專案資源會計變體、跨廠商 DRA driver、OCUDU NTN SIB19 路徑;每項附 issue、patch 與回歸測試。代表工作在 Overview、完整帳本在 Ledger

Variant Analysis

從單點修正到跨專案缺陷模式追蹤

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

我不把單一缺陷的修正視為終點。從第一個資源會計錯誤出發,我將根因抽象為一組可重用的審查不變量:資源需求與配額計算在加總、乘法、數值轉換、共享配置與生命週期變更時,必須保持數值可表示、狀態一致,且不能因溢位、截斷、漏算或重複計數而失真。

接著,我以這組不變量系統性檢查其他排程器與 Dynamic Resource Allocation (DRA) 實作,最終在六個獨立維護的上游專案中辨識出九個缺陷變體。

九項問題均由我發現並回報;其中八項的修正由我提交、經上游維護者審查後合併,且每一支都附帶回歸測試,另一項雖已確認根因並備妥修正,因該 scaler 即將 deprecate 而由維護者以 wontfix 結案。下方逐項列出從回報到修正的連結,呈現問題重現、根因分析、修正設計到上游交付的完整證據鏈。

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

跨專案追蹤缺陷變體之外,我也在 Kubernetes 核心 DRA allocator 中沿著資源會計不變量持續向下檢查。五項已合併修正涵蓋數值表示與溢位(#140666#140442)、跨 driver 的 counter-cache 身分碰撞(#140435)、候選拒絕與回溯時的狀態洩漏(#140431),以及持久化共享裝置的 counter 重複計算(#140437)。

五支 PR 均已合併至 master、帶有 release-note 標籤並列入 v1.37 milestone;每支均關閉一個由我回報的 issue,並附有針對原始失效路徑的回歸測試。

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

這條 int64 溢位家族後來被上游收攏成正式工作項。SIG API Machinery 維護者 jpbetz 在 #141166 開了官方 burndown、系統性追蹤整個 resource.Quantity int64 accessor 溢位 class(乘法 wrap、負值捨入方向、String() 掉後綴、指數截 32-bit 等),並具名 CC 我。我供稿其第一項:#141170 的 baseline accessor 測試矩陣:記錄 Value/MilliValue/ScaledValue 等每個 accessor 今日的實際回傳、對錯誤值標 TODO,讓後續每項修正都對「已知基準」做 diff 而非憑記憶。此為 open PR、未計入 Merged。

不變量的最新延伸(回報中,未計入上列 9 項)

同一組資源會計不變量持續在新的專案表面發掘變體。近期兩則回報把它帶出 Kubernetes 排程器、落到容器執行期的資源設定層:opencontainers/cgroups #73systemdaddCPUQuota 把大 CPU quota 換算成 cgroup 週期值時 int64 溢位、寫出一個極小的配額而靜默限流)與 kubernetes #141323(DRA structured allocator 在 per-claim 上限檢查時,用原生 int 加總 device count 而溢位)。兩者均由我回報、修正尚未提出,不計入上列 9 個變體或 Merged;列此是因為它們是同一不變量往新專案的延伸,而非另一種缺陷。

Kubernetes DRA

跨廠商 DRA driver 正確性稽核

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

Dynamic Resource Allocation(DRA,Kubernetes 1.34 GA)讓每個廠商用自己的 driver 把硬體交給排程器。我沿用缺陷變體分析法橫向稽核多家 driver,發現一個反覆出現的共通假設:claim.Status.Allocation.Devices.Results 裡的每一筆都是我這個 driver 的」。但一個 ResourceClaim 可由多個 driver 一起滿足,於是這個假設在四家不同廠商的 driver 上各自爆開(★ 標記)。這與我在 Kubernetes 核心的 int64 溢位家族是同一種方法,換到裝置管理層。回報中/進行中項目未計入 Merged;已 merged 的修正見 Ledger 合併清單

O-RAN / NTN

OCUDU NTN SIB19 路徑正確性稽核

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

OCUDU(Open Centralized Unit Distributed Unit)是 srsRAN Project 的後繼專案,承襲其 5G CU/DU 程式碼、系統架構與開發脈絡。程式碼由 GitHub 移轉至 GitLab,主要授權亦由 srsRAN Project 的 AGPLv3 改為較寬鬆的 BSD-3-Clause-Open-MPI。OCUDU 的初始建置計畫於 2025 年公布,由美國 FutureG Office 透過 National Spectrum Consortium 提供經費,交由 DeepSig 與 Software Radio Systems(SRS)共同建置初始軟體。

Linux Foundation 於 2026 年 3 月 1 日在 MWC Barcelona 宣布成立 OCUDU Ecosystem Foundation,將技術專案置於中立、跨組織的開源治理架構之下。創始成員包括 AMD、AT&T、DeepSig、Ericsson、Nokia、NVIDIA、SoftBank、SRS 與 Verizon。SRS 是初始 CU/DU 程式碼的重要建置者及核心技術貢獻者之一。

OCUDU 並非在 2026 年 7 月才開始支援 NTN(Non-Terrestrial Network,非地面網路)。其前身 srsRAN Project 在 24.4 版已加入 GEO NTN 與 SIB19 支援,OCUDU 的初始 26.04 版本亦保留 GEO NTN 能力。2026 年 7 月期間 dev 分支密集合併 SIB19 廣播、TN/NTN 鄰區資訊、衛星切換、饋電鏈路 timing advance 與動態 SIB19 更新等擴充,是 NTN 實作快速演進與協定正確性加固的階段。

我沿用前述缺陷變體分析方法,對這條剛落地的 NTN SIB19 更新路徑(du_highdu_manager、MAC 排程與 ntn 數學)逐段稽核,辨識出 12 個缺陷、分屬五類:記憶體生命週期、環狀與規範時間邊界、數值退化與界限、錯誤處理與交易性、狀態失同步。這與我在 Kubernetes 上的 int64 溢位家族是同一種方法,換到 5G NTN 協定棧。

這 12 個缺陷的處置在 8 月中有實質進展:!1153 經 SRS review 縮為單一 use-after-free 修正、合併至 dev,關閉 #643、計入 Found & Fixed(見下方縱深一);其原一併提出修的另 6 項(#652/#653/#654/#655/#656/#657)在 review 中被移出範圍、修正未落地、issue 仍開。!1242 已合併,關閉 #695 的 SI-window 計算、計入 Found & Fixed。!1162#658 全 0 廣播)仍審查中、需 rebase。!1096 的 SIB19 epoch numerology 部分已合併、但未關聯本稽核任一 issue;其原含的 #649 修正因與 dev 重複而撤回、issue 仍開。#659 的 epoch off-by-one 修正(!1163 → !1241)皆未合併、issue 已由維護者關閉。#660 亦由維護者關閉。#643、#695 計入 Found & Fixed,!1153/!1242/!1096 計入 Merged PR;其餘均未計入。

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

SIB19 更新路徑將指向區域 std::vector<byte_buffer> 的 non-owning span,連同對區域 request 的 reference,交給延後執行的 coroutine。原始 handler 返回後,request 與 span 的 backing storage 均已失效,使後續 DU update procedure 與 MAC reconfiguration 讀取已釋放的記憶體。

已合併的 !1153 將 SI message buffers 改為由 request 持有(spanstd::vector<byte_buffer>),並以 value/move semantics 端到端傳遞至 coroutine 與 procedure。新增的端到端回歸測試經 ASan 驗證:修正前觸發錯誤、修正後通過;另以 mutation testing 分別還原 reference capture 與 non-owning span,確認測試能獨立捕捉兩條生命週期失效路徑。此 MR 由維護者 Piotr Gawłowicz approved、合併至 dev,關閉 #643、計入 Found & Fixed。

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

#653#654#655#657 不是四個孤立缺陷,而是同一條 NTN parameter update 程序端到端缺乏錯誤處理與交易性的四個面向:佇列滿時靜默丟棄、失敗留半套狀態且不 rollback忽略失敗回傳報假成功、MAC 多 PDU 中途失敗不回滾。逐段稽核比逐個修 bug 高一階之處,正在於指出這種系統性的品質缺口,而非只撿到四個 bug。此四項未含於已合併的 !1153 最終範圍,仍為回報中、待後續 MR。

另記兩項(不計入上列 12 個)

#642 epoch_time 設定契約:serving-cell 的 epoch_time 文件化為 SIB19 EpochTime 的覆寫值,但 build_sib19_info 從未讀取;因同一 epoch 亦用於 ephemeris propagation,宜整體處理。目前等待維護者決定完整實作 override 或移除欄位並保留 epoch_sfn_offset

#633 CI 供應鏈(非 NTN 協定):CodeChecker CI builder 釘 6.26.1,其 bundled ldlogger 受 CVE-2025-40843 影響(6.26.2 已修);現行 CI 使用 analyze/parse、未觸及受影響的 CodeChecker log,屬預防性升版與供應鏈衛生。

已合併的 OCUDU NTN 修正(計入 Found & Fixed)

這次稽核延續我在同一 NTN 子系統的既有貢獻。OCUDU 維護者先前已合併兩項由我回報並修復的 3GPP Release 17 邊界問題:!1045(為 --k_mac 加入 kmac-r17 1–512 的 CLI 驗證,關閉 #577)與 !1047(驗證 ta_common + ta_common_offset 落在 taCommon-r17 0–66485757,關閉 #579)。兩者已合併至 dev 分支、計入 Found & Fixed(見 Issues)。

Kueue · Resource transformation

Kueue 配額會計正確性稽核

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

Kueue 依 config 的 resourceTransformations/deviceClassMappings 換算資源、再連同 PodSet 請求計入配額。我以「設定要先驗證、charge 計算不得靜默失真、且結果可重現」為不變量,對 validateResourceTransformations/validateDeviceClassMappings/applyResourceTransformations/validatePodSet/ResourceValue 這條路徑逐段稽核,目前辨識出七個缺陷:負係數做減法、保留名未擋、撞名非決定性、Retain 保留乘積、spec.overhead 漏驗、正積 int64 截斷 wrap、extended-resource 替換連坐刪除。方法同我在 Kubernetes int64 溢位家族與 DRA 跨廠商稽核。

以下皆本人自報。五項已由本人的 PR 修好合併(#13986 一發三修、#13989#14042),已計入 Merged 與 Found & Fixed。另兩項尚未計入:一項修正 PR 仍在審查(#13995),一項尚無修正。

Audits in flight

進行中的系統性稽核

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

同一套「從一個缺陷抽象出審查不變量、再跨路徑追同一失效模式」的方法,仍在下列元件上進行。上方四區是已收斂的稽核;這裡是仍在飛的,多數為已回報、部分修正已合併或在上游審查中。每條標注「回報/已修」並附各 repo 的完整清單以供逐筆查證。