FluidVoice 本地API安全边界与威胁模型:127.0.0.1监听的风险评估
【免费下载链接】FluidVoiceFastest and only macOS Dictation app with on-device STT and custom trained AI enhancement model. Windows pre-build available! A local Wispr Flow alternative. DM us on X exclusive model access! 😉 - https://x.com/fluidvoiceapp项目地址: https://gitcode.com/GitHub_Trending/fl/FluidVoice
FluidVoice 是目前速度最快的 macOS 端语音输入(Dictation)应用,主打端上语音识别(On-device STT)与本地 AI 增强模型,同时它内置了一个本地 API(Local API)——一个默认关闭、仅监听 127.0.0.1 回环地址的 HTTP 服务。任何本机程序都可以调用它来转写音频、读取转录历史和增改自定义词典。这篇文章用通俗的方式评估这个 127.0.0.1 监听端口的安全边界与威胁模型,帮你判断它"安全到什么程度、还剩哪些风险"。
1. 它是什么?本地 API 的定位与默认状态
FluidVoice 的本地 API 让第三方脚本或工具直接复用它的本地语音识别与 AI 后处理能力,而不需要再装一套模型。几个关键设定决定了它的安全基线:
- 默认关闭:配置项
LocalAPIEnabled未设置时按false处理,不主动开启就根本不存在监听端口。逻辑见 LocalAPIModels.swift。 - 默认端口 47733,用户可改(
LocalAPIPort),属于高位非常用端口,避免与常见服务冲突。 - 随应用生命周期启停:应用在 AppDelegate.swift 启动时拉起服务,退出时(第88行)关闭监听。
2. 安全边界:只放行 127.0.0.1,拒绝一切外部来源
这是整个威胁模型的核心。LocalAPIServer.swift 用NWListener创建 TCP 监听后,在newConnectionHandler里对每一条新连接做来源校验(第36-40行):
- 只有来源是
localhost(主机名)、127.0.0.1(IPv4)、::1(IPv6)的回环连接才被接受(isLoopback,第97-110行); - 其他任何地址的连接直接 cancel 丢弃,不会走到业务逻辑。
这意味着:局域网内其他设备、远程攻击者都无法触达该端口——即使端口映射或端口转发意外发生,来源地址校验也会在应用层兜底。
在资源层面还有两道防线:
- 请求体上限 500 MB(
maxRequestBytes,LocalAPIModels.swift#L5),超限直接返回 413,防止恶意大报文耗尽内存; - 每响应即关闭连接(
Connection: close,第166-186行),无常驻会话状态,减少了被"挂住"的窗口。
3. 暴露面盘点:API 到底能做什么
路由注册集中在 LocalAPIRouter.swift,全部端点如下:
| 端点 | 方法 | 能力 | 风险敏感度 |
|---|---|---|---|
/v1/health | GET | 返回状态与应用版本 | 低 |
/v1/history | GET | 返回最近转录记录(含原始文本、最终文本、应用名、窗口标题) | 高 |
/v1/dictionary/replacements | GET/POST | 读取/写入替换词规则 | 中 |
/v1/dictionary/custom-words | GET/POST | 读取/写入自定义词表 | 中 |
/v1/transcribe | POST | 转写音频文件(支持传本机文件路径或 Base64 音频) | 高 |
/v1/postprocess | POST | 对任意文本做本地 AI 后处理 | 中 |
其中两个端点值得特别注意:
/v1/history(HistoryAPIController.swift):返回的originalText、finalText是你说过和写过的内容,还附带appName与windowTitle(当时聚焦的应用和窗口)。对同一台 Mac 上的其他进程来说,这是一份相当详细的"行为轨迹"。/v1/transcribe的文件路径参数(InferenceAPIController.swift#L75-L86):请求体里可以直接传path指向本机任意可读文件让 FluidVoice 去转写。这本身是便捷功能,但意味着同用户下任何进程都能借它读取/解析本机的音频文件,且转写结果落进应用内存与历史。
4. 威胁模型:谁可能滥用这个端口?
本地 API 的信任模型是典型的"本机同用户信任":没有认证、没有令牌、没有签名——来源校验只回答"你是不是本机的回环流量",不回答"你是不是可信程序"。
按威胁源拆解:
- 局域网/远程攻击者:基本无效。回环白名单 + 高位非常用端口双保险,除非宿主机已被完全控制。
- 本机恶意应用(同用户):主要威胁。它只要
curl http://127.0.0.1:47733就能:拉走最近 N 条转录历史(默认最多 1000 条)、读取你的自定义词典与替换规则、把任意本机音频文件转写成文本、消耗你的本地 AI 算力。 - 资源滥用/本地 DoS:500 MB 请求上限 + 应用层校验提供了缓解,但恶意进程仍可用大量并发转写请求挤占 CPU/内存。
- 供应链视角:你安装的第三方工具是否真的"只需要本地 API",还是顺带把
/v1/history的文本外传——这一点 API 本身管不到,属于使用方责任。
5. 风险评估清单
| 风险项 | 等级 | 说明 |
|---|---|---|
| 外部网络访问 | 🟢 低 | 仅放行 127.0.0.1 / ::1 / localhost,其余直接断开 |
| 未授权本地读取转录历史 | 🟠 中-高 | 无认证,同用户进程可取走文本与应用/窗口上下文 |
| 本地文件转写被滥用 | 🟠 中 | path参数允许指定任意本机可读文件 |
| 词典/规则被篡改 | 🟡 中 | POST 端点可写,恶意程序可注入替换规则影响输入 |
| 内存耗尽型 DoS | 🟢 低 | 500 MB 上限 + 413 拒绝,缓解充分 |
| 远程暴露面 | 🟢 低 | 默认关闭,随应用退出自动停止 |
总体结论:对单人使用的 Mac,FluidVoice 本地 API 的边界设计(默认关闭 + 回环白名单 + 尺寸上限)是合理且克制的,残留风险集中在"本机同用户进程互信"这一前提上;对多人共用设备或安装了不可信应用的机器,风险会显著放大。
6. 使用建议(安全加固清单)
- 🔒不用就关掉:确认
LocalAPIEnabled保持关闭,是最彻底的防护; - 🧾需要时再开,用完即关:调用完自动化脚本后退出应用或关闭开关,监听随之消失;
- 👥共用 Mac 用户:避免开启本地 API,或仅在临时任务窗口内启用;
- 🧩审视为何而开:只给明确声明"仅需
/v1/transcribe"的工具开启,警惕索取/v1/history的第三方程序; - 🔎排查本机监听:开启后确认日志中为
Local API listening on http://127.0.0.1:47733(见 LocalAPIServer.swift#L85),并用系统工具确认无其他程序代理转发该端口。
7. 小结
FluidVoice 的本地 API 是一个"默认关闭、只信回环、限制尺寸"的轻量设计:它对远程攻击者基本关门,把信任完全交给"本机当前用户"。理解这一点后,安全决策就变得简单——它是本机自动化能力的开关,而开关的最佳位置是关闭。
核心实现均可在 Sources/Fluid/Services/LocalAPI/ 目录中核对:服务与回环校验 LocalAPIServer.swift、端口与尺寸配置 LocalAPIModels.swift、路由表 LocalAPIRouter.swift、历史端点 HistoryAPIController.swift、转写端点 InferenceAPIController.swift。
【免费下载链接】FluidVoiceFastest and only macOS Dictation app with on-device STT and custom trained AI enhancement model. Windows pre-build available! A local Wispr Flow alternative. DM us on X exclusive model access! 😉 - https://x.com/fluidvoiceapp项目地址: https://gitcode.com/GitHub_Trending/fl/FluidVoice
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考