Skip to content

Evidence bundle fails its own verifier after any loopback request #329

Closed

Description

@guan4tou2

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)

  1. 建立專案,等受管 proxy 啟動(http_proxy_started)。
  2. 經由 proxy 對本機 HTTP 伺服器 http://127.0.0.1:<port>/x 送一個請求。
  3. 在內建終端機執行 echo after-loopback。
  4. 匯出 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)路徑的列是否有同樣問題。

修法方向(需要決定,不是我能替你選的)

  1. 匯出時為被排除的鏈上事件保留占位列(只留 id、hash、prev_hash,清掉內容),驗證器認得占位並回報「N 筆依政策省略,鏈連續」。要決定占位列是否洩漏資訊(時間、類型)。
  2. 回環/個人位址的事件一開始就不寫進鏈(logged tier),這樣鏈上沒有東西可被排除。要決定這是否改變「所有活動都在鏈上」的承諾。
  3. 驗證器接受 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions