本卡屬 FR-195(Agent 資安修正),第 2 批 F9。修 FR-186 掃描的 I1 F1(2/3 票)、I1 F2、I1 F4(3/3 票)、P1 F1(3/3 票)、C4 F1(3/3 票)、S7 舊觀察 O2,嚴重度:低。
六個各自獨立的小洞,都是幾行的修改,併成一張。每一項的問題與修法分開寫在下面。
b8b1158 重核過,仍然有效)guidant_agent/console/api/local_auth_routes.py:139 改密碼後 _store().create({...}) 換發新 session,guidant_agent/identity/app/session.py:95 issued_at=now 重新起算——被主系統停權、但撤銷傳不到 Agent 的人,可以靠反覆改密碼無限延長登入,繞過 FR-177 #220 加的 10 小時上限(session.py:116 now - sess.issued_at > SESSION_MAX_AGE_SEC)。guidant_agent/console/app/body_limit.py 的 json_body() 不看 Content-Type,同網域的惡意網頁可以用表單送出。guidant_agent/identity/app/local_auth.py:128-130 登入失敗把使用者輸入的帳號原樣寫進 log,:135-136 _valid_sub 只檢查型別與長度,沒擋換行——可以在 Agent 日誌偽造一行「登入成功」。guidant_agent/platform/error_tracking/__init__.py:71 sentry_sdk.init(...) 沒有關掉「帶區域變數」,SDK 預設會把出錯當下每一層函式的區域變數送出去;遮罩只認變數名字像不像祕密,保管工具帳密的主金鑰放在名叫 key 的變數裡,不會被遮。guidant_agent/sync/app/vulndb_sync.py:195-199 installed_date():本機漏洞庫清單壞掉時回 None,被當成「首次安裝」,降版檢查就放行——漏洞庫可以被退回原廠簽過的舊版。guidant_agent/console/api/local_auth_routes.py
guidant_agent/identity/app/session.py
guidant_agent/console/app/body_limit.py
guidant_agent/identity/app/local_auth.py
guidant_agent/platform/error_tracking/__init__.py
guidant_agent/scan/adapters/connectors/zap_client.py
guidant_agent/sync/app/vulndb_sync.py
對應的既有測試檔
session.py create 加一個選填參數 issued_at: Optional[float] = None,有給就用、沒給才用 now。local_auth_routes.py:139 換發時傳 issued_at=g.console_session.issued_at。另外在驗舊密碼之後加一條:新密碼等於舊密碼就回 400(沿用同檔既有的密碼政策錯誤碼,開工 grep common/code/agent_error_code.py 找「密碼」相關的既有碼,沒有合適的就用 BadRequestError 配 OLD_PASSWORD_WRONG 旁邊最接近的一顆,不新增錯誤碼)。body_limit.json_body():請求有 body 而 request.mimetype != "application/json" 就回 415(或沿用該檔既有的 400 錯誤,看現有寫法)。🔴 開工先 grep 主控台前端(compliance-manager-fe/console/,只讀)確認所有改狀態的請求都是送 JSON:grep -rn "FormData\|multipart" console/。檔案上傳類的路由若用 multipart,它們不該經過 json_body();確認後再改。若發現有改狀態的路由沒走 json_body(),列在回寫裡,不擴大範圍。local_auth.py _valid_sub:多一個條件 sub.isprintable()(換行、控制字元都會是 False)。error_tracking/__init__.py sentry_sdk.init(...) 加 include_local_variables=False,上面一行註解寫為什麼(「遮罩只看變數名,區域變數裡的金鑰(變數名 key)遮不到」)。跑 test/test_error_tracking.py:裡面有 test_frame_locals_masked 這類測試,行為變成「根本不帶區域變數」,斷言要跟著改成「事件裡沒有 vars」(正當修改)。vulndb_sync.py installed_date():分清「沒有資料」與「清單壞了」——current_link() 不存在回 None(首次安裝,照收);存在但 bundle_date 讀不到或解析失敗就 raise(開工看呼叫端怎麼處理例外,沿用該檔既有的錯誤型別,讓這一輪同步失敗並記 log,不要靜默放行)。A:改密碼不再延長 session 壽命,新舊密碼相同會被拒。B:主控台改狀態的請求要帶 Content-Type: application/json(前端本來就是)。F:本機漏洞庫清單壞掉時同步會報錯而不是重新下載舊版。其餘無感。