本卡屬 FR-195(Agent 資安修正),第 1 批 F1。修 FR-186 掃描的 S7 F1(3/3 票)+舊觀察 O1,嚴重度:高。

這張卡做什麼(白話)

升級時,主機會把新映像裡的 Agent 程式樹取出來,叫現行版 Agent 逐檔算雜湊、跟原廠簽章清單比對,過了才讓 root 執行新版的升級腳本。現在的比對只「照清單逐檔算」,而且算雜湊時會跟著捷徑檔(symlink)走,清單外多出來的檔也完全不看。攻擊者可以把清單上的 upgrade_runner.sh 換成捷徑、指向樹裡另一個清單沒列的檔:驗章時看到的是正版內容,但主機驗完之後又從映像重新取一次腳本來執行,那次取到的可以是另一份。這張卡把入口封住:樹裡只要有捷徑檔、特殊檔、或清單沒列的檔,驗章直接不過。

問題在哪(行號首腦 2026-11-11 對主線 b8b1158 重核過,仍然有效)

改哪些檔

guidant_agent/platform/agent_tree_verify.py
common/integrity/startup_gate.py
test/test_agent_tree_verify.py

怎麼做

行為變更

正版升級包不受影響(已實查)。被拒的只會是被動過手腳的映像,錯誤訊息出現在升級進度與 Agent 主控台的升級失敗原因。

要補的測試

在 test/test_agent_tree_verify.py 加三支簡單斷言(各五行內,沿用檔內既有的 _tree() 建樹 helper):①清單上的檔換成指向樹內另一個檔的捷徑 → 回 EXIT_REJECTED;②樹裡多一個清單沒列的一般檔 → 回 EXIT_REJECTED;③樹裡多 __pycache__/x.pyc 與 manifest.json → 照樣通過。這是「驗章不變量」,屬於准寫測試的那一類;不要寫突變表、不要再多。

跑測試的方法(首腦實測過,照抄)