Repository navigation
Evidence bundle fails its own verifier after any loopback request #329
Description
2026-10-16 最新狀態:PR #339(錄製修復)及 #338(測試整理)已合併;v0.18.3 已正式發布。四份公開安裝資產下載後 SHA-256 與 Windows 更新 metadata 核對通過;正式 Mac DMG 隔離副本的 100 道普通 Zsh 指令、HTTP(S)/匯出/重啟與取消安裝三流程 PASS。v0.18.2 保留為有已知缺口的預發行,v0.18.1 未發布包。原生 WSL、完整人工 Kali/首次安裝計時及 Mac quarantine/Dock/公證仍未驗收。
2026-10-14 最新修正狀態
已推送 PR #335,HEAD bae0415;產品與DMG1606a2c。尚未合併/發布,issue保持open。
完整source chain仍嚴格驗links/head;projection驗交付檔案digest、manifest checksum、per-tier counts、唯一identity與eligible原始row hash/signature,明示省略/轉換及來源鏈未驗證。宣告metadata/checksum不是可信外部來源身分,不重寫原始DB。
最新macOS DMG27 installed journeys PASS,含真實loopback前後eligible command、HTTP(S)/sidecar/cast、ExportPlan bundle與隨包Python verifier exit0、重啟找回。
原始Windows情境這次已實測: 1606a2c NSIS clean-runner PASS;同一smoke在實際安裝App做loopback前後command與projection verifier,no-skip gate和uninstall也PASS。
刪除/篡改/duplicate/缺檔/缺digest/masking/selection等自動回歸保留;本機完整3593 PASS/24 SKIP。
Spec056為Implemented,T015原生矩陣未全完成;nativeWSL/Kali桌面未跑。bae0415最新CI與NSIS均PASS,最後兩檔只改測試fixture。
候選SHA-256:9d964ea671e39d3441e1c3c8f216841feacdedee6582655dca49783572180686。
以下保留原始觀察與當時的待確認項目;以此最新段落及Spec056的projection契約為準。
現象
預設設定下,專案裡只要有一次對回環位址(127.0.0.1、localhost、::1)的 HTTP 請求,之後匯出的 Evidence Bundle 就過不了自己附的驗證器:
CHAIN BROKEN at event <id>: prev_hash mismatch (expected '7e4e…', got 'd962…')
驗證器退出碼 1。如果那一列剛好是鏈尾,則是 Chain: INTACT 但 Chain-head match: NO — manifest.chainHead does not match recomputed head,退出碼同樣是 1。
重現(打包版 Windows,隔離 profile)
- 建立專案,等受管 proxy 啟動(
http_proxy_started)。 - 經由 proxy 對本機 HTTP 伺服器
http://127.0.0.1:<port>/x送一個請求。 - 在內建終端機執行
echo after-loopback。 - 匯出 bundle(全部、預設選項),執行
python redlog-verify.py <bundle>。
結果:匯出計畫顯示 examined 10、included 7、excludedPersonal 3,驗證器 CHAIN BROKEN。只做步驟 1、2 就匯出(沒有後續事件)則是鏈尾缺口,Chain-head match: NO。
原因(讀程式推得,尚未全部用測試證實)
src/core/config.ts:315預設personalDomains: ['127.0.0.0/8', '::1', 'localhost']。- 匯出計畫(
src/main/ipc/data-export.ts:82)把 target 命中 personal domain 的事件整列排除(excludedPersonal)。 src/core/bundle-export.ts寫events.jsonl時原樣輸出每一列(含prev_hash、hash),沒有為被排除的鏈上事件留下任何占位。tools/redlog-verify.py從expected_prev = None起逐列要求prev_hash連續,最後用sha256(最後一列 hash || 列數)重算 head 並與 manifest 比對。它沒有「缺口」的概念。
回環請求會寫入一筆鏈上的 scope_violation(severity clean、target 127.0.0.1),這筆被排除後,鏈就有缺口。manifest 的 personalDropped 同時是 0,與計畫的 excludedPersonal: 3 不一致。
為什麼要處理
匯出的 bundle 是給客戶或審閱者驗證的證據。紅隊工作裡對本機的請求很常見(本機 listener、本機 proxy、自己的測試服務);一旦發生,使用者拿到的是一個驗證會失敗、但沒有任何提示原因的 bundle。這不是篡改,卻和篡改在驗證器眼裡一模一樣。
還沒確認的
doNotExport排除的鏈上事件、依時間或目標的子集匯出,是否同樣失敗。原因相同(驗證器要求從 genesis 起的完整鏈),但我沒有測。- 被排除的 3 筆是哪些:資料庫看得到 1 筆鏈上的
scope_violation,另外 2 筆應該是 logged tier 的http_request_start/http_response(manifest 的loggedDigest.count是 2),這點是推測。 sharing: true、遮蔽(masked)路徑的列是否有同樣問題。
修法方向(需要決定,不是我能替你選的)
- 匯出時為被排除的鏈上事件保留占位列(只留
id、hash、prev_hash,清掉內容),驗證器認得占位並回報「N 筆依政策省略,鏈連續」。要決定占位列是否洩漏資訊(時間、類型)。 - 回環/個人位址的事件一開始就不寫進鏈(logged tier),這樣鏈上沒有東西可被排除。要決定這是否改變「所有活動都在鏈上」的承諾。
- 驗證器接受 manifest 宣告的缺口清單(排除列的 id 與 hash),並分開回報「鏈連續」與「已宣告省略」。
三者都要有一個測試:預設設定、回環請求在鏈中間、匯出、驗證器通過並說出省略了幾筆。
驗收
- 上述重現步驟匯出的 bundle,驗證器退出碼 0,且報告明確列出被省略的筆數。
- 沒有省略任何事件時,報告與現在相同。
- 真的被篡改(改一列、刪一列)的 bundle 仍然
CHAIN BROKEN,不會被「已宣告省略」蓋掉。
關聯:Refs #226。
2026-10-15 原生 Kali 與 macOS 封裝收尾
PR #335 已推送至 1fd2879(封裝/腳本修正 a8dea39+驗收文件)。尚未合併/發布。
- macOS 舊 DMG
9d964e…後續被 strict codesign 發現缺少 resource seal,已撤換候選地位;歷史錄製結果保留。新包實際 ad-hoc seal、安裝副本 strict verification PASS;改動 shipped hook 的丟棄副本會被拒。新 DMG SHA-256:7a6dbbea8ce02022727ba3af710ad5f3e6da1565a1973df3e447dad942f431af。ad-hoc 不等於開發者身分或公證,Gatekeeper 只讀評估仍拒絕。 - 新 macOS 包:26 PASS/1 dependency-install opt-in SKIP;隔離 Electron user data 後,100 指令與 PTY/profile removal 兩流程再驗 PASS(100 指令62,432ms)。另兩次真正缺工具安裝均於180秒逾時,保留 FAILED 與畫面上的 Retry/manual remedy。公開依賴另行下載耗時超過8分鐘;不拿舊包安裝成功冒充新包本次結果。
- 原生 Kali 2026.3 ARM64 桌面 VM:使用者安裝 experimental DEB(產品 bae0415),5 installed journeys 整組 PASS:100 道普通指令逐一核對stdout/stderr/exit、native nc、PTY/helper/profile移除、真實HTTP/HTTPS→projection匯出/隨包verifier→重啟、pane切換/停止隔離。最終100指令83,956ms;enrollment+verification84,047ms,不含裝包與人工設定。JSON HTTP覆驗無SKIP/not-exercised,實際步驟均執行。工具另行備妥,VM對外網路保持關閉。
- 使用者另以可見終端手動 Ctrl-Z → raw/fg,附圖證實恢復後持續收資料;獨立輪詢確認stop/resume及三個tty fd,App local chain通過。controller等待10分鐘後才收到確認marker,原始completed:false保留;不冒稱全自動跑完。斷網時外部時間戳錨定失敗有記錄。
- 本機3593 PASS/24 SKIP,五道順序gate、build、strict packaged-resource gate通過。同一head
1fd2879的 CI/Windows NSIS 全部PASS:Ubuntu unit3596 PASS/21 SKIP、Windows unit3281 PASS/340 SKIP、Linux Electron131 PASS/6明確SKIP;多出的installed-only nc未設定packaged executable故skip,已另在真實Kali安裝包通過。NSIS實際乾淨安裝、自己profile首啟、PS/HTTP(S)/loopback projection、no-skip gate及卸載均PASS。較早bae0415結果只保留為歷史,不冒充此head。 - 仍需:完整人工quickstart與首次安裝計時、published Linux x64、Windows portable/native WSL、macOS真正quarantine下載/Dock/公證。ARM驗收不充作x64結果;Spec047/055/056仍Implemented、052仍Draft,未把剩餘task改勾。#333最初單次trace限制與免費覆核無結論仍保留。
時間軸改版暫緩;完整證據與限制已更新 docs/PACKAGED-SMOKE.md 及對應spec verification。
2026-10-15 安裝收尾覆驗(80cbfea)
PR #335 HEAD 80cbfea075d4ba77e58798882e3edb475ae26d7b,未合併/發版。
- CI PASS:Ubuntu unit 3608 PASS/21 SKIP;Windows unit 3293 PASS/340 SKIP;Electron 操作 132 PASS/7 明確 SKIP。另本機五道順序 gate 全過,3605 PASS/24 SKIP。略過項目未算成通過。
- Windows 原生 PASS:NSIS 安裝/自己 profile 首啟/PS/HTTP(S)/projection bundle 隨包 verifier/卸載;portable 真正自解壓 EXE 從含空白路徑啟動、內建 stdout/cast、外部 PowerShell 指令與退出碼、匯出驗證及終止後重啟持久性。兩組 strict JSON gate 均無 SKIP/not-exercised。Portable 不宣稱優雅關閉後的暫存目錄清理或 WSL。
- Linux x64 原生 PASS:實際 apt 安裝/移除 DEB;6 項流程(100 指令 stdout/stderr/exits、native nc 恢復、PTY/helper、HTTP(S)/交付/重啟、專案切換及取消程序);100 指令 40,105ms,含接入驗證 40,137ms,不含裝包/人工設定。搬到含空白路徑的真正 AppImage 再跑 2 項,兩組無 SKIP/not-exercised。AppImage 用
APPIMAGE_EXTRACT_AND_RUN=1,不冒充 FUSE 掛載/桌面雙擊驗收;Ubuntu x64 不替代完整人工 Kali quickstart。 - macOS 新 DMG 安裝副本 13 項 PASS(10 項控制 IPC 的設定/恢復,另 3 項實際程序清理、私有 fresh tools+HTTP(S)、Bash 第一筆/cast+匯出/verifier/重啟)。Fresh install 42,381ms;不把較快網路歸因於 timeout 修正。新 DMG SHA-256:
39acaebdb1b8c85f1be53f2d87a6320752f59216d21f6c1b9b15e5b7cf13a9a6;strict ad-hoc seal PASS,仍未 Developer ID/公證。 - 原始 180 秒下載失敗、renderer reload 留程序、ddea520 DEB 首道指令缺失及 portable driver 失敗均保留。Bash 安裝包 RED cast 證實 0.224s 執行指令、0.604s 才載 hook;改為先排入初始化,再交出 pane,沒有加測試 sleep 掩蓋。取消/離開/reload/quit 只停 owned tree,無關程序保留。安裝/略過不算擷取已驗證。
剩餘:native WSL、完整人工 Kali quickstart/首次裝包到開始記錄的計時、macOS 真正 quarantine 下載/Dock/Developer ID/公證,以及合併與發布。047/055/056 仍 Implemented,052 仍 Draft;未把完整平台驗收勾完。套件、原始報告與 artifact digest 已另外保存;舊候選包與舊 head 的綠燈不冒充本版本。
2026-10-16 合併與正式發版
v0.18.2 Release 對應 9b8a8c263986a23874289c9630c8f24d3d13ed53;三平台建置與單一發布工作 全部 PASS,安裝包、SHA256SUMS 與 Windows 更新資訊齊全。公開下載與 Mac 安裝副本覆驗另留結果,不將先前候選包當成本次發布位元組。
PR #337 CI:Mac unit 3,619 PASS/21 SKIP,Ubuntu 3,615/21,Windows 3,298/342;Electron 132 PASS/6 明確 SKIP。NSIS 實際安裝/記錄/匯出/卸載 1 PASS,DEB 實際安裝/記錄/匯出/取消/移除 6 PASS,兩者 strict JSON 無 skip/not-exercised。
macOS 錄製器現在保留 PTY slave 至指令完成並排空資料,避免最後關閉端清掉未讀 stdout/stderr;確定的 RED→GREEN 原生回歸已加入。這不回溯斷言 #333 最初無 syscall trace 的單次失敗全部同因。完整人工矩陣與原生 WSL 仍留 open,不把 Spec 047/055/056 升成 Verified,052 維持 Draft。
2026-10-16 v0.18.3 正式下載覆驗
正式 Release 的 NSIS、DEB、DMG、Mac ZIP 均下載並核對 SHA-256;latest.yml 的版本、檔名、大小及實際 NSIS SHA-512 也吻合。Mac DMG 唯讀掛載後複製到隔離安裝目錄,strict codesign 通過,實際 runtime 是 0.18.3/isPackaged=true。三個 installed journeys 全 PASS,strict JSON 無 SKIP/not-exercised/flaky:100/100 普通 Zsh 含輸出與失敗邊界、內建終端/真實 HTTP(S)/投影交付及隨包 verifier/重啟、安裝取消/離開/reload 只清 owned tree。沒有改個人 profile 或系統 CA。
測試整理保留上述 producer/隔離/證據測試,刪除重複或已無效的案例;全套本機為 3,605 PASS/24 明確 SKIP,相關 Electron HUD/project 9 PASS。舊矩陣移入 archive;現行測試與人工安裝驗收指引另列。剩餘人工平台矩陣仍 open,#333 原始單次缺 trace 的限制不回溯歸因。
Activity