本卡屬 FR-114 資安修正(母卡 CM-2019),第 5 批「信任鏈與客戶層級設定」卡 5A-2,修 SUMMARY #17/#18/#90/#91/#133(出自 M08-1/M08-2/M08-3/M08-4/M08-5)。高。修法規格來自內化卡 CM-1984,計畫在 docs/features/FR-114-2609-security-fix-dispatch/batches/plan-b5A.md「卡 5A-2」段。
#17:防竄改機制(integrity,用來偵測系統檔案有沒有被動過手腳)依賴一支驗簽工具,但這支工具可以被整支換掉,換掉後照樣通過三層檢查——等於防竄改的鎖被拔掉都不會有警報。
#18:只要刪掉一個標記檔案,就能讓已經被鎖定(因偵測到竄改而鎖住)的機器重新開機正常運作,等於鎖定形同虛設。
#90:一個環境變數的優先序設計錯誤,會讓正式版悄悄退回開發版的行為,換目錄邏輯搶在「是否正式版」判斷之前生效。
#91:解鎖檔如果被損毀(用過的一次性密碼紀錄不完整),系統會把它當成全新、可重複使用的解鎖檔,等於用壞掉的鎖匙也能開門。
#133:竄改事件回報時,會把主機 log 最後 50 行原封不動送出去,log 裡如果剛好夾帶密碼就一起外洩。
首腦核對:
/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/.claude/worktrees/jedi-wt-fix-security/<套件目錄>(branch fix/security-b1)改,只動自己那支套件的子目錄、只 git add 該子目錄下的檔。 本卡對應 jedi-integrity,worktree 建議 jedi-wt-fix-security/jedi-integrity。/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security(branch fix/security-b1)改,不要碰主 checkout(掃描線正在讀它)。跑服務用 PORT=8001。 本卡另涉 common/util/resource_path.py 與 scripts/build/build_release.sh。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_integrity/config.py 是 6 行 shim(轉呼叫用),不要動它。jedi-integrity/jedi_integrity/domain/config.py:47-48 DEFAULT_BOOT_LAYERS,#17:驗簽工具沒強制編譯進 core 層
jedi-integrity/jedi_integrity/domain/config.py:37 SPOT_CHECK_SAMPLE=200,抽查樣本數設定
jedi-integrity/jedi_integrity/domain/config.py:84 相關設定
jedi-integrity/jedi_integrity/app/runtime_check.py 抽查實作(行號已漂移,開工前先開檔確認現況)
scripts/build/build_release.sh:108 pdfminer 排除清單
scripts/build/build_release.sh:375 牽連鏈註解
scripts/build/build_release.sh:874,889,894,909,930 thirdparty 清單產生,#17 安全關鍵分層要接這裡
jedi-integrity/jedi_integrity/app/startup_gate.py:54 import
jedi-integrity/jedi_integrity/app/startup_gate.py:99 _refuse_for_existing_marker,#18:只看標記檔案存在與否
jedi-integrity/jedi_integrity/app/startup_gate.py:154 write_marker
infra/tamper_event_repo.py:97 exists 方法,⚠️需重跑 grep 確認零呼叫現況
app/service/tamper_sync_service.py 需補同步邏輯(#18 治本方案的一部分)
domain/tamper_marker.py:102-129 read_marker 嚴格側,是 #91 的正確範本(照抄這支的嚴格判斷)
core/plugins/integrity.py:48 BE 側掛載點
core/scheduler.py:343 BE 側排程掛載點
jedi-integrity/__init__.py #18 文件三處之一,需與行為改動保持一致
jedi-integrity/jedi_integrity/domain/tamper_marker.py #18 檔頭文件,同上
jedi-integrity/README.md #18 文件第三處
common/util/resource_path.py:23 _ENV_OVERRIDE,#90:環境變數優先序問題核心
common/util/resource_path.py:26-28 is_packaged 判斷
common/util/resource_path.py:31-39 resource_root,先看 env 才看 is_packaged(要改成反過來)
jedi-integrity/jedi_integrity/domain/ports.py:84 套件側使用點之一
jedi-integrity/jedi_integrity/app/runtime_check.py:105,164,228,268 套件側使用點
jedi-integrity/jedi_integrity/app/startup_gate.py:150,226 套件側使用點
jedi-integrity/jedi_integrity/app/unlock.py:51,75,83-100,103,218 _read_used_nonces 本體,#91:合理側(:92-93)與需改嚴格側(:96-97,:99)
jedi-integrity/jedi_integrity/infra/forensic.py:44 _LOG_TAIL_LINES=50,#133 核心
jedi-integrity/jedi_integrity/infra/forensic.py:76 collect_trigger_context
jedi-integrity/jedi_integrity/infra/forensic.py:88 組裝點
jedi-integrity/jedi_integrity/infra/forensic.py:108 _log_tail 本體