問題
天天使用的筆電會累積許多背景項目:launch agent、登入項目、輔助 daemon、system extension、瀏覽器擴充,以及各種隱私權限。多數 Mac 加固建議只是一份檢查清單,沒說怎麼找出已經存在的東西、怎麼判斷它,也沒說怎麼證明修復真的有效。
做法
把健檢當成一次小型評估,分兩輪進行。
- 先寫計畫:範圍、要做的檢查,以及第一輪只讀不改的規則。
- 第一輪掃描並出報告。每個發現都附上背後的指令輸出、風險,以及不執行的建議修法。
- 另設一個決策步驟,決定要修什麼。
- 第二輪套用選定的修復、做更深入的掃描,並對每個修復重跑原本的檢查來確認。
運作方式
第一輪涵蓋六個面向:
- 基礎防護:System Integrity Protection、FileVault、Gatekeeper、應用程式防火牆與更新設定。
- 網路暴露面:把每個監聽中的 socket 對應到它的 process,區分只綁 loopback 與綁在所有介面的監聽者。
- 常駐項目(persistence):launch agent 與 daemon 並驗證程式碼簽章、背景工作資料庫中的登入項目、cron、shell 啟動檔、system extension 與組態描述檔。
- 帳號與存取:本機帳號、管理員成員、SSH 目錄權限、authorized keys 與 sudoers 條目。
- 已安裝軟體:抽驗非 App Store 來源 app 的簽章,並檢查過期套件。
- 每個已安裝瀏覽器的擴充功能,並用 KnockKnock 的擴充功能掃描交叉比對。
第二輪往下挖:
- 用 KnockKnock 做完整的常駐項目盤點,逐項判讀,可疑的簽章再驗證。
- 第三方 kernel extension、sudoers 規則,以及近期下載的 quarantine 紀錄。
- 加上監控,讓下一次變動被發現:常駐項目監控工具(例如 BlockBlock)與對外連線防火牆。
隱私權限(系統設定「隱私權與安全性」裡的完整磁碟取用權限 Full Disk Access、螢幕錄影與輸入監控)需要特別處理。讀取使用者層級的隱私權資料庫,執行讀取的程序必須有 Full Disk Access,所以要從已取得該權限的終端機跑輔助腳本,或手動逐一檢視各個分類。系統層級的資料庫受 SIP 保護,連 root 都讀不到。
成果
- 兩輪都沒有發現入侵跡象。
- 第一輪沒有嚴重項目,只有少數鬆散設定與幾項加固建議。第二輪逐一判讀掃描工具列出的 32 個常駐項目,另外找到三個低風險的清理項目。
- 發現的都是常見類型的鬆散問題,而不是入侵:憑證類檔案權限太寬、沒有可信簽章的 app、無主的高權限 daemon、已解除安裝軟體的殘留,以及對所有介面開聽的服務。
- 每個已套用的修復,都重跑當初發現問題的指令,附上前後對照的證據;工具權限不足的地方,則由使用者本人執行,報告也如實註明。
學到的事
- 把「發現」和「變更」分開。只讀的第一輪可以放心執行,也容易說明。
- 把盲點攤出來。需要較高權限的項目,例如 kernel extension、sudoers 或隱私權資料庫,要放進「未檢查」清單,而不是假設它沒問題。
- 判斷項目要看簽章與必要性,而不只是看它是不是惡意軟體。合法軟體也可能待在高權限的位置,例如 authorization plugin 與 privileged helper;解除安裝的軟體也可能留下指向空處的 extension 或 daemon。
- 重複做。基準報告讓下一次健檢變成一次 diff,監控工具則讓兩次健檢之間的變動也看得見。