本卡屬 FR-077(母卡 CM-1591),修 R1(CM-1592)的 F6,並承接卡片「重點看什麼」①(enroll token 生命週期)。面板未跑成,runner 開檔核對+首腦複核屬實。MEDIUM(需持有租戶 enroll token)。與 CM-A 卡動同一支 agent_enrollment_service.py——序列做,A 先。

問題是什麼(白話)

客戶裝 agent 時,安裝程式裡帶一組「報到通行碼」(enroll token)。它是整個租戶共用一組、永不過期、無次數上限、不綁機器——業界(Elastic enrollment token、Kubernetes bootstrap token)的通行碼都是短效或一次性的,我們的等於永久通行證。

更糟的是註冊時可以宣告「我是編號 X 那台」:程式只檢查「X 屬於這個租戶」就允許覆寫 X 那一列——包括 base_url。於是拿到通行碼+知道另一台的編號(管理頁看得到),就能把那台的網址改成攻擊者主機;之後雲端向那台取資料(reconcile、取檢測報告)會打到攻擊者那裡,簽給那台的短效 JWT 也送過去。

Runner 核對到一個細節值得記:_guard_fingerprint_collision() 的 docstring 記載 2026-08-21 修過一個判定錯誤,那次修正是對的,但它修的是「VM 複製品憑指紋冒充」;本條走的是被豁免的那條路徑(matched_by_uid=True),豁免條件只有「說得出 uid」+「同租戶」,沒有持有證明。註解沒錯,只是回答的不是這個問題。

首腦核對:

在哪裡

~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/app/service/agent_enrollment_service.py:94-99     _resolve_agent():憑 uid+同租戶即 matched_by_uid=True
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/app/service/agent_enrollment_service.py:186-272   register():驗 token → resolve → 覆寫
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/app/service/agent_enroll_token_service.py           generate()/revoke()/get_current()
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/domain/remote_agent/service/remote_agent_enroll_token_domain_service.py   get_enabled_by_hash()
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/infra/remote_agent/model/remote_agent_enroll_token.py   要加欄位
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/migrations/                                         隨包 migration 加一支
~/Projects/Billows/Audit-Manager/compliance-manager-be/scripts/sql/                                        主專案對應 migration(只套 DEV)

怎麼修

要寫測試