FR-088 · 需求索引 · 本頁由 build 掃資料夾生成

FR-088 流程引擎(jedi-flow-engine)資安檢查

🟡 已開卡待派(2026-09-12 首腦讀碼切六棒、母子卡一次建完 CM-1669~1675)。套件 72 檔+宿主 92 檔,切成六棒共 150 檔(宿主四棒 78 檔、套件兩棒 72 檔);第 1 棒 CM-1670 待決策者發令。一次只派一棒。

狀態:🟡 進行中 文件 0 份

🔴 一頁看完

還沒掃。 首腦讀完程式碼,切成六棒、卡開好了,等決策者發令派第一棒。

讀碼時看到的三個最值得先驗的疑點(未經工具驗證,行號已開檔核對):

  1. 推進/回退稽核階段時,「專案編號」與「輪次編號」各查各的、從不核對彼此——專案編號只用來查你的角色、輪次編號只用來找流程。若成立:A 專案的管理者帶自己的專案編號+B 專案的輪次編號,就能推進或回退 B 專案的稽核。
  2. 流程留言與任務證明「讀」完全沒守門:只驗登入,不驗你是不是該專案的人。而這幾張表的資料庫隔離全關、job_evidences 連租戶欄位都沒有——猜到一個編號就能讀(留言還能寫)別家客戶的資料。與 FR-086 檔案存取同一個病
  3. 推進請求裡的 force 旗標有兩個版本:權限檢查看外層的、實際做事的 handler 讀 ctx 裡的。外層填 false、ctx 裡填 true,非管理者可能跳過「規劃就緒檢查」啟動稽核。

資料庫層實況(DEV 唯讀實查):流程相關 10 張表只有 1 張隔離是開的,其餘 9 張關閉,其中 3 張連租戶欄位都沒有。FR-087 只盤了其中 3 張,另 7 張是本 arc 新增的實況。

§1

這在做什麼(白話)

產品裡每一個稽核專案都是照一張「流程圖」在跑:規劃 → 稽核 → 改善 → 結案。每個階段誰能按「推進」、按了之後系統要做什麼,都由「流程引擎」決定。它也負責讀寫流程圖本身(BPMN 格式的 XML 檔),以及每個任務的完成、退回、留言、證明文件。

這個 arc 要回答三個問題:① 有沒有辦法操作別家客戶(或別的專案)的流程與任務?② 有沒有辦法用一張惡意流程圖把系統弄掛?③ 流程資料在資料庫層有沒有隔離兜底?

§2

為什麼掃它

  • 從未掃過。跨 arc 總表 §4 排它第一:「風險密度最高——XML 解析與授權缺口同時存在,真正的端點全在宿主」。
  • 宿主比套件本體還大:套件 72 檔(攻擊面口徑,排除測試與 3 個 BPMN 範例後 69 檔 .py),主專案宿主接線 92 檔(總表原估 60~80)。套件自陳 0 route,19 條 live route 全在主專案。授權判定全在宿主那半邊——與 FR-077/078/079 同型。
  • 首腦讀碼看到的疑點密度高(見上方三點與各子卡「重點看什麼」)。
§3

資料庫層實況(DEV,2026-09-12 唯讀查)

隔離開關 規則數 有租戶欄 筆數 備註
compliance.flow_templates ✅ 開 4 12 本 arc 唯一開的
compliance.workflow_templates ❌ 關 4 17,206 規則寫好但關(FR-087 第 2 項);191 筆凍結副本無租戶
compliance.workflow_executions ❌ 關 3 10,944 缺 SELECT 規則(FR-087 第 4 項)
compliance.job_executions ❌ 關 0 10,783 03:10 排程依賴 CM-1559 fail-open(FR-087 第 5 項)
compliance.element_variables ❌ 關 0 3,011 流程留言存這裡
compliance.job_evidences ❌ 關 0 782 任務證明
compliance.project_audit_rounds ❌ 關 0 41 project_id 欄但服務層從不核對
compliance.stage_objects ❌ 關 0 階段定義(平台層,可能刻意)
compliance.round_stage_transitions ❌ 關 0 階段歷程
compliance.workflow_templates_trans ❌ 關 0 5,749 翻譯表
§4

怎麼切六棒(按業務功能垂直切,不按層切)

順序 範圍 檔數 scanRoot 為什麼獨立一棒
1 H2 任務完成/回退/留言/證明 api/flow_engine/(除範本與階段 route)+job_evidence_servicecommon/authz/workflow.py+證明的 domain/infra 23 BE repo 門檻最低:只要登入+猜編號;守門檔檔頭自陳「原本任何 JWT 持有者猜出 id 即可跨租戶操作」,補的守門只補了寫
2 H1 稽核階段推進與回退 stage_advancestage_rollbackstage_object 三條鏈+oscal_stage_* handler+registry 21 BE repo 改變稽核狀態的最高權限操作;專案↔︎輪次不核對、ctx.force 雙版本
3 P1 流程圖範本與 BPMN 解析 jedi_flow_engine/common/+範本鏈 10 檔 30 jedi monorepo jedi-flow-engine/ XML 解析安全判準不同(解析炸彈、深度、實體);三支吃檔案路徑的方法
4 H3 流程範本管理 flow_template_routeflow_template_app_servicesnapshot_service+範本 domain/infra 13 BE repo 惡意 XML 的入口;本 arc 唯一隔離開著的表;凍結副本無租戶的成因
5 H4 流程執行宿主服務與接線 1,559 行 workflow_execution_service+DI+儀表板申報+控制項對應 21 BE repo 守門與反查鏈的實作;三支申報給 AI 儀表板的 **kwargs 查詢
6 P2 流程執行核心 套件其餘 42 檔(執行/任務/變數三條鏈+plugin) 42 jedi monorepo jedi-flow-engine/ 零守門是設計;要做「公開方法 vs 宿主守門」對照表

排序判準是「可利用門檻」不是嚴重度標籤(決策者 2026-09-12 定的判準)。一次只派一棒。合理停損點在第 3 棒之後(74 檔已涵蓋門檻最低與解析面),但沒跑完六棒不能宣稱「jedi-flow-engine 掃過了」。

接縫:H2 的守門政策檔 ↔︎ H4 的 assert_project_participant/反查鏈(同一條鏈兩端,互相允許越界讀);P1 的 BpmnUtils ↔︎ P2 的執行 service(P2 只看餵進去的是什麼,不重審解析器);H1 的 complete_main_workflow_job 住在 H4 檔內。

檔數核對:總表寫「套件 80 檔/宿主約 60-80」,實際 git ls-files 套件 72(含 3 個 .bpmn 範例)、宿主 92。六棒合計 150 檔覆蓋宿主 78+套件 72;宿主未入棒的 14 檔全是空 __init__.py 與一支 deprecated shim(common/util/workflow_project_guard.py,2 行 re-export)。

§5

進度

面板 發現 報告
H2 任務完成/回退/留言/證明 CM-1670 23 ⬜ 待派
H1 稽核階段推進與回退 CM-1671 21 ⬜ 待派
P1 流程圖範本與 BPMN 解析 CM-1672 30 ⬜ 待派
H3 流程範本管理 CM-1673 13 ⬜ 待派
H4 流程執行宿主服務與接線 CM-1674 21 ⬜ 待派
P2 流程執行核心 CM-1675 42 ⬜ 待派
§6

修正卡

(掃完驗收後才會有。依決策者裁定,修正卡先不開,發現登記進跨 arc 總表 §3。)

§7

座標

  • 套件:~/Projects/Jedicogy/module/jedi-python-package/jedi-flow-engine/(scanRoot 指此子目錄,與 FR-086 B1 同做法)
  • 宿主接線:api/flow_engine/app/flow_engine/domain/flow_engine/infra/flow_engine/di_containers/flow_engine/di_containers/dashboard_apis/flow_engine.pycommon/authz/workflow.pyapp/flow_control/service/oscal_stage_*.py
  • 相關前案:CM-1559(無身分時隔離全關)、FR-087 T1(workflow_templatesworkflow_executionsjob_executions 三張表與 191 筆無主凍結副本)、FR-083 D2(儀表板 27 支零守門)、FR-079 F13(**kwargs 掉租戶過濾)、FR-086(四層全空的檢查清單)
  • 首腦手冊:.claude/skills/security-scan-lead/SKILL.md
  • 跨 arc 總表:security-scan-consolidated/
  • 現況:FR-075/handoff/security-scan-STATE.md
§8

Notion 卡

卡片內容(決策紀錄、驗收條件)以 Notion 為準,本頁只記座標。

關係 卡號 標題 狀態
母案 CM-1669 FR-088 流程引擎(jedi-flow-engine)資安掃描(六棒 150 檔,只掃不修)
子卡 CM-1670 H2 任務完成/回退/留言/證明(23 檔,BE repo) Not started
子卡 CM-1671 H1 稽核階段推進與回退(21 檔,BE repo) Not started
子卡 CM-1672 P1 流程圖範本與 BPMN 解析(30 檔,jedi monorepo) Not started
子卡 CM-1673 H3 流程範本管理(13 檔,BE repo) Not started
子卡 CM-1674 H4 流程執行宿主服務與接線(21 檔,BE repo) Not started
子卡 CM-1675 P2 流程執行核心(42 檔,jedi monorepo) Not started