開發者 SDK

將 RoamSwitch 的診斷能力直接帶入你自己的 Mac / Linux 應用程式

RoamSwitchKit(Mac)與 roamswitch-linux-kit(Linux)是免費開源用戶端,可讓你的 Swift / Rust 程式碼直接查詢 RoamSwitch 本體計算出的安全診斷結果。無需自行實作 ARP 監控或連接埠掃描,即可將「目前網路是否安全」整合進自己的應用程式。

🍎 RoamSwitchKit (macOS) → 🐧 roamswitch-linux-kit (Linux) →

🔒 為什麼安全

  • 唯讀:不存在切換鎖定、隔離連接埠、退出裝置等操作類 API。串接此套件的應用程式無法在未經使用者同意的情況下變更 RoamSwitch 的設定。
  • 完全本地:以子行程方式啟動 RoamSwitch 本體內建的執行檔(macOS: RoamSwitchMCPServer / Linux: roamswitch-mcp),僅透過標準輸入輸出通訊,絕不向外部伺服器傳送任何內容。
  • 免費開源:基於 MIT 授權發布,任何人都能自由查看原始碼並整合使用。
安裝方法

在套件管理器中新增一行

只需加入 Package.swift 的 dependencies 即可。前提是 macOS 12+、Swift 5.9+,並已安裝 RoamSwitch 1.3.0 或更新版本。

dependencies: [
    .package(url: "https://github.com/lafine1211/RoamSwitchKit.git", from: "1.0.0")
]

只需加入 Cargo.toml 的 dependencies 即可。前提是已安裝穩定版 Rust(2021 edition、tokio 非同步執行環境)以及包含 roamswitch-mcp 執行檔的 RoamSwitch for Linux。

[dependencies]
roamswitch-linux-kit = { git = "https://github.com/lafine1211/roamswitch-linux-kit", tag = "v0.1.0" }
使用範例

透過簡單方法取得診斷結果

import RoamSwitchKit

let client = try RoamSwitchClient()

let report = try await client.securityReport()
print(report.score, report.grade)

let ports = try await client.exposedPorts()
for port in ports.ports where port.overallRisk == "high" {
    print(port.processName, port.port)
}

let status = try await client.guardStatus()
print(status.activeSecurityLevelLabel, status.isCurrentNetworkTrusted)

let urlReport = try await client.auditURLSafety(url: "https://apple.com.login-verify.xyz")
print(urlReport.score, urlReport.riskLevel) // e.g. 20, "dangerous"
use roamswitch_linux_kit::RoamSwitchClient;

let client = RoamSwitchClient::new(None, None)?;

let report = client.security_report().await?;
println!("{} ({})", report.score, report.grade);

let ports = client.exposed_ports(false).await?;
for port in ports.ports.iter().filter(|p| p.overall_risk.as_deref() == Some("high")) {
    println!("{} {}", port.process_name, port.port);
}

let status = client.guard_status().await?;
println!("{} {}", status.active_security_level_label, status.is_current_network_trusted);

let url_report = client.audit_url_safety("https://apple.com.login-verify.xyz").await?;
println!("{} {}", url_report.score, url_report.risk_level); // e.g. 20, "dangerous"
提供的 API

唯讀方法

securityReport()

取得涵蓋 FileVault、SIP、Gatekeeper、防火牆、Wi-Fi 加密強度、ARP 欺騙、外部暴露連接埠等 18 項綜合診斷的評分與改進建議。

exposedPorts(includeLocalOnly:)

列出目前監聽的所有連接埠,對外暴露的連接埠會回傳包含已知危險服務(Redis/MongoDB 等)判定在內的詳細稽核結果。

guardStatus()

取得連接埠防護、ARP自動遏制、USB防護、藍牙防護、網頁/郵件下載保護、DNS威脅防護狀態及當前安全等級。

auditURLSafety(url:)

於本機分析可疑連結或縮網址,檢測網路釣魚、Unicode同形偽裝及高風險TLD(Zero Telemetry)。

其他唯讀方法

方法概要
auditSecurityLogs(hours:)彙總近期安全記錄(Mac:Sudo 驗證失敗、SSH 暴力破解嘗試、Gatekeeper 攔截、XProtect 偵測等 / Linux:Sudo 驗證失敗、SSH 暴力破解、防火牆攔截、AppArmor 拒絕、ClamAV 偵測等),自動遮蔽 API 金鑰、權杖等機密資訊,並回傳以記錄範本化的新模式偵測與頻率異常(統計突增)偵測結果。
activeVulnScan()僅限 127.0.0.1 的非破壞性實證漏洞驗證。唯一會使用網路的工具,預設關閉,需於設定中主動啟用。
packageCveScan()將已安裝的套件(Mac:Homebrew / Linux:dpkg・dnf・zypper・pacman)與本機 CVE 對照表比對。完全不產生任何網路通訊。
packageCveScanLanguages(watchedFolders:)將 npm / PyPI / crates.io / RubyGems / Packagist / Go / Maven 等相依性鎖定檔與同一本機 CVE 對照表比對。完全不產生任何網路通訊。
canaryStatus()回傳勒索軟體誘餌檔案(Canary)的佈署狀態,以及最近 50 筆偵測事件。
portAnomalyIncidents()回傳連接埠異常防護的基準狀態、目前自動阻斷的連接埠,以及最近 50 筆事件。回應中明確註明:目前自動阻斷的連接埠是不含時間戳記的當前狀態快照,與含時間戳記的事件歷史是兩回事。
runtimeThreatStatus()回傳是否因 XProtect 偵測到惡意軟體而進入 Air-Gap 隔離,以及觸發該隔離的事件。排查 Air-Gap 原因時應最先檢視此工具。
notificationHistory()回傳 RoamSwitch 傳送的通知(安全記錄稽核異常、ClickFix 偵測等)歷史記錄,最近1週、最新在前。

各回傳型別的欄位定義以原始 Swift 型別宣告的形式收錄於 GitHub 上的 READMEAGENTS.md

security_report()

取得涵蓋 LUKS/dm-crypt 磁碟加密、UEFI Secure Boot、AppArmor/SELinux、sudo/SSH 設定、ARP 竄改、外部公開連接埠等 24 項綜合診斷得出的評分與改善建議。

exposed_ports(include_local_only)

列出目前監聽的所有連接埠,對外暴露的連接埠會回傳包含已知危險服務(Redis/MongoDB 等)判定在內的詳細稽核結果。

guard_status()

取得連接埠防護、ARP自動遏制、USB防護、藍牙防護、網頁/郵件下載保護、DNS威脅防護狀態及當前安全等級。

audit_url_safety(url)

於本機分析可疑連結或縮網址,檢測網路釣魚、Unicode同形偽裝及高風險TLD(Zero Telemetry)。

其他唯讀方法

方法概要
server_security_report()以伺服器版的 30 項設定檔(核心強化、容器隔離、核心 CVE 暴露、eBPF LSM)執行綜合診斷。
run_active_vuln_scan()僅限 127.0.0.1 的非破壞性實證漏洞驗證。唯一會使用網路的工具,預設關閉,需於設定中主動啟用。
audit_secrets(text)從文字、檔案或目錄中偵測外洩的 API Key 與私密金鑰(偵測值於輸出時已遮蔽)。
audit_security_logs(hours)彙總近期安全記錄(Mac:Sudo 驗證失敗、SSH 暴力破解嘗試、Gatekeeper 攔截、XProtect 偵測等 / Linux:Sudo 驗證失敗、SSH 暴力破解、防火牆攔截、AppArmor 拒絕、ClamAV 偵測等),自動遮蔽 API 金鑰、權杖等機密資訊,並回傳以記錄範本化的新模式偵測與頻率異常(統計突增)偵測結果。
get_app_help(query, topic)於本機即時檢索涵蓋RoamSwitch所有功能規格、底層機制、警報通知及疑難排解的官方知識庫,提供準確的技術解說與處置建議。
quarantine_status()回傳惡意軟體隔離 Vault 的內容(原始路徑、偵測到的威脅名稱、隔離時間與大小)。
canary_status()回傳勒索軟體誘餌檔案(Canary)的佈署狀態,以及最近 50 筆偵測事件。
package_cve_scan()將已安裝的套件(Mac:Homebrew / Linux:dpkg・dnf・zypper・pacman)與本機 CVE 對照表比對。完全不產生任何網路通訊。
package_cve_scan_languages(watched_folders)將 npm / PyPI / crates.io / RubyGems / Packagist / Go / Maven 等相依性鎖定檔與同一本機 CVE 對照表比對。完全不產生任何網路通訊。
verify_fim()對約 150 處關鍵系統檔案重新計算雜湊,並與基準比對以驗證是否遭竄改。
get_port_anomaly_incidents()回傳連接埠異常防護的基準狀態、目前自動阻斷的連接埠,以及最近 50 筆事件。回應中明確註明:目前自動阻斷的連接埠是不含時間戳記的當前狀態快照,與含時間戳記的事件歷史是兩回事。
get_ebpf_incidents()回傳 eBPF 執行期防護的目前隔離狀態,以及觸發隔離的事件歷程。

各回傳型別的欄位定義以原始 Rust 型別宣告的形式收錄於 GitHub 上的 README

應用場景

可以這樣整合

以下為 Swift(Mac)範例。roamswitch-linux-kit(Linux)也提供同名方法(snake_case 命名)達成相同效果。

同步/備份類應用程式

連接到不受信任的網路時,自動暫停背景同步。

let status = try await client.guardStatus()
if !status.isCurrentNetworkTrusted {
    syncEngine.pauseBackgroundSync()
}

密碼管理器

在不受信任的網路下縮短自動鎖定時間等,依保護等級調整行為。

let status = try await client.guardStatus()
let lockTimeout: TimeInterval = status.isCurrentNetworkTrusted ? 300 : 30
vault.setAutoLockTimeout(lockTimeout)

開發者工具與自動化

在開發伺服器開始監聽 0.0.0.0 時發出警告,或用 Shortcuts 等建構依網路信任度反應的工作流程。

let ports = try await client.exposedPorts(includeLocalOnly: false)
for port in ports.ports where [3000, 5173, 8000, 11434, 1234].contains(port.port) {
    print("⚠️ Dev/AI server exposed on port \(port.port)")
}

郵件與聊天應用程式中的連結預先檢查

在顯示前自動掃描收到訊息中的連結,僅對危險連結發出警告。

let result = try await client.auditURLSafety(url: link)
if result.riskLevel == "dangerous" || result.riskLevel == "suspicious" {
    showWarningBanner(for: link, score: result.score)
}

右鍵選單/捷徑的安全性檢查

接入 Finder 的「服務」選單或 macOS 捷徑,一鍵檢查複製的 URL。

// 從 macOS 捷徑 (App Intent) 或「服務」選單的處理程式中呼叫
let report = try await client.auditURLSafety(url: pasteboardURL)
return "\(report.riskLevel.uppercased()) (\(report.score)/100)"

IT 資產管理與 MDM 儀表板

從組織內多台 Mac 收集分數,在管理員儀表板中彙整並觸發警示。

let report = try await client.securityReport()
try await mdmAPI.reportScore(deviceID: deviceID, score: report.score, grade: report.grade)
常見問題

關於 SDK

Q. 可以免費使用嗎?

A. 是的。RoamSwitchKit(Mac)與 roamswitch-linux-kit(Linux)皆基於 MIT 授權免費發布。它們需要預先安裝 RoamSwitch 本體(診斷引擎),但 SDK 本身不收取任何費用。

Q. 能否變更使用者的設定?

A. 不能。它是唯讀的,沒有實作任何切換鎖定、隔離連接埠之類的操作類 API。整合此套件的應用程式無法在未經使用者同意的情況下變更 RoamSwitch 的保護設定。

Q. 如果沒有安裝 RoamSwitch 會怎樣?

A. 會回傳對應的錯誤(Mac: RoamSwitchClientError.appNotInstalled / Linux: RoamSwitchClientError::AppNotInstalled)。建議對此進行妥善處理(例如隱藏相關功能),而非當作致命錯誤。

Q. 想將 RoamSwitch 本體隨自家產品綁定發行怎麼辦?

A. SDK 整合(本頁內容)可繼續免費自由使用,但綁定發行 RoamSwitch 本體需要 OEM 授權。請點此諮詢 OEM 與合作夥伴綁定