本卡屬 FR-114 資安修正(母卡 CM-2019),第 5 批子集 B 卡 5B-3,修 SUMMARY #16(M06-1)/#87/#88/#128(出自 M06-2/M06-3/M06-5)。#16 高,其餘中。修法規格來自內化卡 CM-1989,計畫在 docs/features/FR-114-2609-security-fix-dispatch/batches/plan-b5B.md「卡 5-B3」段。

問題是什麼(白話)

#16:有範本寫入權限的人存進一張特製的流程圖(分岔點繞回自己、或一路串接 40 個分岔點),之後只要有人打開那一輪稽核的頁面就會替攻擊者觸發——程式沿著分岔點往下走時不記得自己走過哪裡,伺服器一條處理程序算不完、不報錯也不留紀錄,同時打中四次整個產品對所有客戶停止回應(已實測證實)。不一定要有人存心,流程畫得太複雜的客戶可能無意間就做出同樣效果。

#87:只要有一筆範本的流程圖內容被寫成空字串,之後每一次讀到這筆資料的清單或詳細頁都會出錯、且不會自己恢復正常——要進資料庫修那筆才會好,受害的是其他正常使用者。根因是寫入端把「空字串」當成「沒有填」而跳過了驗證。

#88:只有「發布」那一支會檢查內容,新增與修改都不檢查——沒檢查過的內容存得進資料庫,#16/#87 講的惡意或壞掉的流程圖從這個門進來不會被攔;加上起輪次去複製範本時,取範本的查詢只過濾「啟用中」、沒過濾「已發布」,一份從沒檢查過的草稿也能被複製去啟動一輪真實的稽核流程。

#128:稽核流程推進/退回階段時,程式用「呼叫端沒填才補上真名」的寫法,呼叫端可以自己填一個名字(例如同事的名字),顯示在稽核歷程時間軸、流程圖留言與討論串的作者欄位上——真正代表身分的帳號欄位不受影響,但等於自己人偽造顯示名稱。

首腦核對:

工作區

在哪裡

jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:361    _get_jobs_from_exclusive_gateway,#16 治本核心,與 :276 互相呼叫成環
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:276    get_next_jobs
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:294,295    同一份清單算了兩次,需改成算一次傳進去
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:340    _get_exclusive_gateway_default_job,又算一遍
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:963    save_bpmn_to_file,全 repo 零呼叫死碼,依原則十五刪除
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:1220    export_xml,同上零呼叫死碼
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:1241    import_xml,同上零呼叫死碼
jedi-flow-engine/jedi_flow_engine/infra/mapper/workflow_template_mapper.py:21    讀取端無條件解析,#87
jedi-flow-engine/jedi_flow_engine/common/utils/bpmn_uilts.py:34    實際解析動作
jedi-flow-engine/jedi_flow_engine/infra/repository/workflow_template_repo_impl.py:49-56    add(),內含 :52 的 if entity.xml: truthy 判斷
jedi-flow-engine/jedi_flow_engine/infra/repository/workflow_template_repo_impl.py:58-66    update(),內含 :61 同樣寫法,兩處要一起改
jedi-flow-engine/jedi_flow_engine/app/service/workflow_template_service.py:158    update_workflow_template_xml,只把字串塞進 entity 就存,沒做拓撲檢查
jedi-common/.../base_repository_impl.py:424    「沒送=不要覆蓋」共用語意,唯讀理解不要改這支
compliance-manager-be/app/flow_engine/service/flow_template_app_service.py:67    create(),#88 目前不驗
compliance-manager-be/app/flow_engine/service/flow_template_app_service.py:84    update(),#88 目前不驗
compliance-manager-be/app/flow_engine/service/flow_template_app_service.py:112-113    publish() 已有的 _validate_bpmn + _validate_bpmn_topology 呼叫,照抄這兩行
compliance-manager-be/app/flow_engine/service/flow_template_app_service.py:195    _validate_bpmn
compliance-manager-be/app/flow_engine/service/flow_template_app_service.py:248    _validate_bpmn_topology
compliance-manager-be/app/flow_engine/service/workflow_template_snapshot_service.py:46    clone_master_as_snapshot,起輪次複製範本落點,要加「已發布」條件
compliance-manager-be/api/flow_engine/routes/stage_advance_route.py:59    ctx.setdefault("user_nickname", ...),#128
compliance-manager-be/api/flow_engine/routes/stage_rollback_route.py:40    同樣寫法,兩入口對稱
compliance-manager-be/api/flow_engine/serializers/stage_advance.py:11-12    ctx 欄位,要加白名單

怎麼修