Lafine系統設計·技術文件

適用於 Linux 的 RoamSwitch
架構與安全白皮書

解釋 RoamSwitch for Linux 在其權限邊界上執行的操作的技術文件。它避免了行銷語言;可以根據分散式套件的實際行為和附錄中的自我檢測來檢查聲明。

版本 v1.6.0 適用對象 RoamSwitch for Linux 1.1.0(核心 LPE 強化/eBPF 執行時防護/攻擊程序 SIGSTOP 凍結/Falco 低負載最佳化) 需求 systemd + nftables 發布日期 2026-09-06

§1

RoamSwitch for Linux 是一種常駐網路安全和系統診斷應用程序,它將 macOS RoamSwitch 的零信任網路防禦模型引入 Linux(systemd + nftables 環境)。

此版本針對客戶端電腦(工作站、筆記型電腦、單板電腦),並假設機器在網路之間移動時遵循機器的自主行為。強化伺服器/無頭基礎設施版本(RoamSwitch 伺服器版本 - 始終在線預設拒絕、關鍵路徑 FIM 完整性、遠端 Webhooks 和靜態策略實作)作為專用伺服器版本提供。

它透過網關 MAC 位址識別連接的 Wi-Fi/有線網絡,並自動切換活動的 nftables 防火牆設定檔。除此之外,它在不受信任的網路上提供三層中間人防禦 - VPN 隧道 + 終止開關(WireGuard 或 Tailscale,主要防禦)、預防性 ARP/NDP 鎖定ARP 欺騙檢測 - 勒索行為軟體偵測(fanotify + Shannon formroprop) (NFQUEUE + SNI)、連接埠異常防護、BadUSB 緩解、核心本地權限升級 (LPE) 搶佔(Frag Gap CVE-2026-53362 緩解)eBPF 運行時威脅感測器 (Falco /tra__p) 與亞秒碼項安全健康評估和內建模型上下文協定 (MCP) 伺服器。

本白皮書描述了每種防禦機制的架構、威脅模型和設計,特別是如何在代碼層級保證「完全本地處理;機器發送的唯一內容是對簽名檢測資料的請求,不攜帶任何關於您的資訊」的原則。它避免了行銷語言;可以根據分散式套件(二進位)的實際行為和附錄中的自我檢測來檢查聲明。 Linux 版 RoamSwitch 是專有的免費軟體,其原始碼未發布 (§11)。

設計原則
原理詳情
零遙測該產品不會向任何人發送任何有關您或您的機器的資訊。沒有遙測、分析、崩潰報告、使用指標、遠端配置或許可證啟動伺服器。
僅接收更新該產品發出的一個出站請求是每天一次的 GET,來自 lafine.net/updates/v1 的固定簽名清單 - 連結防護的詐騙網站清單、ClamAV 簽名版本、最新應用程式版本、套件 CVE 對應表(Homebrew/npm/PyPI/crates.io/RubyGems/Packagist/Go/Maven)、實證型弱點診斷的 CVE 對應表,以及用於打字仿冒偵測的熱門 npm 套件名稱清單。它不攜帶查詢字串、cookie、識別標頭,也不包含有關您的資訊。 updates.enabled = false 完全關閉它;然後,該產品可以在零外部接觸的情況下運行捆綁資料。
完全本地處理每個評估、檢測和審核都在本機電腦上運行完成。 URL 安全分析和秘密掃描會啟發式地評估其輸入,而無需將其傳輸到任何地方。
最小權限特權操作僅限於 root 守護程式; UI、CLI 和 MCP 伺服器透過 Unix 網域套接字 IPC 請求它們。守護程式不開啟 TCP/UDP 套接字;連結防護僅使用 AF_NETLINK NFQUEUE 判定通道(核心 ↔ 使用者空間,無資料包出口)。
失敗關閉Air-Gap(緊急隔離)在守護程序重新啟動後仍然存在,如果其規則已外部刪除,則會在幾秒鐘內重新生效。
離線授權Pro / Business 授權純粹透過 Ed25519 簽章檢查進行驗證。不會調用激活伺服器。

§2

RoamSwitch for Linux 主要針對在不受信任網路之間漫遊的 筆記型電腦/行動工作站。

範圍內的攻擊者

  • 相同 LAN 上的攻擊者 — 共享 Wi-Fi 上的連接埠掃描、ARP/NDP 欺騙(包括惡意路由器廣告)以查找中間人、惡意 DHCP、MAC 泛洪後的被動嗅探、對開發伺服器的未經授權的存取或意外綁定到 __X00 的本地 LLM API。
  • 惡意 USB 裝置 (BadUSB) — 冒充鍵盤並在螢幕鎖定前註入按鍵;未註冊的 USB 大容量存儲,用於資料外洩或攜帶惡意軟體。
  • 勒索軟體/無檔案惡意軟體 — 透過下載的檔案進入並對使用者的文件進行批次加密。
  • 基於 DNS 的 C2 和網路釣魚 — 使用名稱解析到達 C2 伺服器或網路釣魚網站的惡意軟體。

超出範圍

  • 已經擁有root權限的攻擊者;核心或韌體級 Rootkit。
  • 實體刪除磁碟的攻擊(全碟加密領域;RoamSwitch 診斷是否有加密但不加密)。
  • AirDrop 式近距離無線共享控制(Linux 上沒有作業系統本機機制;不支援)。

§3

適用於 Linux 的 RoamSwitch 在 Rust 中跨七個 crate 實作。與守護程式的所有通訊都透過 /run/roamswitch/roamswitch.sock (Unix 域套接字)。 守護程式、應用程式或 MCP 伺服器中沒有偵聽 TCP/UDP 套接字。 應用程式 binds 唯一的東西是單一 Unix 套接字,以防止第二個實例。

# 使用者空間(非特權)
roamswitch-app      GTK3 + AppIndicator 匣
roamswitch (CLI)    面向 shell 的輕量前端
roamswitch-mcp      stdio JSON-RPC(由 AI 用戶端啟動)
      │
      │  AF_UNIX  /run/roamswitch/roamswitch.sock  (僅限本機 IPC)
      ▼
roamswitch-daemon   root / systemd Type=notify + WatchdogSec=30
  · nftables 設定檔控制(inet roamswitch 表)
  · sentinel 迴圈(網路判定與設定檔套用)
  · VPN 通道 + 網路阻斷開關(WireGuard: wg-quick / roamswitch_vpn,Tailscale: roamswitch_ts)
  · 預防性 ARP/NDP 鎖定(neigh 表固定) / 偵測
  · 連接埠異常防護(roamswitch_dev_guard)
  · fanotify 防護(勒索軟體/惡意軟體)
  · 連結防護(NFQUEUE — inet roamswitch_linkguard)
  · 誘餌引擎 / 隔離 Vault
  · 核心 LPE 強化(停用 userns、Yama LSM)
  · eBPF 執行時聯動(/var/run/roamswitch/events.sock)
  · 以毫秒級 SIGSTOP 凍結攻擊程序並聯動 Air-Gap
  · USB 監控(evdev EVIOCGRAB — BadUSB) / 核准佇列
  · Ed25519 授權驗證

roamswitch-updater  獨立的 systemd 計時器 helper。是唯一擁有
                    HTTP/TLS 協定堆疊的 crate(每日取得一次簽署清單)
roamswitch-core     純邏輯函式庫(所有 crate 共用)
roamswitchkit       MCP 用戶端 SDK
權限分離
組件特權角色
漫遊交換器守護程式根(systemd,Type=notify + WatchdogSec=30所有特權操作。作為單一編寫者,控制 nftables、DNS 和 systemd 單元。
漫遊交換器應用程式登入用戶GTK3 GUI + AppIndicator 托盤。僅配置編輯和視覺化;每個特權操作都經過IPC。
漫遊交換器 (CLI)登入用戶薄殼前端使用相同的IPC插座。
漫遊交換器-MCP由AI客戶端產生的進程stdio JSON-RPC。提供唯讀診斷資訊。

與守護程序的所有通訊都通過 /run/roamswitch/roamswitch.sock (具有 0700 等效權限的目錄)。使用者配置以純文字 JSON 形式儲存在 ~/.config/roamswitch/config.json 處。守護程式以 root 權限讀取 /home/*/.config/roamswitch/config.json(它以 HOME=/root 運行)。配置永遠不會離開機器;沒有帳戶註冊,也沒有雲端同步。

§4

哨兵迴圈(預設為 5 秒迴圈)從 /proc/net/arpip neigh 讀取預設閘道的 MAC,並將其與 config.json 中註冊的 MAC 進行比對。使用 MAC 而不是 SSID,因為 SSID 很容易被欺騙。設定檔切換時顯示的桌面通知會說明切換的 reason(「未註冊的網路」/「您對註冊網路 X 的設定」/「無網路連線」)。

型材
公司簡介情況nftables 行為
開放(可信)已註冊的家庭或公司網絡policy accept。允許本地交通。
平衡未註冊但配置為相對安全預設拒絕入站。只允許已建立的連接和 lo;暴露端口暴露監測。
鎖定(離開保護)公共 Wi-Fi/未註冊網絡所有入站資料包均被秘密丟棄。共享服務自動停止(選擇加入)。

所有規則都隔離在名為 inet roamswitch 的專用 nftables 表中,並且永遠不會與其他防火牆配置(ufw/firewalld)發生衝突。手動覆蓋到期(1 小時/2 小時/4 小時/直到午夜/直到清除/直到下次斷開連接)由守護程序作為單一寫入者強制執行。 GUI 永遠不會寫過期日期;它會重新讀取守護程序在下一個時脈週期重寫的 config.json 並將其反映在 UI 中(避免衝突)。

Air-Gap(緊急網路隔離)

一種完全隔離模式,在 inet roamswitch 表的輸入和輸出掛鉤上設定 policy drop(優先權 -100),僅允許 lo

  • 失敗關閉 — 在守護程序重新啟動時,偵測標記檔案 (/run/roamswitch/airgap.active) 重新斷言隔離。
  • 自我修復 — 如果外部程序刪除帶有 nft delete table 的規則,哨兵循環會在幾秒鐘內重新套用。
  • 自動過期 — 啟動後 600 秒(與 macOS maxAirGapDuration 相同),隔離會自動解除,防止因誤點擊而導致連線永久遺失。
table inet roamswitch {
    chain input {
        type filter hook input priority -100; policy <accept|drop>;
        iif "lo" accept
        ct state established,related accept
        # balanced/lockdown:其餘全部 drop
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # 僅在 Air-Gap 時 policy drop,僅允許 lo 與 ct established
    }
}

被動式連結防護(網路釣魚連線偵測)

此守護程序監視出站連線的去向,並標記(或者,對於狹窄的「明顯的網路釣魚」集,阻止)與危險主機的連線。它取代了舊的貼上 URL 檢查器,後者需要用戶採取行動。

  • Interception — 專用的 nftables 表 inet roamswitch_linkguard 掛鉤 output 路徑,並透過 NFQUEUE 將 DNS 問題和新的/早期的 Web 連線排隊到使用者空間工作執行緒。 NFQUEUE 是一個基於 AF_NETLINK 的核心↔用戶空間判決通道;守護程序不綁定任何套接字,也不產生任何資料包。佇列規則帶有 bypass,因此如果工作執行緒未運行,流量將暢通無阻(Air-Gap 仍然是單獨的硬停止)。
  • Hostnamesources — DNS 問題名稱、TLS ClientHello SNI(因此使用 DoH 的瀏覽器仍被主機名稱覆蓋)以及明文 HTTP Host 標頭。加密的 ClientHello (ECH) 一旦廣泛部署,就是一個已知的盲點。
  • Verdictroamswitch-core,純粹邏輯)— 根據本地網路釣魚/威脅來源和一組離線啟發式檢查主機:受保護品牌的 IDN/易混淆同形異義字、非官方網域中的品牌令牌、原始 IP 主機、高風險 TLD。
模式 (linkGuard.mode)Feed 命中或品牌同形異義詞其他可疑訊號
off未檢查未檢查
warn 連線保持長達 8 s + 允許/阻止核准提示僅通知
block(預設) 連線中斷 + 允許對話方塊(每台主機一次)僅通知

只有熱門訊息或品牌同形異義主機才會被硬阻止;啟發式標記的所有內容都是警告。 warn 模式 保持 與危險主機的連接最多 8 秒,同時詢問用戶;如果保留到期且沒有答复,則為 fail-close (數據包被丟棄且判決未緩存) - 不回答“此站點正常嗎?”下次嘗試表示“是”,下次會再次提示。 block 模式顯示一個通知和一個允許對話方塊 每個主機 (瀏覽器開啟與相同被封鎖主機的多個連線不再淹沒通知)。在危險的核准對話方塊中,預設按鈕是“繼續封鎖”,“允許”被設計為安靜的非預設選項。可以永久允許被封鎖的主機,也可以在收到通知後五分鐘內允許 (linkGuard.allowlist)。

DNS 經過檢查,從未偽造:列入黑名單的 DNS 問題僅產生通知;強制執行發生在後續 TCP 連接上,因此 RoamSwitch 永遠不會注入合成 DNS 回應。 feed 是網路釣魚/詐騙網域的編譯列表,在軟體包中提供並由每日更新程式刷新(§11)。在沒有提要的情況下,離線啟發式仍然運行。載入前會檢查 feed 檔案的 Ed25519 簽名;不良或遺失的提要無法“僅啟發式”,而絕不會“允許所有”。

VPN 隧道 + 終止開關(主要的 MITM 防禦)

不依賴第 2 層完整性的反 MITM 保護。在不受信任的網路上,到受信任端點的始終在線加密隧道使本地 ARP/NDP 欺騙、惡意 DHCP 和被動嗅探變得無關緊要 — 攻擊者只能看到密文。 ARP/NDP 鎖定和下面的偵測是此功能的次要功能。

兩個後端可供選擇 —「WireGuard(設定檔)」或「Tailscale(退出節點)」。 RoamSwitch 沒有實作自己的加密技術,也不是 VPN 提供者。兩個後端都是可選的依賴項;如果不存在,GUI 將顯示安裝命令。

(A) WireGuard 後端

  • 不提供 VPN 伺服器 — 使用使用者提供的 WireGuard 設定:來自 Mullvad、IVPN 或 Proton VPN 等提供者的 .conf,或使用者自己的 WireGuard 伺服器(VPS 或家庭伺服器)。没有提供默认配置。
  • Config — 守護程序驗證 .conf 並將其儲存在 /etc/wireguard/roamswitch.conf0600,介面 roamswitch)。它不能存在於其他地方:Ubuntu 24.04+ / Debian 13 上的 AppArmor wg-quick 設定檔拒絕 wg-quick 讀取 /etc/wireguard/ 之外的 .conf — 即使作為 root 也是如此。分割隧道配置(AllowedIPs 不是 0.0.0.0/0 / ::/0)被標記為「並非所有流量都受到保護」。
  • Kill-switch — 專用的 nftables 表 inet roamswitch_vpnpolicy drop,兩個鉤子) 丟棄除環回、隧道介面(roamswitch,與 oifname 相符)、固定端點 IP、DHCP 和 ICMP 之外的所有內容。它是在 之前安裝的 隧道啟動(首先透過 getent ahosts 解析到固定 IP 的端點),因此不存在洩漏視窗。如果 wg-quick up 失敗,終止開關將保持開啟狀態。

(B) Tailscale 後端

  • 对于已经运行 Tailscale 的用户。 RoamSwitch not 執行 tailscale up / 登入 / 安裝 tailscaled — 它讀取 tailscale status --json 並執行 tailscale set --exit-node=<node> / --exit-node= (清除)。
  • 需要出口節點 — 反 MITM 保護僅適用於路由所有流量的出口節點。如果未配置任何內容,則不會啟用保護,且 UI 會警告「未受保護」。如果所選節點離線,保護會自動解除並通知使用者(透過死節點路由所有內容將使連線陷入黑洞)。
  • Kill-switch (inet roamswitch_ts, policy drop) — Tailscale 的傳輸無法固定到單一端點 IP(DERP 中繼 + 漫遊對等點),因此這比 WireGuard 更寬鬆 X12__。它允許:環回、隧道介面 (tailscale0)、CGNAT 範圍 100.64.0.0/10fd7a:115c:a1e0::/48、STUN (udp/3478)、DERP (tcp/443)、udp/41641、DHCP、ICMP、MagicDNS (100.100.100.100:53)、已建立的連接。 其他所有內容 — 任意 UDP、本機解析器的 DNS、SMB、mDNS、純文字 HTTP、任意 TCP — 均丟棄。
  • Kill-switch 警告 — (1) 比 WireGuard 後端更廣泛的允許清單(udp/3478tcp/443、整個 CGNAT /10)。 (2) 路徑上的攻擊者仍然可以看到元資料(Tailscale 正在使用、DERP 區域、計時)並且可以丟棄/延遲 — 但無法讀取隧道有效負載。 (3) 當直接 UDP 被阻止時,機密性將依賴 Tailscale 自己的固定憑證 DERP TLS。 (4) 在 MagicDNS 關閉 + 本機解析器的情況下,DNS 在武裝時中斷(UI 警告)。 (5) 啟用前必須先登入強制門戶。

Common — 僅當 vpn_on_untrusted_enabled 且網路不受信任 (level != open) 時才啟用。在受信任的網路上,退出節點被清除,終止開關被刪除(從不 tailscale down)。預設關閉,選擇加入。 WireGuard 隧道/Tailscale 傳輸前往 使用者自己的 VPN 端點/tailnet,與 lafine 的基礎設施無關 (§9)。

預防性 ARP/NDP 鎖定

一旦加入不受信任的網絡,MITM 攻擊者需要模擬的鏈路基礎設施的 MAC 位址就會被 作為 PERMANENT(靜態)條目 固定到核心鄰居表中。一旦固定,核心就會忽略欺騙性的 ARP 回應/鄰居通告。

  • 固定的內容 — (1) IPv4 預設網關,(2) IPv6 預設路由器(通常是鏈路本地 fe80:: 位址),(3) 任何連結 DNS 解析器(透過網關到達公共解析器並被跳過)。 IPv6 鄰居透過 ip -6 neigh replace ... nud permanent 固定。
  • 受信任的網路永遠不會被固定 - 因此家庭路由器重新啟動不會使用戶陷入黑洞。重新固定在每個網路交換器上(TOFU);下次重新連線時將進行合法的故障轉移。固定條目記錄在 /var/lib/roamswitch/arp_lock.json 中。
  • 預設啟用(社群版政策;與 macOS Pro 版本的細分相同)。切換:gateway_arp_lock_enabled

ARP 欺騙偵測(通知優先)

監視 /proc/net/arp 是否有一個 IP 對應到多個 MAC 以及網關 MAC 的可疑突然變化。 鎖定中:切斷所有流量(氣隙)+通知。 在平衡/可信任網路上通知而不切斷;使用者從 RoamSwitch 觸發緊急 Air-Gap。這樣 (a) 可以阻止攻擊者將單一欺騙性 ARP 封包武器化以導致自身造成的中斷,並且 (b) 可以阻止路由器重新啟動或存取點漫遊錯誤地觸發它。切換:arp_spoof_guard_enabled

端口異常守衛

自動包含新暴露給外部 LAN 的偵聽連接埠(後門、C2 或意外綁定至 0.0.0.0 的開發伺服器/本機 LLM API)。結論是 baseline-relative,而不是「危險連接埠號碼」。啟用後,目前公開的可執行檔被學習為「已知」;此後,僅標記 新出現的 公開的可執行檔(身分 = 可執行檔路徑,快照標準化為 snap:<name>)。系統守護程序超出範圍。遏制是透過 inet roamswitch_dev_guard 表進行的:將 TCP 從 lo 以外的任何連接埠丟棄到該連接埠 — 機器本身繼續使用它。自動遏制後,會立即出現桌面通知和確認對話方塊(「允許此連接埠」/「保持封鎖」),允許一鍵永久列入白名單。還可以從端口診斷螢幕單獨允許任何端口,並重新捕獲基線。預設開啟。切換:port_anomaly_guard_enabled。從 macOS 移植。

Docker 風險偵測與防火牆繞過防護

Docker 的公開連接埠(-p)存在繞過主機標準防火牆的已知問題,因此會始終在 DOCKER-USER 鏈中插入檢查規則,封鎖未被明確允許的外部流量(無需設定,預設始終啟用)。此外,還會即時監視 docker events,在 --privileged 容器啟動或掛載 /var/run/docker.sock(容器逃逸風險)的瞬間偵測並立即通知。由於這僅是有風險的設定而非確認的入侵,因此僅提供通知,不會自動封鎖。

機密資訊/API 金鑰洩漏掃描器

透過夏農熵與模式比對偵測 OpenAI、Anthropic、AWS、GitHub、Slack、Stripe 等 API 金鑰及 SSH 私鑰。roamswitch audit-secrets <text|檔案|目錄> 除文字、檔案外,還可遞迴掃描整個目錄(自動跳過 .gitnode_modules 等,超過 2MB 或疑似二進位的檔案將被跳過)。也可透過 audit_secrets MCP 工具及 Python SDK 的 audit_secrets_directory() 呼叫相同功能。內容絕不會傳送到任何地方。

首次運行設定精靈和確認 UI

軟體包附帶 /etc/xdg/autostart/roamswitch.desktop,因此安裝精靈在安裝後首次登入時啟動(此後它僅駐留在托盤中)。啟用/停用安全防護會顯示與 macOS 版本相同的防護的確認對話框(連接埠異常、ARP 自動遏制、USB 儲存、BadUSB 鍵盤、藍牙)。事件時決策(未知的 USB 鍵盤、未註冊的 USB 隨身碟、自動封鎖的未知連接埠、緊急氣隙)以模式對話方塊的形式呈現。

§5

香農熵突發檢測·YARA掃描

寫入事件依照 PID 進行追蹤。如果單一進程在 5 秒內建立 20 個或更多 distinct 文件,且熵≥ 7.92,則會被視為勒索軟體批次加密:該進程會被 SIGSTOP 凍結,並觸發 Air-Gap。

  • YARA 掃描與熵追蹤完全分離 — YARA 惡意軟體檢查無例外地應用於所有寫入檔案(零繞過、掃描 ~/.cache/node_modules//tmp/ 和存檔)。同時,勒索軟體熵爆發分析排除了自然壓縮格式(.zip.tgz.tar.gz.gz.png.jpg.mp4.wasm)和經過驗證的包管理器(npmnpxcargorustcdpkg SIGSTOP 凍結。
  • 相同檔案的重複覆蓋 (例如 shred 的三次)算一個事件。
  • 關鍵程序保護 — PID 根據硬編碼的 NEVER_FREEZE 清單(systemddockerdNetworkManagersshdgnome-shell、...)進行檢查,並且永遠不會凍結,從而防止機器範圍內的掛起。

金絲雀(誘餌文件)

誘餌檔案被放置在使用者的文件、桌面、下載和圖片資料夾以及專用目錄中,並以 3 秒為週期與 SHA-256 基線進行比較。任何重新命名、刪除、截斷或內容變更都會立即觸發 Air-Gap。因為守護程式以 root 身分執行,所以它會列舉 /home/* 並將金絲雀部署到每個真實使用者的目錄中。

fanotify 監控 · 隔離函式庫 · ClamAV

  • 守護程式在掛載層級監視 /home/var/tmp/dev/shm,並透過 FAN_CLASS_CONTENT(後備 FAN_CLASS_NOTIF)在檔案系統層級監視 /
  • 通知優先,無靜默隔離。 裸露的 YARA / ClamAV 命中是 絕不會靜默隔離或 FAN_DENY’d。真實簽名在 /run/roamswitch/approvals.json 中提出模式請求(隔離/允許/稍後);在使用者確認之前,任何內容都不會進入保管庫。只有實際的 execveFAN_DENY,只有當 pre_exec_blocking_enabled 開啟時。批准超時失敗開放。
  • EICAR 等測試簽章僅記錄至通知歷史 — 業界標準測試字串不會發出通知,只會記錄至通知歷史,並且在 fanotify 防護和下載防護中都不會被隔離或阻止。
  • YARA 和 ClamAV 掃描器都遵循使用者配置的 scan_exclusions 路徑清單(絕對路徑,遞歸應用;它包含舊版 clamav_exclusions)。提示上的「允許」和「隔離」標籤中的「復原」都附加到它,因此不會重新標記相同檔案。
  • 偵測到並確認的真正惡意軟體已轉移到 ~/.local/share/roamswitch/quarantine/。金庫是0700;每個樣本都是 0400 (唯讀,不可執行)。復原時,檔案會返回 0644 並被 chowned 到目標目錄的擁有者。
  • 權限事件循環執行零檔案系統 I/O — 配置由專用後台執行緒讀取到 Mutex<GuardConfig> 快照中;熱路徑存取器只是鎖定和複製。這是一個設計不變性:阻塞 FAN_OPEN_PERM 會凍結機器。
  • 當 ClamAV 存在時,會根據本機資料庫掃描新下載的執行檔(.sh.deb.elf、...)和危險的 AI 模型(.pkl.pt)。 ClamAV 是 可選依賴項 ;沒有它,其他防禦措施也能發揮作用。安裝後,每日更新程式 (§11) 會呼叫 freshclam,以便簽章資料庫保持最新狀態。

核心本地權限提升 (LPE) 搶佔與強化

當攻擊者或惡意軟體取得非特權使用者立足點時,深度防禦可防止利用 Linux 核心漏洞取得 root 權限。

  • 停用非特權使用者命名空間(Frag Gap CVE-2026-53362 緩解) — 許多現代 Linux 核心 LPE 漏洞依賴非特權使用者呼叫 unshare(CLONE_NEWUSER) 來建立隔離的使用者命名空間,隨後存取未初始化的核心結構或具有提升的命名空間功能的舊網路子系統。 RoamSwitch 透過一鍵強化或設定精靈評估並實施 user.max_user_namespaces = 0(或 kernel.unprivileged_userns_clone = 0)。即使使用未修補的核心零日漏洞,這也可以關閉非特權程序的攻擊面。
  • Yama LSM 內存保護 — 強制執行 kernel.yama.ptrace_scope = 1(或 2)可防止未經授權的進程透過 ptrace 附加或透過 /proc/$pid/mem 讀取內存,從而保護瀏覽器會話和 GPG/SSH 私鑰。
  • Core Dump Suppression — 設定 fs.suid_dumpable = 0 可防止敏感進程將純文字記憶體轉儲寫入磁碟而導致崩潰。
  • /tmp/dev/shm noexec 安裝防禦 — 為了防止有效負載丟棄並執行攻擊,RoamSwitch 在連接到不受信任的網路時會使用 noexec,nosuid,nodev 重新安裝 /tmp/dev/shm

eBPF 運行時威脅感測器和自主進程凍結(桌面 eBPF Guard)

RoamSwitch 用戶端守護程式包含與核心內現代 eBPF 感測器(Falco / Tetragon / BTF)的本機整合。

# eBPF 執行時威脅偵測與自主攔截流程
[惡意程序 (LPE/惡意軟體)]
    │ 非法系統呼叫執行 (Frag Gap 利用嘗試)
    ▼
[Linux 核心 (eBPF 探針)]
    │ eBPF 環形緩衝區 (2MB 精簡設計)
    ▼
[Falco (RoamSwitch Optimized)]
    │ 記憶體內 UNIX 通訊端直接通訊 (/var/run/roamswitch/events.sock)
    ▼
[roamswitch-daemon (root)]
    ├─► ① 以毫秒級凍結攻擊程序:kill(pid, SIGSTOP) [狀態:Ts]
    ├─► ② 完全切斷網路:nftables input/output drop [啟動 Air-Gap]
    └─► ③ 桌面緊急通知:GTK3 模態視窗 & libnotify 通知
  • Direct UNIX Domain Socket IPC (/var/run/roamswitch/events.sock) — 來自 Falco 或其他 eBPF 感測器的警報直接透過記憶體中 UNIX 套接字接收,無需寫入磁碟日誌,從而消除磁碟 I/O 延遲並實現亞秒響應切換。
  • 自主多層緩解(處理凍結和氣隙) — 當收到優先順序為 CriticalEmergency 的事件(例如核心 LPE、命名空間逃逸或勒索軟體執行)時,守護程序在違規 PID 上執行 SIGSTOP 以立即暫停進程執行(狀態:13__3__),跨隙 inet roamswitch5__ 部署。
  • 面向桌面的低負載及日誌膨脹防止調校(RoamSwitch Optimized) — 為抑制筆記型電腦與工作站的電池消耗、CPU 負載與磁碟耗盡,隨附了最佳化設定檔(99-roamswitch-optimized.yaml):
    • 嚴重性過濾 (priority: warning) — 過濾掉 95% 的常規通知/資訊事件。
    • Kernel Early Drop (drop_failed_exit: true) — 直接在核心驅動程式中丟棄失敗的系統呼叫退出,將上下文切換和 CPU 負載減半。
    • 緊湊環形緩衝區 (cpus_for_each_buffer: 2) — 將環形緩衝區大小減少至 2MB,將常駐 RAM 保持在 30–50MB,CPU 使用率 <1%。
    • 強制日誌輪替上限 (/etc/logrotate.d/roamswitch-falco) — 透過 7 代壓縮輪換強制實施嚴格的 50MB 上限。
  • 混合彈性(獨立與 eBPF 模式) — 沒有 Falco,RoamSwitch 透過核心 sysctl (user.max_user_namespaces = 0)、nftables 漫遊設定檔、fanotify 熵追蹤和金絲雀來保護系統。透過 Falco,深層核心行為遙測可攔截進階零日漏洞並即時凍結攻擊者進程。

§6

USB事件被監控;追蹤鍵盤類別 (HID) 裝置和 USB 大容量儲存。 預設為關閉 (出貨 isEnabled = false,與 macOS USBKeyboardGuard / USBStorageGuard 相符)。從首次執行精靈或 USB 標籤中選擇加入;啟用會顯示確認對話方塊。

流氓 USB 鍵盤(擊鍵注入)

  • 無核心層級實體連接埠取消授權(重要)。舊的實作(≤1.0.6)將 0 寫入 /sys/bus/usb/devices/*/authorized 對於未註冊的鍵盤,物理上斷開連接。在鍵盤+滑鼠組合接收器(常見於 Raspberry Pi 或迷你 PC)上,這也會斷開滑鼠連接,從而鎖定沒有內建輸入的機器。 RoamSwitch 現在硬拒絕將 authorized=0 寫入任何暴露 HID 介面 (bInterfaceClass 03) 的設備,守護程式在啟動時重新授權任何 authorized==0 HID 設備,以自我修復先前版本變磚的機器。
  • 按鍵在軟體中刪除。 在偵測到未註冊的鍵盤時,會在該裝置的 /dev/input/eventN 上取得獨佔的 evdev EVIOCGRAB(僅在 /proc/bus/input/devices 中具有 kbd 處理程序的節點,與 VID:PID 相符)。滑鼠節點未受影響。這是 macOS CGEventTap 的 Linux 版本;裝置保持通電狀態。
  • Safety — 只有在有另一個鍵盤可供輸入(內建鍵盤或經批准並連接的 USB 鍵盤)時才會進行抓取,因此具有單一新鍵盤的機器永遠不會被鎖定。
  • 核准對話方塊 — 在抓取旁邊,核准請求在 /run/roamswitch/approvals.json 中排隊,GUI 顯示模式(允許/拒絕)。允許將裝置列入白名單並釋放抓取。 3 分鐘後失效打開。

流氓 USB 大容量儲存設備

當插入未註冊的 USB 大容量儲存裝置(無 HID 介面)、啟用防護且網路不受信任/處於鎖定狀態時,它會以 authorized=0(對於非 HID 裝置來說是安全的)儲存,並顯示核准對話方塊。允許重新授權和白名單;拒絕保留。 macOS 版本與 1.7.4 中的「保留唯讀 + 核准提示」模型保持一致。

識別和追溯

HID 由 bInterfaceClass == "03"/proc/bus/input/devices 中的 Handlers= 行決定。組合接收器(一個 VID:PID 帶有 kbd 和滑鼠部分)由 VID:PID 合併。 守護程式啟動時出現的未註冊鍵盤是祖父;僅抓取事後熱插拔的鍵盤。

§7

roamswitch-core 中的 LinuxHealthChecker 評估 24 個項目,並產生 0-100 分、A-F 等級和每個項目的建議。從 GTK 儀表板、CLI (roamswitch status) 和 MCP (get_security_report) 中, 所有 24 個項目的標題、詳細資訊和推薦均以使用者的語言 (10 種語言)顯示。

評估類別
類別範例專案
磁碟/啟動LUKS / dm-crypt 加密、UEFI 安全啟動
存取控制LSM (AppArmor / SELinux)、SSH / sudo 設定審核
內核強化sysctl 強化、非特權使用者命名空間停用(碎片間隙緩解)、核心轉儲控制、/tmp/dev/shm 上的 noexec
更新自動安全性更新配置
網路ARP欺騙監控、閘道ARP/NDP鎖定狀態、暴露埠稽核、Wi-Fi加密強度
惡意軟體ClamAV / fanotify (也檢查守衛是否實際運作) / 熵監控 / noexec
瀏覽器Firefox / Chrome / Chromium 安全瀏覽設置
網域解析/USB威脅防護 DNS、USB 匯流排的零信任狀態

每次檢查都基於讀取本機檔案和命令輸出(getenforcemokutilresolvectlss、...)。 沒有任何類型的外部查詢。

信任感知分級. RoamSwitch 故意在受信任(家庭)網路上套用 not 進行強化 — 將網關 MAC 固定為永久(這將在路由器重新啟動時使 LAN 陷入黑洞)、重新安裝 /tmp/dev/shm noexec 下的系統套件顯示為綠色帶有解釋而不是紅色的“未強化”,並指出它會自動應用於不受信任的網路。執行時期真相來自 /run/roamswitch/state.json (active_level / network_trusted / fanotify_ready),由守護程式在每個週期寫入。 fanotify 項檢查防護是否確實被標記並且正在運作(/run/roamswitch/fanotify.ready),而不僅僅是核心支援它。暴露連接埠項目讀取守護程式的即時設定檔(MCP 硬程式碼已消失)。

每項強化。 具有自動修復功能的失敗項目(核心 sysctl / Yama / 核心轉儲、/tmp noexec、USB 零信任、網關 ARP 固定、威脅保護 DNS、fanotify 防護關閉時重新啟動守護程序)在 GTK 儀表板中帶有「🔧 強化」按鈕。守護程式以 root 身分執行,因此除了守護程式重新啟動之外不需要 pkexec

§8

roamswitch-mcp 透過 stdio 進行 JSON-RPC,由 Claude Desktop、Cursor 和 Antigravity 等 AI 用戶端產生。每個工具都是只讀且完全本地

暴露的工具
工具目的
取得安全報告24項評估、評分、建議
取得暴露端口暴露的連接埠及其防火牆阻止狀態
獲取守衛狀態目前保護等級和防禦模組狀態
審核網址安全啟發式 URL 安全分析(不取得目標)
審計秘密偵測文字中的 API 金鑰/秘密(不傳輸文字)
審計安全日誌本機日誌/驗證日誌的聚合
get_quarantine_status / get_canary_status檢疫和加那利州
取得應用程式協助搜尋內建知識庫
run_active_vuln_scan僅限 127.0.0.1 的非破壞性實證漏洞驗證。唯一會使用網路的工具,預設關閉,需於設定中主動啟用。
run_package_cve_scan將已安裝的套件(Mac:Homebrew / Linux:dpkg・dnf・zypper・pacman)與本機 CVE 對照表比對。完全不產生任何網路通訊。
run_package_cve_scan_languages將 npm / PyPI / crates.io / RubyGems / Packagist / Go / Maven 等相依性鎖定檔與同一本機 CVE 對照表比對。完全不產生任何網路通訊。
verify_fim對約 150 處關鍵系統檔案重新計算雜湊,並與基準比對以驗證是否遭竄改。
get_file_scan_guard_status回傳檔案掃描防護(ClamAV)的設定,以及其所用隔離 Vault 的狀態。
get_port_anomaly_incidents回傳連接埠異常防護的基準狀態、目前自動阻斷的連接埠,以及最近 50 筆事件。回應中明確註明:目前自動阻斷的連接埠是不含時間戳記的當前狀態快照,與含時間戳記的事件歷史是兩回事。
get_ebpf_incidents回傳 eBPF 執行期防護的目前隔離狀態,以及觸發隔離的事件歷程。
get_resource_guard_incidents回傳資源耗盡/行程異常偵測防護的歷程(記憶體洩漏、當機迴圈),並附信心等級。
get_notification_history回傳 RoamSwitch 傳送的通知(安全記錄稽核異常、ClickFix 偵測等)歷史記錄,最近1週、最新在前。
get_incident_timeline將各防護模組的偵測結果整合為單一時間軸回傳(含行程譜系與 MITRE ATT&CK 標籤,實驗性)。

MCP 伺服器自身不開啟任何網路連線,僅透過 roamswitchkit 連線守護行程的 Unix 通訊端,或直接呼叫 roamswitch-core 的邏輯。唯一的例外是預設關閉的 run_active_vuln_scan,它會向本機 127.0.0.1 送出非破壞性探測。

在本機 LLM 實戰演練中發現並修正的錯誤歸因問題
2026 年 9 月,我們使用本 MCP 伺服器讓本機 LLM(Qwen 3.8 27B)進行一次事件調查實戰演練(fire drill)時,發現模型誤讀了 get_port_anomaly_incidents 回傳的資料,把一個與本次事件無關的舊連接埠阻斷紀錄,錯誤地編入了目前正在發生的事件敘述中。原因在於:不含時間戳記的「目前阻斷連接埠」快照,與含時間戳記的真實事件歷史,在同一個回應中未加區分地一併回傳。修正方案是新增說明欄位,明確標註哪一部分是時間軸資料、哪一部分只是快照。修正後,用同一情境對同一模型重新執行,模型引用了說明欄位中的文字,明確拒絕將舊連接埠歸因於目前事件。我們透過自動迴歸測試與真實本機 LLM 重現兩種方式,驗證了修正的有效性。

§9

RoamSwitch for Linux 讓 恰好是一種出站請求 :簽署清單的每日更新者 GET (§11)。其他一切——每項評估、檢測和審計——都在本地完成。 RoamSwitch for Linux 是專有的免費軟體,其原始碼未公開,因此以下檢查由 lafine 執行;結果在 9.2 中,並且附錄 C 中的步驟可以單獨從分散式套件中重現。

9.1 審核方法

  1. Crate 隔離 — HTTP/TLS 堆疊僅允許在 一個 crate roamswitch-updater 中使用,它建立獨立的計時器驅動的更新程式二進位檔案。如果 roamswitch-coreroamswitch-daemonroamswitch-approamswitch-mcproamswitchkit 引入 reqwest / hyper / ureq / rustls / native-tls / openssl,或 roamswitch-updater 之外的任何 .rs中運行,門控)將導致建置失敗TcpListener / UdpSocket / to_socket_addrs / lookup_host
  2. 依賴樹檢查 — 搜尋完整的 Cargo.lock 以尋找遙測/分析/崩潰報告 SDK(sentryopentelemetry,...)。
  3. roamswitch-updater review — 它的單一請求目標,沒有查詢字串/cookies/識別標頭,以及它下載的所有內容的 Ed25519 驗證。
  4. 子程序列舉 - 每個Command::new(...)呼叫站點都經過審查。

9.2 結果

審核結果
審核項目結果
HTTP / TLS 堆疊僅存在於 roamswitch-updater (ureq + rustls) 中。不在 core / daemon / app / mcp / kit
遙測/分析/崩潰報告 SDK不存在任何地方
TcpStream / TcpListener / UdpSocketroamswitch-updater 之外沒有出現一次
使用的 Socket APIAF_UNIX(本地IPC);AF_NETLINK(NFQUEUE 判決通道、nftables 和 ip neigh 控制 — 無出口);AF_INET onlyroamswitch-updater 中。 VPN 隧道 (§4) 啟用後,是 wg-quick(WireGuard 後端)或 tailscaled(Tailscale 後端)-子進程,而不是守護程式-將流量傳送到使用者自己的端點/tailnet
每日更新每約 24 小時 1 個 GET https://lafine.net/updates/v1/manifest。沒有查詢字串,沒有cookie,通用用戶代理,沒有識別碼。所有有效負載均經過 Ed25519 驗證。 updates.enabled = false 完全禁用它
VPN 隧道 (§4)預設關閉。啟用後,wg-quick 會建置一條到 使用者自己的 .conf 端點的 WireGuard 隧道 — 與 lafine 無關。透過 getent ahosts (glibc NSS) 解析端點主機名,而非 Rust 套接字 API
許可證啟動離線Ed25519簽章驗證。與啟動伺服器沒有通信
結論

RoamSwitch for Linux 只發起一種出站請求 - 每日僅接收簽名檢測資料的下載,不包含有關使用者或電腦的資訊。產品中的任何其他內容都不會與外部伺服器聯繫。

9.3 面向外部的操作的完整列表

每個可能導致資料包直接或間接離開本機的操作:

#操作目的地觸發發送了什麼
1每日更新程式GET /v1/manifest,以及版本變更時的提要文件lafine.net/updates/v1 (CDN)systemd 計時器,每約 24 小時一次,隨機延遲。停用 updates.enabled = falseroamswitch-update.timer 時關閉普通的 HTTPS GET:沒有查詢字串,沒有 cookies,通用 User-Agent 與使用者或機器無關。接收簽署的清單 + feed
1afreshclam(ClamAV 自己的更新程式),安裝 ClamAV 時由每日更新程式呼叫ClamAV 計畫的 CDN作為 #1 的一部分ClamAV 本身的流量(一個單獨的專案); RoamSwitch 只啟動它
2ping -c1 -W1 <網關 IP>LAN 預設閘道(連結本地)在 ARP 欺騙檢測期間刷新 ARP 快取僅 ICMP 回顯請求。無 DNS 解析,無負載
3啟動系統瀏覽器 (xdg-open)https://lafine.net/...(產品站點)僅當使用者點選按鈕(例如「開啟發行說明」)時RoamSwitch 進程未開啟套接字;它將 URL 傳遞給作業系統瀏覽器
4解析 dns ...—(無通訊發生)不受信任網路上的威脅保護 DNS(選擇加入)。 <iface> 是每個帶有預設路由的實體網路卡(同時有線+無線;lo / tailscale* / wg* / docker* / veth* 除外);當 dns_scope = always_on 時也應用於可信任網路;協調每個哨兵週期它僅更改作業系統解析器設定; RoamSwitch 本身不發送 DNS 查詢
5套件管理器更新發行版的 apt / dnf / zypper 儲存庫用戶運行apt upgrade等,或點選GUI「立即升級」按鈕(透過pkexec運行apt-get / dnf / zypperRoamSwitch 讀取本機 apt-cache policy 輸出並啟動套件管理器;與拉芬無關
6VPN 隧道 (§4) — WireGuard 後端:隧道 wg-quick 建造/Tailscale 後端:tailscale set --exit-node 透過出口節點路由所有流量使用者自己的VPN端點/tailnet(WireGuard:.conf中的端點;Tailscale:所選的出口節點和DERP中繼)vpn_on_untrusted_enabled 且網路不受信任時。預設關閉加密的 WireGuard / Tailscale 流量;目的地是使用者自己的VPN伺服器/tailnet,與lafine無關。透過 getent ahosts (glibc NSS) 進行 WireGuard 端點解析; Tailscale 由 tailscaled 驅動(一個單獨的進程)

所有其他 RoamSwitch 功能 — nftables 控制、鄰居表的 ARP/NDP 固定(ip neigh,無資料包出口)、連結保護(NFQUEUE,僅 AF_NETLINK)、連接埠掃描(解析 ss 輸出)、ARP 監控、健康評估、熵監控、金絲雀、fanotify、USB 監控本機檔案讀取來完成以及子程序輸出的分析。 §4 VPN 隧道是唯一的“用戶明確配置的出站通訊”,其目的地是用戶自己的 VPN 伺服器 - 沒有資料流向 lafine 的基礎設施。

§10

  • 沒有帳戶 — 無需用戶註冊,無需登錄,也無需請求電子郵件地址。
  • 配置僅在本機 — 以明文形式儲存在 ~/.config/roamswitch/config.json 處,並且永遠不會離開機器。沒有雲端同步。
  • 評估結果僅在本機 — 安全性報告和日誌審核結果僅顯示在螢幕上,如果使用者選擇,也可以匯出至本機檔案。
  • 許可證金鑰已離線驗證 — Pro / Business 許可證令牌包含 Ed25519 簽章並使用公鑰進行驗證。不會向 lafine 伺服器發出任何查詢。
  • 沒有崩潰報告 — 發生緊急情況時,不會向任何地方發送堆疊追蹤。
  • 每日更新程式不會傳送任何有關您的資訊 — 沒有查詢字串、沒有cookie、沒有裝置或安裝識別碼、通用User-Agent。這是下載,不是報告。連結防護判決、封鎖的主機和掃描結果僅寫入本機活動視圖/日誌,從不傳送。

§11

版本
版本對於價格許可證
社群版Linux個人使用免費專有免費軟體(捆綁 EULA)
業務(計劃)車隊管理、策略分發、簽署內部 apt、組織 SLA付費商業許可證。相同的二元+層門

macOS RoamSwitch Pro Lifetime 的購買者可以在自己的 Linux 電腦上免費獲得商業功能。

經銷和供應鏈

頻道詳情
APThttps://lafine.net/apt (stable main)。 Release 使用 RSA-4096 金鑰簽名
轉速https://lafine.net/rpm(單獨的 Fedora / openSUSE)。 repomd.xml GPG 簽名
尿素尿率roamswitch-bin(取得 GitHub 發布 tarball,驗證 sha256)
壓縮包GitHub 上的 amd64 / aarch64 .tar.gz + .sha256 版本
  • 固定 glibc 地板 — 發行版二進位檔案建置在 Debian 12(書蟲、glibc 2.36)容器內。這可以防止 Debian 12 / Ubuntu 22.04 及更高版本上的符號版本不符。如果引入需要超過 2.36 的依賴項,「驗證 glibc 底層」CI 步驟將導致建置失敗。
  • 簽署金鑰管理 — apt/rpm 儲存庫簽署的私鑰僅存在於 GitHub Actions 加密金鑰中;僅將公鑰提交至儲存庫。

11.3 每日更新程序

roamswitch-updater 是由 systemd 計時器(roamswitch-update.timer、具有隨機 3 小時延遲的 OnCalendar=dailyPersistent=true)運行的獨立二進位。它是到達網路的唯一組件。每次運行:

  1. GET https://lafine.net/updates/v1/manifest 及其獨立簽章。
  2. 使用專用的威脅來源簽章金鑰驗證清單的 Ed25519 簽章 - 與 Sparkle 應用程式更新金鑰分開。伺服器端 CI 每天都會對 feed 進行重新簽名,以便私鑰存在於 CI 秘密中;將其範圍限定為提要意味著洩漏只會讓攻擊者提供錯誤的阻止清單(污水坑/警告 - 沒有程式碼路徑,沒有應用程式更新路徑)。應用程式更新簽章金鑰永遠不會離開 macOS 鑰匙圈。未驗證的清單將被丟棄 - 更新程式永遠不會回退到未簽署的資料。
  3. 如果威脅來源版本發生更改,請下載該來源,驗證其 SHA-256 和 Ed25519 簽名,並為連結防護自動安裝它 (§4)。
  4. 如果安裝了 ClamAV,則呼叫 freshclam
  5. 記錄最新的應用程式版本以取得通知(更新程式 never 安裝應用程式;在 Linux 上,使用者執行 apt upgrade)。

任何步驟的失敗(離線、錯誤簽署、freshclam 遺失)都會記錄為 updates.lastError 並且程序仍然退出 0,因此計時器運行永遠不會產生 systemd 失敗通知。整個機制被 updates.json 中的 updates.enabled = falsesystemctl disable --now roamswitch-update.timer 停用;然後,該產品將根據套件中捆綁的資料運作。威脅來源也在 套件內 中提供,因此全新安裝在更新程式運行之前就有一個工作來源,並且 apt upgrade 即使在禁用更新程式的情況下也會刷新它。

§12

  • OS:Ubuntu 22.04 / 24.04 及更高版本、Debian 12 及更高版本、Linux Mint / Pop!_OS / Primary / Zorin、Raspberry Pi OS 64 位元 (Bookworm)、Ubuntu for Raspberry Pi
  • 架構:x86_64 / aarch64
  • Requiredsystemdnftablesiproute2ip neigh — ARP/NDP 鎖定)(由 .deb / .rpm 依賴項自動拉入)
  • clamav(惡意軟體掃描)、nmcli(Wi-Fi 加密檢測)、libnotify(桌面通知)、wireguard-tools(VPN 隧道的 WireGuard 後端 + 終止開關,§4)、tailscale(其 Tailscale 後端,§4)、polkit / GUI__ 運行從 GUI 14)、polkit / GUI__ 運行升級/ GUI__4)、polkit/ GUI__ 運行從
  • 不支援:非systemd發行版(Alpine / Void / Devuan)
  • Display:1280×720或更大(視窗和字體自動縮放到螢幕尺寸,支援小型Raspberry Pi顯示器)

附錄 A

板條箱目的網路
serde / serde_json配置和IPC的序列化
東京非同步運行時(features = ["full"],但僅使用 Unix 套接字)無(無 TCP)
追蹤/追蹤訂閱者日誌記錄(本地/日誌)
這個錯誤/無論如何錯誤處理
正規表示式字串解析(診斷、CSS 縮放)
網址URL 解析(audit_url_safety 啟發式)無(不獲取)
計時日期/時間處理
ed25519-dalek離線驗證許可證簽名
Base64/SHA2許可證令牌、金絲雀哈希
chown / kill / 系統調用
伊德娜解碼 IDN/punycode 主機以進行同形異義字偵測
nfq(僅限守護程式)連結防護的 NFQUEUE 綁定 — 純 Rust,AF_NETLINK無(判定通道,無出口)
打開呼叫 xdg-open 表示“開放發行說明”進程本身不進行通信
GTK3 / ksni(僅限應用程式)GUI 和托盤
ureq + rustls(僅限 roamswitch-updater每日更新者的一次 HTTPS GET樹中唯一的 HTTP/TLS 堆疊;僅限於更新程式二進位文件
要點

roamswitch-coreroamswitch-daemonroamswitch-approamswitch-mcproamswitchkit 中未出現 HTTP 用戶端、TLS 堆疊或遙測 SDK。 ureq + rustls 僅出現在 roamswitch-updater 中(scripts/audit_no_network.sh 在 CI 中強制執行此操作)。任何地方都沒有遙測 SDK。

附錄 B

table inet roamswitch {                 # 設定檔防火牆(Air-Gap / balanced / lockdown)
    chain input {
        type filter hook input priority -100; policy <accept|drop>;
        iif "lo" accept
        ct state established,related accept
        # balanced/lockdown:其餘全部 drop
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # 僅在 Air-Gap 時 policy drop,僅允許 lo 與 ct established
    }
}

table inet roamswitch_linkguard {        # §4.5 — 獨立於設定檔表
    chain output {
        type filter hook output priority 0; policy accept;
        udp dport 53                       queue num 92 bypass
        tcp dport 53                       queue num 92 bypass
        tcp dport { 80, 443 } ct state new,established queue num 92 bypass
    }
}

table inet roamswitch_dev_guard {        # §4 連接埠異常防護/手動連接埠隔離,獨立的表
    chain input {
        type filter hook input priority -10; policy accept;
        iif != "lo" tcp dport { … } drop
    }
}

table inet roamswitch_vpn {              # §4 WireGuard 後端網路阻斷開關
    chain output {
        type filter hook output priority -150; policy drop;
        oifname "lo" accept
        oifname "roamswitch" accept
        meta l4proto { icmp, ipv6-icmp } accept
        udp sport 68 udp dport 67 accept          # DHCP
        ip  daddr { <endpoint v4> } udp dport <port> accept
        ip6 daddr { <endpoint v6> } udp dport <port> accept
        ct state established,related accept
    }
    chain input  { type filter hook input priority -150; policy drop; … }  # 對稱
}

table inet roamswitch_ts {               # §4 Tailscale 後端網路阻斷開關(較寬鬆)
    chain output {
        type filter hook output priority -150; policy drop;
        oifname "lo" accept
        oifname "tailscale0" accept
        meta l4proto { icmp, ipv6-icmp } accept
        udp sport 68 udp dport 67 accept          # DHCP(v6 端同樣對稱)
        ip  daddr 100.64.0.0/10 accept            # tailnet CGNAT
        ip6 daddr fd7a:115c:a1e0::/48 accept
        ip  daddr 100.100.100.100 udp dport 53 accept   # MagicDNS
        ip  daddr 100.100.100.100 tcp dport 53 accept
        udp dport 3478 accept                     # STUN
        udp dport 41641 accept                    # WireGuard 直連
        tcp dport 443 accept                      # DERP 回退
        ct state established,related accept
    }
    chain input  { type filter hook input priority -150; policy drop; … }  # 對稱
}

網關/IPv6 路由器/DNS 解析器 (§4) 的 ARP/NDP 固定是在核心鄰居表 (ip neigh replace … nud permanent) 中完成的,而不是在 nftables 中完成的。固定條目記錄在 /var/lib/roamswitch/arp_lock.json 中。

附錄 C

本文檔中的每項聲明都可以在您自己的機器上進行驗證。以下命令在安裝了 roamswitch 軟體包的主機上執行。

C.1 出站流量驗證

守護程式/應用程式/MCP二進位檔案連結沒有HTTP/TLS庫

for b in roamswitch-daemon roamswitch-app roamswitch-mcp; do
  ldd "$(command -v $b)" | grep -iE 'ssl|crypto|nghttp|curl' && echo "  ^ in $b"
done
# → 無輸出。HTTP/TLS 協定堆疊僅靜態連結至 roamswitch-updater。

正在運作的守護程式沒有網路套接字

sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -i
# → 無輸出 = 沒有任何 TCP/UDP 網際網路連線
sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -U | grep roamswitch
# → 僅 /run/roamswitch/roamswitch.sock(連結防護會額外使用 AF_NETLINK 通訊端,
#   但這是核心通道,並非網際網路通訊端)

RoamSwitch 唯一的出口是每日更新

watch -n 5 'sudo ss -tupn | grep -E "roamswitch-(daemon|app|mcp)" || echo "(none)"'
# → 始終為 "(none)"。這三者從不開啟任何網際網路通訊端。
systemctl list-timers roamswitch-update.timer
sudo systemctl start roamswitch-update.service
journalctl -u roamswitch-update.service -n 20 --no-pager
# → 僅向 lafine.net/updates/v1 發出一次 HTTPS GET,隨後結束。

停用它並確認完全沉默

sudo systemctl disable --now roamswitch-update.timer
# 或將 /var/lib/roamswitch/updates.json 編輯為 "enabled": false
sudo strace -f -e trace=network -p "$(pgrep -x roamswitch-daemon)" 2>&1 | grep -i 'connect('
# → 僅 connect 至 AF_UNIX / AF_NETLINK。AF_INET / AF_INET6 從未出現。

C.2 可重複的防禦驗證(Docker 測試套件)

RoamSwitch 的所有檢測、控制和防禦機制(氣隙執行、防火牆破壞後的自我修復、勒索軟體金絲雀篡改、/tmp noexec、Yama LSM、同形異義詞網絡釣魚攔截和憑證洩漏檢測 — 總共 17 項) 可以使用公共支持存儲庫中提供的官方洩漏測試套件安全地複製和驗證,而不影響主機網路或檔案(roamswitch-支持

# 取得並重現驗證套件(使用官方發行套件,在隔離容器內自動驗證)
git clone https://github.com/lafine1211/roamswitch-support.git
cd roamswitch-support/test/docker
docker build -t roamswitch-test .
docker run --rm --privileged roamswitch-test

測試容器會自動從 APT 儲存庫 (lafine.net/apt) 取得官方發行包,並在隔離的網路和掛載命名空間內評估以下每個系統測試項目(SP-1–11、PENT-1–7)。

(1) 自主網路防禦與氣隙自愈

身分證號場景驗證方法通過標準
SP-3氣隙啟用 → 出口下降發送 enable_air_gap IPCpolicy drop 應用於輸出掛鉤;所有出站流量均被阻止
SP-3b防火牆強制清除和自我修復透過 nft delete table inet roamswitch 清除規則Anti-Clobber 自癒功能可在 5 秒內恢復掉落規則
SP-3c跨守護程式重新啟動時失敗關閉硬終止守護程式 (SIGKILL) 中氣隙並重新啟動出口丟棄策略在重啟後無縫持續
SP-3d授權氣隙恢復發送授權disable_air_gap IPC取消丟棄策略,刪除所有標記文件,恢復出口
SP-8預防性 ARP/NDP 固定在隔離的netns網關環境中啟用→傳送欺騙性的免費ARP網關鄰居條目仍為 PERMANENT;欺騙 ARP 被忽略
SP-9VPN 終止開關 (WireGuard)單獨網路中的 Live WireGuard 伺服器,導入 .confvpn_up握手透過inet roamswitch_vpn完成;隧道死亡時零洩漏
SP-10VPN 終止開關(Tailscale)存根 tailscale CLI + 單獨的網絡,tailscale0 IF隧道外明文 TCP/80 和本機 DNS 被封鎖;允許 DERP 和 MagicDNS

(2) 內核與掛載強化

身分證號場景驗證方法通過標準
SP-11a網路系統強化運行 apply_kernel_sysctl_hardening IPCrp_filter=1tcp_syncookies=1accept_redirects=0 達到目標值
SP-11b記憶體保護和 Yama LSM驗證 ptrace_scopesuid_dumpablekernel.yama.ptrace_scope=1(阻擋窺探),fs.suid_dumpable=0(無核心轉儲)
SP-11c/tmp/dev/shm noexec 防禦運行 apply_mount_hardening IPC/tmp/dev/shm 重新安裝 noexec,nosuid,nodev;執行被拒絕
SP-11d保留合法使用者執行執行標準主目錄 (~/) 中的腳本不受阻礙地運行,不會破壞合法的開發人員/管理工作流程

(3) 多層惡意軟體和勒索軟體防禦和金絲雀

身分證號場景驗證方法通過標準
SP-1金絲雀篡改檢測截斷或重新命名 ~/Documents/ 中的誘餌金絲雀檔案 (.xlsx)在幾秒鐘內偵測到篡改,立即觸發氣隙
SP-2勒索軟體批量加密突發檢測单个进程快速生成多个高熵文件違規工作程序被 SIGSTOP 凍結;氣隙觸發
SP-2bshred 上沒有誤報跨测试文件运行 shred -n 3 -u允許清單匹配可防止誤報檢測或凍結
SP-2c關鍵流程從未凍結在突发检测期间验证冻结目标逻辑關鍵守護程式(dockerdsystemdcontainerd)永遠不會被凍結
SP-4EICAR 測試字串僅用於通知将 EICAR 测试字符串写入 ~/Downloads/不發出通知,僅記錄至通知歷史;檔案永遠不會被自動隔離
SP-4b真正的惡意軟體簽章首先確認在監視資料夾外寫入真實簽名引發模式核准對話框;僅在使用者確認後才隔離
SP-4cQuarantine Vault 權限強化檢查 Vault 目錄和範例檔案的權限保管庫目錄設定為 0700,隔離樣本設定為 0400
SP-4d特權IPC安全原始檔案恢復發送 restore_quarantine_file IPC檔案已使用使用者權限 (0644) 恢復到原始路徑並新增至排除項

(4) 被動式連結防護與網路釣魚防禦

身分證號場景驗證方法通過標準
SP-7mode = block 嚴格執行連接到 feed-listed 或 blocklistExtra 主機在 TLS 層丟棄(SNI 解析);未列出的安全主機達到 HTTP 200
SP-7bmode = warn 故障關閉保持連接到警告主機,無用戶回應(超時 8 秒)逾時時丟棄資料包 (fail-close);僅在明確批准的情況下才允許
SP-7cmode = off 完整拆解停用連結防護inet roamswitch_linkguard 表已完全卸載

(5) BadUSB 緩解與設備控制

身分證號場景驗證方法通過標準
SP-6連接鍵盤祖父檢查守護程式啟動時連接的鍵盤現有設備不再適用;僅抓取後續熱插拔

(6) Docker環境滲透測試套件(17項檢查)

身分證號攻擊向量模擬細節防禦/偵測標準
彭特-1C2 滲漏在氣隙下嘗試將出口 HTTP/TCP 傳送至 C2所有資料包均在 netfilter 處丟棄;零洩漏
PENT-1b韌體強制刪除使用 nft delete table inet roamswitch 清除規則防破壞自我修復可在幾秒鐘內恢復規則
PENT-1c氣隙安全恢復發出經過驗證的 disable_air_gap IPC刪除刪除規則;標記已刪除;連線恢復
PENT-2/tmp 後門/tmp 中執行刪除的後門腳本noexec 安裝保護 (Permission denied) 拒絕
PENT-2b/dev/shm 共享內存執行放置在 /dev/shm 中的二進位有效負載noexec 坐騎防禦阻擋
PENT-2c使用者空間保留在合法使用者目錄(/home/tester/)中執行腳本執行暢通無阻;零工作流程中斷
PENT-3ptrace內存窺探PTRACE_ATTACH 目標提取秘密/令牌被 Yama LSM kernel.yama.ptrace_scope=1 拒絕
PENT-3b核心轉儲秘密抓取觸發進程崩潰以獲取記憶體核心轉儲fs.suid_dumpable=0 阻止
PENT-4金絲雀篡改~/Documents/ 中的清零金絲雀誘餌文件即時檢測大小異常和哈希變化
PENT-4b金絲雀批量擦拭大規模刪除金絲雀誘餌文件立即偵測到檔案遺失,引發事件
PENT-5IP位址欺騙發送帶有欺騙來源IP的資料包rp_filter=1 刪除(反向路徑過濾器)
PENT-5bSYN 洪水 DoS淹沒半開 TCP 連接tcp_syncookies=1 保護的狀態表
PENT-5cICMP 路由劫持注入偽造的 ICMP 重定向封包由於 accept_redirects=0 被忽略
PENT-6西里爾文同形異義字網釣魚導覽至 gооgle.com(西里爾字母同形異義詞)由 LinkGuard 識別,得分 40(危險/區塊)
PENT-6b原始 IP 和明文流量直接出站連接到原始 IP準確標記為安全風險因素
PENT-7OpenAI API 金鑰洩露在程式碼或日誌中公開 sk-proj-... 令牌透過香農熵分析檢測並屏蔽
PENT-7bGitHub 令牌洩漏在代碼中公開 ghp_... 個人令牌透過token模式和熵驗證進行匹配
PENT-8內核 LPE(碎片間隙)搶佔非特權 unshare -U -r(CVE-2026-53362 嘗試)立即被 user.max_user_namespaces = 0 (Operation not permitted) 拒絕
PENT-9eBPF 威脅感測器和流程凍結透過 Falco eBPF 套接字注入關鍵/緊急警報進程在幾毫秒內透過 SIGSTOP 凍結(狀態:Ts);已部署氣隙

(7) 滲透測試總結(獨立增強版與 eBPF 增強版)

在隔離的 Docker 環境中執行的完整滲透測試的結果摘要(目標:帶有 RoamSwitch 用戶端版本的 Ubuntu 24.04;攻擊者:Nmap/curl/hping3;請參閱官方報告 docs/CLIENT_PENTEST_REPORT.ja.md):

驗證類別不含 Falco(獨立強化)使用 Falco(eBPF 增強型)辯方判決
外部連接埠掃描電阻(Nmap SYN)PASS(100% 過濾/放入 LockdownPASS(100% 過濾/放入 Lockdown總外部隱身
外部直接存取截止(TCP/80、3306)PASS(逾時下降/零回應)PASS(逾時下降/零回應)零入境曝光
內核 LPE(碎片間隙)緩解PASSunshare 透過 sysctl 阻止)PASS(eBPF 警報 + SIGSTOP 凍結 + 氣隙)深度防禦驗證
未授權埠偵測(異常)PASS(0.0.0.0 綁定標記為高風險)PASS(0.0.0.0 綁定標記為高風險)100% 偵測與引導
日誌膨脹和 CPU 開銷預防零日誌佔用(已卸載)PASS(95% 雜訊消除/2MB 緩衝區/50MB 上限)桌面最佳化

C.3 已知限制

限制影響緩解措施
在某些核心上,tmpfs (/tmp) 上的 FAN_MARK_MOUNT 不提供任何事件fanotify 不監控 /tmp 下的檔案寫入/tmp 是臨時資料夾,不是受監控的使用者資料夾;勒索軟體的目標是 ~/。明確記錄標記失敗
容器 Overlayfs / tmpfs 上沒有 fanotify 交付無法驗證容器內熵爆發檢測在真實硬體 (ext4) 上進行驗證;線束透過探針自動跳過
RoamSwitch 的 nftables 操作與 Docker 的 iptables-nft 共用 netfilter 空間RoamSwitch 規則操作可能會幹擾 Docker 的 NAT 規則記錄為操作警告;在專用 inet roamswitch 表中隔離,但應避免諸如 nft flush ruleset 之類的整個規則集操作
連結防護只能透過 TLS SNI 查看瀏覽器的 DoH;加密的 Client Hello (ECH) 也隱藏了這一點一旦 ECH 被廣泛部署,使用 ECH 的連接到支援 ECH 的站點就無法透過主機名稱來識別本機封鎖清單和啟發式仍作用於 DNS/HTTP 和非 ECH TLS; DNS 威脅保護(§4.5,選擇加入)涵蓋解析器路徑
每日更新程式的新鮮度取決於 updates.enabled = false 時的發布節奏關閉更新後,提要僅與最後一個 apt upgrade 一樣最新最嚴重的偵測(品牌同形異義詞)無需饋送;選擇重新加入或啟用威脅防護 DNS,以獲得始終最新的覆蓋範圍