本卡屬 FR-114 資安修正(母卡 CM-2019),第 5 批「信任鏈與客戶層級設定」卡 5A-4,修 SUMMARY #20/#93(出自 M09-2+M21-1/M09-4),並依決策者裁定 D-X2(公式中和函式放 jedi-common,先套件側再 BE 接上)合併 SUMMARY #102/總表126(原第 5 批 C 子集卡 5C-7)。高。修法規格來自內化卡 CM-1987(M09)與 CM-1997(M21),計畫在 docs/features/FR-114-2609-security-fix-dispatch/batches/plan-b5A.md「卡 5A-4」段與 plan-b5C.md「卡 5C-7」段(本卡已把兩段合併執行)。
#20:操作日誌匯出與意見回饋匯出兩個 Excel 出口,都沒有處理「使用者填的字第一個字元剛好是 =/+/-/@」的狀況——Excel 會把這種字串當成公式執行,等於使用者填的一段文字可以變成在別人電腦上跑的公式(俗稱 CSV/Excel 公式注入)。
#93:日誌轉送把換行字元原封不動送出去,攻擊者只要在填寫欄位裡塞一個換行,就能讓一筆偽造的假日誌被當成獨立一筆送到日誌伺服器,混淆稽核紀錄。
#102/總表126(合併進本卡):Word 匯出時 docxtpl(範本引擎)的自動轉義預設是關閉的,使用者填的字串沒被轉義直接塞進 Word/PDF/ODT 三種匯出格式共用的產生器;另一個 Excel 匯出(OSCAL 控制措施匯入)也有跟 #20 一模一樣的公式注入問題。
首腦核對:
/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/.claude/worktrees/jedi-wt-fix-security/<套件目錄>(branch fix/security-b1)改,只動自己那支套件的子目錄、只 git add 該子目錄下的檔。 本卡對應 jedi-common(新建共用中和函式)與 jedi-log(日誌匯出/轉送);worktree 建議 jedi-wt-fix-security/jedi-common、.../jedi-log。/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security(branch fix/security-b1)改,不要碰主 checkout(掃描線正在讀它)。跑服務用 PORT=8001。 本卡另涉 app/oscal/service/export/ssp_docx_generator.py 與 app/oscal/service/ssp_control_impl_import_service.py(合併自 5C-7)。pyproject.toml 把該套件的 pin 改成 jedi-xxx = { path = "/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/.claude/worktrees/jedi-wt-fix-security/jedi-xxx", develop = true },poetry update jedi-xxx。這個 path 改動不 commit(git add 時跳過 pyproject.toml)。jedi-issue(意見回饋匯出),一併在同一個套件 monorepo worktree 底下開子目錄改,只 git add 自己動的子目錄。jedi-log/jedi_api_log/api_log/app/service/api_log_service.py:77 export_api_log_file,#20 匯出入口
jedi-log/jedi_api_log/api_log/app/service/api_log_service.py:81,87,96,88-89 ExcelWriter 寫入行,需套用中和函式
jedi-log/jedi_api_log/api_log/common/utils/excel_util.py ExcelUtil,掛載候選位置
jedi-log/jedi_api_log/api_log/app/dto/api_log_export.py 匯出欄位清單
jedi-log/jedi_api_log/api_log/api/routing.py:18 路由
jedi-issue/jedi_issue/app/feedback/service/feedback_service.py:337 export_feedbacks 入口
jedi-issue/jedi_issue/app/feedback/service/feedback_service.py:359 四個可控欄位組 row
jedi-issue/jedi_issue/app/feedback/service/feedback_service.py:370-380 csv 分支,需套用中和函式(兩入口只改一邊的典型,兩分支都要改)
jedi-issue/jedi_issue/app/feedback/service/feedback_service.py:381-391 excel 分支,同上
jedi-issue/jedi_issue/plugin/__init__.py:10 路由
jedi-log/jedi_api_log/forwarding/common/forwarder.py:232 RFC5424 組裝行,#93 核心
jedi-log/jedi_api_log/forwarding/common/forwarder.py:222-234 formatter
jedi-log/jedi_api_log/forwarding/common/forwarder.py:198 build_rfc5424_formatter
jedi-log/jedi_api_log/forwarding/common/forwarder.py:163-196 build_target_handler
jedi-log/jedi_api_log/forwarding/common/forwarder.py:189 ⚠️既有陷阱註解(append_nul=False),不要弄掉
jedi-log/jedi_api_log/forwarding/common/gelf_handler.py:88 _build_payload,理論上 JSON 格式免疫,需開檔實查確認、不能只靠推論
jedi-log/jedi_api_log/forwarding/common/gelf_handler.py:136,142 GELF 側相關處理
jedi-log/jedi_api_log/error_tracking/masking.py 現成遮蔽工具候選
app/oscal/service/export/ssp_docx_generator.py:60 tpl.render 缺 autoescape=True,#102 核心
app/oscal/service/export/ssp_docx_generator.py:57-69 整支 generate 函式,內含 _append_control_sections/_append_reference_docs 直接用 python-docx,需另確認有無同漏洞
app/oscal/service/ssp_control_impl_import_service.py:139 總表126 第一寫入點
app/oscal/service/ssp_control_impl_import_service.py:163 總表126 第二寫入點