蔡秀吉 Hsiu-Chi Tsai

Open Source

上游系統工程

我沿著系統不變量追查資源會計、生命週期與並行錯誤,建立可重現的失效案例與回歸測試,並把修正送進 Kubernetes、OpenTelemetry、Kueue 與其他上游專案。

CNCF Ambassador · Kubernetes v1.38 Release Team(Release Signal Shadow) · Nephio (LFN) TSC Member · OpenTelemetry GitHub Org Member · Zephyr M5Stack Platforms Maintainer

同一套不變量方法,目前已追出四條跨專案/跨路徑的缺陷家族:

  1. 資源會計 int64 溢位 Kubernetes · Kueue · Volcano · KAI-Scheduler · CDI · KEDA 12 變體 · 11 merged
  2. DRA 跨廠商 result 守衛 NVIDIA · Intel · IBM · AMD · Google 9 driver · 8 org
  3. NTN SIB19 路徑交易性 OCUDU(srsRAN 後繼) 12 缺陷
  4. Kueue 配額會計驗證 kubernetes-sigs/kueue 7 缺陷

開源貢獻摘要

Merged
385 PRs
Upstreams
99 projects
End to end
97 found & fixed
Foundations
10

Representative campaigns

三條代表工作

從一個缺陷抽象出審查不變量,跨專案追蹤同一失效模式,再把每個修正一路推到上游合併並附回歸測試。

Resource accounting

跨專案追蹤資源會計不變量

從 Kubernetes DRA 的一個 int64 溢位出發,把根因抽象成可重用的審查不變量(加總、乘法、型別轉換不得溢位/截斷/漏算/重複扣款),再檢查 Kueue、KAI-Scheduler、Volcano、CDI 等實作。Kubernetes 為 Quantity 開的 int64 burndown(#141166)另有 12 支合併。

Failure class
溢位、截斷、漏算、重複扣款、型別邊界
Method
不變量提取、邊界構造、跨專案 variant search
Outcome
12 變體、6 上游、11 修正合併
Evidence
每項附 issue、patch 與失效路徑回歸測試

Representative evidence

  1. kubernetes/kubernetes #140442拒絕無法表示的 consumable-capacity 請求(int64 溢位)
  2. kubernetes/kubernetes #140666擋掉無法使用的 validRange(除零)
  3. kueue #12897拒絕加總會溢位 int64 的 device counts
  4. kubernetes/kubernetes #141305Quantity 新增可判斷溢位的 accessor
  5. kueue #15026用量越過 int64 仍精確,不再撞上「無上限」的哨兵
閱讀完整變體分析

Async lifecycle

OpenTelemetry C++ 的非同步生命週期

依「失效契約」整理匯出路徑的正確性:連線生命週期(erase 後仍存取 → use-after-free)、完成同步(lost/spurious wakeup)、終端事件契約(一個 operation 被結算 0 次或 2 次)。

Failure class
use-after-free、lost wakeup、重複/零結算
Method
契約定義、失效路徑構造、race 下重現
Outcome
12 筆修正合併(至 2026-09-30)、含 race 回歸測試
Evidence
附最小重現與契約測試

Representative evidence

  1. opentelemetry-cpp #4289HttpServer 於連線關閉後仍寫 response(use-after-free)
  2. opentelemetry-cpp #4298ES exporter 無述詞等待致 lost-wakeup 永久阻塞
  3. opentelemetry-cpp #4363curl client 讓每次操作恰結算一次
  4. opentelemetry-cpp #4431一個 curl session 只送一個請求,重用不再毀掉執行中的 operation
  5. opentelemetry-cpp #4618curl operation 最後結果碼的資料競態(TSAN)
看 opentelemetry-cpp 合併紀錄

NTN transactionality

OCUDU NTN SIB19 更新路徑的交易性

把 NTN SIB19 更新當成一筆交易來看,十二個缺陷都落在同一條路徑上:coroutine 非持有 reference/span、bounded queue 背壓、部分提交無 rollback、忽略失敗回傳、環狀時間邊界、SI assembler 狀態失同步。

Failure class
懸空 reference、背壓、無回滾、忽略回傳、時間邊界
Method
以「單筆交易」重述整條更新路徑
Outcome
12 缺陷分五類、修正 MR 陸續合併
Evidence
含幾何邊界 sweep 與跨最佳化等級測試

Representative evidence

  1. ocudu !1097 (GitLab)eci_to_orbital 的 acos 引數浮點越界 → NaN 汙染整組軌道要素
  2. ocudu !1045R17 kmac-r17 CLI 邊界驗證(自報自修)
  3. ocudu !1047R17 taCommon 邊界驗證(自報自修)
閱讀完整 NTN 稽核

Security

安全修復

兩則私下回報、已發佈且具名的 advisory,以及一個從根因修到整個相依圖的遠端 DoS。

已發佈且具名的 advisory

私下回報、由維護者修好並發佈 advisory,兩則的 credits 欄都具名為回報者、狀態 accepted。兩則目前都還沒有 CVE,也都還沒進 GitHub 全域 advisory 資料庫與 OSV;repo 已發佈不等於全域收錄。Istio 的修正已隨 1.30.4 與 1.29.7 出貨;Volcano 的修正亦已隨 v1.15.2 於 2026-08-29 發布。

BackendTLSPolicy 在 CA 參照解不出來時,sidecar fail open 成明文

加密與 CA 驗證同時失效且無聲,gateway 則 fail closed。CVSS 6.8(C:H/I:H)· ISTIO-SECURITY-2026-006 具名致謝 · CNCF Graduated

✓ Published

DRA 容量會計的迭代量隨租戶可控的數字成長,可癱瘓整個叢集的排程

CWE-400 經由 CWE-834。修正在私有 advisory fork 內開發,再以 #5869 公開落地。CVSS A:H · CNCF Incubating

✓ Published

一個遠端 DoS,從根因修到整個相依圖

在 insomniacslk/dhcp 的 nclient4 找到一個遠端可觸發的 DoS:修好根因、補上回歸與 hardening、向 Go 漏洞資料庫提報,並把修復沿相依圖推進到下游。

  1. Found · 遠端可觸發 DoS

    BroadcastRawUDPConn.ReadFrom 計算 DHCP payload 長度時,沒先確認 IPv4 payload 裝得下 8-byte UDP 標頭;畸形短 frame 會算出負長度、進到 slice 操作而 panic。任何走預設 broadcast/raw 路徑的 DHCP client 都打得到。

  2. Root fix · PR #583 merged

    IPv4 payload 長度不足以容納 UDP 標頭時直接拒收(ipPayloadLen < udpHdrLen 先 continue)。merge commit c76316d4、2026-07-20。

  3. Regression + hardening in review

    #588 為該路徑加 fuzz target,以獨立 reference model 驗證接受或拒絕每個 frame 的契約;#589 在回傳 DHCP payload 前驗 UDP length;#591 拒絕 raw receive path 的 IPv4 fragments。三筆皆在審查中。

  4. Reported · golang/vulndb #6237 triaged · high-priority

    向 Go 安全團隊正式提報。high-priority 是 Go vulndb 的工作流優先級(=需要一份 reviewed report),不是 CVSS 嚴重度。

  5. Advisory · GO-2026-6237 published · 2026-08-18

    Go 安全團隊的 REVIEWED 報告已合併進 vulndb(CL 816561 landed、#6237 已關,commit cc7648d)。2026-08-18 已正式發佈:vuln.go.dev/ID/GO-2026-6237.json 與 pkg.go.dev/vuln/GO-2026-6237 現在都查得到。仍不是 CVE(OSV aliases 為空)。advisory 的 credits 欄目前也是空的,具名請求 golang/vulndb#6251 還開著。

Selected upstream work

代表貢獻

依問題領域整理(基金會分布見 Ledger)。上方代表工作與安全修復列過的不在此重複;完整 385 筆在 Ledger。

規格與計費規則

KEP-2941:DRA firstAvailable 請求的配額計費規則

這支改的是 KEP 的規格文字。Alpha 要求每個 alternative 指向同一個邏輯資源且數量相同,因此只計費一次;kube-scheduler 只會選中其一而成本相同,這一次計費即等於它選到的那個。數量不同者於 Alpha 拒絕,配置後再調整保留額列為 Beta 條件。兩個月、133 則 review。Alpha 實作 #14130 隔天合併。

✓ Merged

Remote-Write 2.0 規格:只帶 exemplar 的 TimeSeries

規格要求每個 TimeSeries 至少有一個 sample 或 histogram,但 Prometheus 實際會送出只帶 exemplar 的 TimeSeries;改兩句規範文字與 proto 註解,欄位與線上格式不動。krajorama 以 OpenTelemetry 相容性要求修改,補上事實之後由他 approve 並合併。

✓ Merged

並行與生命週期

ESP32 的 dma_stop() 在 GDMA 仍在寫入時就返回

I2S 的 stop 路徑於是釋放 DMA 還在填的 block,DROP 則每次漏一塊,耗盡後 i2s_write() 永遠等下去;stop 改為 reset channel,AXI channel 統一走 abort 握手。兩個月審查,sylvioalves 在 ESP32-P4 上實測。

✓ Merged

StatefulSet 穩態更新不得反覆排入 LeaderWorkerSet reconcile

&& 優先於 ||,原 guard 因而退化成只檢查 CurrentRevision 是否為空;改為兩個 revision 皆存在且不同時才視為 rollout,並手動帶回 release-0.19/0.18。

✓ Merged

正在被逐出的 slice 不得當 chain 的 active slice

否則 ungater 依正在釋放的容量放行過多 pod。

✓ Merged

跨 driver 與 API 穩定

多 driver ResourceClaim 的 result 守衛

只處理自家 driver 的 result,補回官方 example-driver 本有的守衛。

✓ Merged

workload-slice 相容路徑套用 priority-class 變更

相容分支提早 return、略過唯一套用優先權處,改為也套用(Closes #13778)。release-0.19 自動 cherry-pick;0.18 套不上,手動改寫後以 #13872 帶回。

✓ Merged

平台能力與安全預設

FOCOM 的 Porch client 沒有驗證 API server 憑證

PORCH_HTTPS_VERIFY 不是字串 "true" 就關掉驗證,出貨的兩份 manifest 都設成 "false",operator 的 service account token 於是送上未經認證的連線;改成預設驗證、opt-out 改名。CWE-295。

✓ Merged

Argo Workflows 的 DRA resource claims

WorkflowSpec 與 Template 新增 resourceClaims 並一路帶到 pod,原本只能用 podSpecPatch 手寫;實作自本人的提案 #16576,lead maintainer Joibel 合併。

✓ Merged

Under review

進行中重點

只列仍在上游審查中的,合併後移入 Ledger。完整即時清單見 Ledger 或 GitHub。

kubernetes-sigs/kueue

  • #13904每次 reconcile 只解析一次 WorkloadPriorityClassmszadkow lgtm

kubernetes/kubernetes

  • #142355ResourceSlice 的分數容量以值比對、不比字串,也修掉 semx 回報的 #142489pohly 解除 hold
  • #142322LimitRanger 的 limit 對 request 比例在任何 scale 都比得對semx 驗過兩端守衛
  • #141327kubelet 的 CPU 換算在 int64 邊界不再 wrap等 tallclair 終審
  • #141328scheduler NodeInfo 的加總飽和而不 wrap已 lgtm,等 approve
  • #141971getent 不在 PATH 時退回 os/userhold,等 #141345
  • #141982userns 測試 fixture 停在驗證之前rata hold

kubernetes/website

  • #57699Limit Ranges 文件補上更新時不再重新檢查的範圍等審

open-telemetry/opentelemetry-cpp

  • #4502Elasticsearch async export 的結果只回報一次,修自報的 #4338om7057 審查中
  • #4337Elasticsearch async ForceFlush 的 deadline 與完成計數draft

zephyrproject-rtos/zephyr

  • #120492esp32 legacy 路徑先數 descriptor 再串wmrsouza approve
  • #120476mipi_dbi 測試的 MULTIPLE_INSTANCES 改成 Kconfig optionJarmouniA、danieldegrasse approve
  • #120491nrfx 配不到 RX buffer 時歸還 TX block審查中

上游狀態最後核對: