本卡屬 FR-114(母卡 CM-2019),CM-2035 範圍外順帶發現,決策者 2026-09-24 裁開。小卡,只改 BE。

問題是什麼(白話)

稽核流程頁上方的階段橫幅,會打「目前進度」查詢,回傳目前在哪個階段、推進條件、整體進度。這支查詢有核對「這一輪真的屬於網址上的專案」,但沒檢查「呼叫的人是不是這個專案的成員」——同公司任何登入帳號知道專案與輪次編號,就讀得到別的專案的稽核進度。

在哪裡(首腦核對過)

BE app/flow_engine/service/stage_advance_service.py (705 行)
  :82-87  get_current_stage_info::87 resolve_project_id_for_round 只核歸屬
  :93-100 「沒有當前階段」時提前 return——成員檢查必須放在這之前,否則這條路徑會跳過
  :582-590 _get_user_role:查 participant,沒有就回 None(目前只拿來判 user_can_advance,不擋讀取)
BE api/flow_engine/routes/stage_advance_route.py:37 呼叫點

怎麼修

驗證

做完要回寫報告

紀律

已完成修正

做了什麼:get_current_stage_info(稽核階段「目前進度」查詢,Banner GET 用)原本只核對「路徑上的 project_uid 是否真的擁有這個輪次」,沒核對「打這支 API 的人是不是這個專案的成員」——結果同公司任何登入帳號,只要知道別人的專案編號+輪次編號,就能讀到別的專案的稽核進度(目前在哪階段、推進條件、整體進度)。

怎麼修的:補上既有的專案成員守門 common.authz.project.assert_project_role,放在「歸屬檢查」之後、「沒有當前階段就提前回傳」之前(不能放後面,否則流程已結案的輪次會整條跳過這個檢查)。這支端點是讀取類的,所以放行所有角色(manager/reviewer/auditor/viewer),只擋「根本不是這個專案的人」。

commit:27079da21(fix/security-b1 branch,wt-fix-security worktree)