# W1 — 收集層完成紀錄 日期:2026-09-25 環境:Windows 11 Home 10.0.26200,一般權限,Go 1.27 > **獨立審查後的更正(同日):** > - 本文的 0.36 秒和 3.6 MB,是 W1 那個版本當時的量測值。之後加入了常駐點和簽章檢查,執行檔變成 4.4 MB,暖機後的掃描時間約 1.3–2.5 秒(見規格 §9)。 > - W1 當時是 5 個套件有測試,不是本文寫的 6 個。 > - 「每次掃描自我檢查不連網」這項檢查只看當下的 TCP 端點,不能證明什麼。不連網的保證,其實是靠程式碼設定(簽章只用快取、DNS 只查快取)。 ## 驗收 | 標準 | 目標 | 實測 | |---|---|---| | 在本機跑出正確的 Agent 歸因報告 | ✅ | 1 個 Claude Desktop 根行程 → 數個 Claude Code session → 各自的 MCP 子行程,全部以設定檔中的名稱正確命名 | | 掃描耗時 | < 3 s | **0.36 s**(3 次測量:356 / 369 / 372 ms,含簽章驗證) | | 單一執行檔、無外部相依 | ✅ | 3.6 MB(`-trimpath -ldflags "-s -w"`),只用標準函式庫 | | 工具本身不連網 | ✅ | 每次掃描都會自我檢查;若發現自己有連線就發出警告 | 測試:共 6 個套件,全部通過(`go test ./...`)。 ## 交付內容 | 模組 | 內容 | |---|---| | `collect/` | 行程(含建立時間)、TCP 表、DNS 快取(只查本機快取)、Authenticode 簽章(內嵌簽章 → 系統目錄簽章 → MSIX 套件,不做撤銷檢查所以不連網)、權限提升狀態 | | `agents/` | 分類器(新增 Antigravity、Kiro、Trae、Goose、Aider、Copilot CLI、Amp);MCP 設定檔盤點(見下方);行程與 MCP 設定的比對;敏感資料遮蔽和隱藏字元清除 | | `ipowner/` | 內嵌 10,693 個官方公布的 IP 範圍,用來標註連線對象屬於哪家公司 | | `snapshot/` | 統一的資料模型:驗證過的行程樹、Agent 根行程、MCP 歸屬、連線、簽章、涵蓋率;以及 `Redacted()` | | `render/` | 文字報告:Agent 樹、其他外部連線、網路監聽埠、MCP 設定清單 | | `cmd/agentegress` | `scan [-json] [-v]`、`version` | | `tools/genranges` | 開發期產生器,從各家官方來源重新產生 IP 範圍表 | **MCP 設定檔盤點涵蓋:** - Claude Code:`~/.claude.json`(頂層和各專案),以及專案內的 `.mcp.json` - Claude Desktop:一般安裝版和 MSIX 虛擬化路徑 - Cursor、VS Code(`mcp.json` 和 JSONC 格式的 `settings.json`)、Windsurf、Gemini CLI、Antigravity、Kiro - Codex:`config.toml` ## 已解決的 Spike 0 缺口 | 缺口 | 解法 | |---|---| | PID 被重複使用 | 父行程的建立時間若晚於子行程,就不建立父子關係(有測試覆蓋) | | Electron 輔助行程 | 標記為 helper,連線合併到它所屬的 Agent 顯示(有測試覆蓋) | | `MCP?` 只能靠猜 | 用設定檔比對命名。比對時會忽略目錄參數和版本號,並優先選擇和上層 Agent 一致的客戶端 | | 數位簽章 | 已完成,並用 `cmd.exe`(系統目錄簽章)和暫存檔(未簽章)驗證 | ## 新發現(修正了 Spike 0 的假設) 1. **DNS 快取幾乎沒用。** 本機快取裡只有十來個名稱,原因有三:TTL 很短;Chrome 等程式自己解析 DNS,不經過系統快取;Agent 的長連線早在記錄過期前就建立了。→ 改用內嵌的官方 IP 範圍標註公司。Agent 連線現在都能顯示 `[Anthropic]`。 - Anthropic 的範圍經 RDAP 驗證:`160.79.104.0/21` 和 `2607:6bc0::/32`。 - 其他來源:Cloudflare、Google、Google Cloud、AWS、GitHub(排除 actions 範圍,因為那是 Azure 的 IP)、Fastly、Microsoft 365。 2. **Claude Desktop 的 MSIX 虛擬化。** 從 Claude 內部啟動的行程看到的 `%APPDATA%` 會被導向別處;從外部看,設定檔實際位於 `Packages\Claude_*\LocalCache\Roaming\Claude\`。兩個路徑都要讀。 3. **Windows 中文環境的編碼問題。** 下游工具如果用系統代碼頁(CP950/936)讀取 JSON,路徑中的中文字元可能產生無效的跳脫序列。agentegress 的輸出一律是 UTF-8,README 需要提醒使用者:在 Python 裡要用 `sys.stdin.buffer` 讀取。 ## 已知限制(留給 W2 和之後處理) - **Azure 的 IP 沒有標籤。** Azure 的 service tags 下載網址每週都會變,本機觀察到的 Azure 位址因此沒有標籤。另外,騰訊、字節跳動、LINE 等亞洲業者沒有公開的 IP 範圍清單。 - **敏感資料遮蔽只能靠格式比對。** 已知格式的 token 都能遮蔽,例如 `ghp_`、`github_pat_`、`sk-`、`--token`、`key=`、URL 中的帳號密碼;但任意字串形式的秘密無法辨識。這點要寫進 README。 - **TCP only**:QUIC/UDP 看不到(P2 用 ETW)。 - **需要管理員權限的部分**:在一般權限下,系統服務的簽章和路徑讀不到,會標示為「— no access (needs admin)」。