本卡屬 FR-195(Agent 資安修正),第 2 批 F2。修 FR-186 掃描的 S1a F1(3/3 票);K2 F1 同一條,嚴重度:中。
Agent 會向主系統登記一個「本機對外位址」,主系統的人按「開啟主控台」時,登入用的一次性入場券就送到這個位址。現在只要有一般的維運權限(ops.update)就能把這個位址改成任何 https 網站。攻擊者改成自己的網站後,等權限更大的人按「開啟主控台」,入場券就落到他手上,五分鐘內拿去登入就變成那個人。改成跟「更換主系統」同一套規矩:只有本機管理員能改,而且要再輸一次本機管理員密碼。
b8b1158 重核過,仍然有效)guidant_agent/console/api/ops_routes.py:129-143 put_base_url 只掛 @require_session("ops.update"),沒有本機管理員限制,也不要求密碼。guidant_agent/console/api/cloud_change_routes.py:90-98 cloud_change_apply:@require_session(...) 之下疊 @local_admin_only,再 local_auth.check_password(LOCAL_ADMIN_SUB, fields.get("password", "")),錯了回 BadRequestError(Err.PASSWORD_WRONG)(回 400 不回 401,因為前端收到 401 會當成 session 失效而登出)。check_password 本身會累計失敗與鎖定,不用另外做。local_admin_only 定義在 guidant_agent/console/api/ldap_routes.py:28,cloud_change_routes.py 已經在 import 它。guidant_agent/console/api/ops_routes.py
test/test_console_ops.py(只動 `TestBaseUrlRoute` 這個 class)
put_base_url 在 @require_session("ops.update") 下面加一行 @local_admin_only(從 guidant_agent.console.api.ldap_routes import,cloud_change_routes.py 檔頭有現成的 import 寫法可抄)。password 欄(字串、長度上限比照同函式的 512)。在呼叫 enroll_service.change_base_url_from_console 之前驗:if not local_auth.check_password(LOCAL_ADMIN_SUB, password): raise BadRequestError(AgentCloudChangeErrorCode.PASSWORD_WRONG)。錯誤碼沿用 common/code/agent_error_code.py:62 那顆 PASSWORD_WRONG(AGENT_CLOUD_CHANGE_PASSWORD_WRONG,訊息「本機管理員密碼不正確」),不新增錯誤碼——新增就要動錯誤碼表與前端對照,這張卡不需要。import 名稱照 cloud_change_routes.py 檔頭那個 Err。password 不進 log、不進稽核(比照 cloud_change_routes.py 檔頭紅字)。enroll_service.py:守門在路由層就夠。CLI 那條(guidant-agent-ctl set-base-url)是主機 root 在跑,不經這支路由,不受影響。put_base_url 現在 13 行,加完仍遠低於 60 行上限。ops_routes.py 279 行,低於 800。主控台「改本機對外位址」:非本機管理員會收到 403(AGENT_CONSOLE_LOCAL_ADMIN_REQUIRED);本機管理員沒帶密碼或密碼錯會收到 400。畫面要配合改(下一張卡 F2-FE,同一批);這張卡只做後端,後端先合回時畫面按儲存會收到 400「本機管理員密碼不正確」,不會壞資料。
首腦試做過:改完只有 1 支既有測試變紅——test/test_console_ops.py:561 TestBaseUrlRoute::test_change_and_errors(它用一般 ops.update 身分改位址成功)。把它改成用本機管理員身分登入(sub 是 local-admin,寫法參考同檔其他用 local-admin 的測試)並在 body 帶 password,密碼檢查用 monkeypatch 讓 local_auth.check_password 回 True。同一個 class 的 test_needs_ops_update(:564)不用改。另加兩支:有 ops.update 但不是本機管理員 → 403 AGENT_CONSOLE_LOCAL_ADMIN_REQUIRED;密碼錯 → 400 且 change_base_url_from_console 沒被呼叫。第 1 批的 F3 已經改過這個測試檔 :92 附近的 fixture(假工具位址換成本機迴路),行號可能位移幾行,以 class 名稱 TestBaseUrlRoute 為準。