本卡屬 FR-088(母卡見 FR-088 母案),第 3 棒 P1:套件本體的 BPMN(流程圖 XML)解析器、產生器、拓撲驗證器,與流程範本的讀寫鏈(jedi monorepo)。只掃不修。
流程圖是一種 XML 文字檔(BPMN 格式)。使用者在畫面上畫流程圖存進來,系統要「讀懂」它才知道下一步是誰的任務。這一棒掃的是「讀懂 XML」那段程式(30 檔,含 3 個範例流程圖):一張惡意的流程圖能不能把伺服器弄掛、能不能讓它去讀不該讀的檔案、以及範本讀取有沒有分客戶。只找問題、不修問題。
XML 解析是資安的老問題區(外部實體讀本機檔案、指數展開炸彈、深度巢狀耗盡記憶體)。這支套件用了兩個解析器(xmltodict 與 ElementTree/defusedxml),有三個範本進入點(建立、驗證、發布),還有三支「吃檔案路徑」的方法。範本讀取則是 FR-087 已證實「隔離開關關著」的那張表。
行號已開檔核對,是思考起點不是檢查清單:
jedi_flow_engine/common/utils/bpmn_uilts.py:34 xmltodict.parse(self.bpmn_xml) 建構子直接解析;同檔 :513/:582/:625 另有三處 parse+unparse 來回。首腦核對 .venv 裡 xmltodict 0.14.2 的 parse() 預設 disable_entities=True(xmltodict.py:185/341),所以外部實體與實體炸彈預設已擋——請驗證這四處都沒有把它關掉,再看深度巢狀(expat 遞迴)與超大文件(50MB body 上限之內)的資源耗盡。common/utils/bpmn_generator.py:3 import xml.etree.ElementTree as ET # nosemgrep(用 nosemgrep 把安全規則標掉)、:6 from defusedxml.ElementTree import parse as safe_parse。檔頭自陳「解析走 defusedxml、產生端維持 ET」。要驗::1541/:1563/:1982 三處 safe_parse 之外,有沒有任何 ET.fromstring / ET.parse 漏網(grep 過只看到 tostring/ElementTree()/write,請再確認)。bpmn_generator.py:963 save_bpmn_to_file(file_path)、:1220 export_xml(file_path)、:1241 import_xml(file_path)(open(file_path) 讀寫)。首腦 grep BE 與 jedi 兩邊零呼叫者——是死碼還是 debug 殘留?只要日後有人把使用者字串接上去就是任意檔案讀寫。記錄並建議刪除或收進測試。bpmn_uilts.py:364-387 _parse_condition_param_to_string() 把 {key: value} 拼成 ${key == value} 與流程圖裡的 conditionExpression 做字串完全比對(:303)。首腦沒看到 eval/exec——請確認整支套件確實沒有任何動態求值;同時看 key/value 能不能含 } 之類字元造成錯配到 default flow(:311-315)。bpmn_uilts.py:389-414 get_job_execution_order() 有 visited 集合;但 :213-330 get_next_elements()/get_next_jobs() 沿 gateway 遞迴時沒看到 visited。一張「gateway 指回自己」的流程圖會不會讓建立流程時 RecursionError/500?(DoS,門檻是能建範本的人。)app/service/workflow_template_service.py:46-56 get_workflow_template_by_uid() 直接回 entity 含完整 XML;repo infra/repository/workflow_template_repo_impl.py 全靠 get_one_by_fields。model infra/models/workflow_template.py:11 掛 TenantScopedMixinModel(自動填 tenant),但 DEV 實查 compliance.workflow_templates 隔離開關關閉(4 條規則寫好、relrowsecurity=f)。這條路的宿主入口是 H2 的 /flow-engine/process-definition/<uid>。create() 只查名字重複就存 XML(H3 範圍);套件側 add_workflow_template(:86-124)與 update_workflow_template_xml(:158)也不解析。惡意 XML 在之後每次讀取時被 _process_bpmn_xml()(:204-211)解析——壞範本會讓所有讀它的地方一起炸。記錄影響面。__main__ 區塊讀本機檔:bpmn_uilts.py:715-720 開 ./網路設備風險評估.bpmn——dev 殘留,不是攻擊面,但三個 .bpmn 範例檔在套件內(scope 內含 3 檔),確認裡面沒有內網位址或憑證(首腦 grep 只看到標準 namespace URL)。workflow_templates 隔離關;191 筆凍結副本無租戶歸屬(宿主 snapshot service 建的,H3 範圍)。