本卡為 FR-088 母案。用 claude-security plugin 掃「流程引擎」這支套件與它在主專案的宿主接線,六棒共 150 檔,只掃不修。子卡清單在末段。
產品裡每一個稽核專案都是照一張「流程圖」在跑:規劃 → 稽核 → 改善 → 結案,每個階段誰能按「推進」、按了之後系統要做什麼,都由這支「流程引擎」決定。它也負責讀寫流程圖本身(一種叫 BPMN 的 XML 檔),以及每個任務的完成、退回、留言、證明文件。
這個 arc 要回答三個問題:① 有沒有辦法操作別家客戶(或別的專案)的流程與任務?② 有沒有辦法用一張惡意流程圖把系統弄掛?③ 流程資料在資料庫層有沒有隔離兜底?
plugin.py 自陳 0 route),19 條 live route 全在主專案 api/flow_engine/。授權判定全在宿主那半邊——與 FR-077/078/079 同型。flow_templates 一張隔離是開的;workflow_templates(規則寫好但開關關)、workflow_executions(缺查詢規則且關)、job_executions/element_variables/job_evidences/project_audit_rounds/stage_objects/round_stage_transitions 全部關閉且零規則,其中 job_evidences、element_variables、project_audit_rounds 連租戶欄位都沒有。FR-087 只盤了前三張,其餘是本 arc 新增的實況。round.project_id。若成立:A 專案的管理者帶自己的專案編號+B 專案的輪次編號,就能推進或回退 B 專案的稽核。(H1)ctx 是使用者自由填的字典,而 force 旗標在裡面有兩個版本:service 檢查的是外層 force(非管理者會被擋),但 handler 讀的是 ctx.force——外層填 false、ctx 裡填 true,非管理者就能跳過「規劃就緒檢查」啟動稽核。(H1)job_evidences 連租戶欄位都沒有——猜到一個流程編號就能讀(甚至寫)別家客戶的留言與證明清單。(H2)validate 端點任何登入者都能丟任意 XML 給解析器。解析用的 xmltodict 0.14.2 預設擋實體展開(已核對),但沒有大小與深度上限;同一支套件另有三支「吃檔案路徑」的匯入匯出方法,主專案零呼叫者。(P1/H3)is_admin 放行、role_service 沒注入就放行(common/authz/workflow.py:34-43,註解自稱「背景任務安全」)——與 CM-1559 fail-open 同一個思路。(H2)**kwargs 形狀的分頁查詢,並向 AI 儀表板申報了三支查詢 API——FR-079 F13 證實過「申報成 **kwargs 所以租戶過濾被默默丟掉」這個機制還活著,FR-083 D2 證實儀表板那條路 27 支零守門。(H4)common/authz/workflow.py。第一棒。ctx.force 雙版本、階段歷程 GET 零守門。需要某個專案的管理者身分。