- 物联网
- 后端
- 前端
【免费下载链接】Valetudo
Cloud replacement for vacuum robots enabling local-only operation
Valetudo 是一个面向扫地机器人的"云端替代方案"(cloud replacement),其核心目标是通过本地化运行实现完全离线操作。仓库根目录下的 SECURITY.md 是一份风格极为独特的文件——它既不承诺安全,也不提供漏洞赏金流程,而是以近乎戏谑的口吻声明"这是不安全软件,请用网络隔离把它关起来"。本文以这份文档为主线,结合 WebServer.js、ExternalAccessCheckMiddleware.js、default_config.json 等源码,为你拆解 Valetudo 的真实威胁模型、它内置的纵深防御手段,以及"发现漏洞"时正确的沟通姿势。读完你会明白:这份"反安全声明"恰恰是该项目安全理念最精确的说明书。
阅读提示:Valetudo 的安全承诺从来不是"代码无懈可击",而是"攻击面本应被网络层彻底封死"。全文所有配置与实现细节均以当前仓库代码为准。
SECURITY.md 到底在说什么:一份"反安全声明"的逐段解读
Valetudo 的 SECURITY.md 标题就透着黑色幽默——SECURITY dot md (not the TLD)。开篇第一句是:
Valetudo is insecure software built by an even more insecure person. It should not under any circumstance be used by anyone at all.
即"Valetudo 是不安全软件,由更不安全的一个人编写,任何情况下都不应被任何人使用"。紧接着文档给出两个核心指引:
若仍要使用,LICENSE 条款适用。该仓库采用 Apache License 2.0,其中第 7 条"Disclaimer of Warranty"明确声明软件按"AS IS"提供,不提供任何明示或默示的担保(包括对特定用途的适用性担保),第 8 条"Limitation of Liability"进一步限定了责任范围。这与 SECURITY.md 的"不安全声明"在语义上是一致的一对:项目方不兜底、使用者自担风险。
强烈建议在网络层面隔离 Valetudo,让它"永远看不见外部世界"。原文甚至调侃"它其实喜欢这样,它就想这样活着"(It actually likes that. It wants to live that way.)。
这份文件的存在动机
文档"为什么存在"一节交代了历史背景:某家创业公司曾发来冷邮件,兜售自动化安全扫描服务;作者不想再收到这类邮件,又恰好需要一个"肥皂箱"(soapbox),于是有了这份文件。这解释了其非正式语气——它不是敷衍,而是项目治理哲学的延伸。README 中"Valetudo is a garden"的比喻(README.md)与 CODE_OF_CONDUCT.md 中"Don't be a dick"的规则,同属这一脉:一个由单人维护、刻意不去商业化的开源项目,更看重社区互动方式而非形式化的安全流程。
为什么"威胁面小":本地优先架构带来的天然安全属性
SECURITY.md 给出了一个关键论点:"the whole idea of this software is to run locally and offline; not really processing much user-controlled input."(整个软件的思路就是本地离线运行,并不怎么处理用户可控输入。)这是理解 Valetudo 威胁模型的核心。
从源码结构看,这一点是真实成立的:
- Valetudo 不是固件。README 明确说它是"cloud replacement",可类比为寄生在厂商固件上的"大脑寄生虫"(brain parasite)——它运行在已 root 的机器人系统里,复用厂商固件数百万小时的研发成果,但接管了云端与控制逻辑。backend/lib 下按
robots/(dreame、roborock、midea、viomi、mock 等厂商适配)、miio/、msmart/(米家与美的协议的本地实现)、mqtt/、webserver/分层组织,整体是一个本地服务进程,而非接收大量外部输入的公共服务。 - 用户可控输入被刻意压缩。它提供的是一套本地 REST 接口(内置 Swagger UI 文档)与 MQTT 桥接,用于控制机器人本体;机器人自身的底层协议交互发生在本地局域网内,不经过任何第三方云端服务器。
- 更新与事件处理均为内部闭环。更新逻辑在 backend/lib/updater,事件系统在 backend/lib/valetudo_events,均不依赖公网回调。
因此作者才敢断言:即便存在漏洞,"blast radius is probably going to be not all that large"(爆炸半径大概率不会太大)。攻击者要利用 Valetudo 的漏洞,首先必须能接触到运行它的局域网——而这正是 SECURITY.md 建议用网络隔离封死的那层边界。
纵深防御:即使"不安全",代码里仍有一道道内置防线
"声明不安全"不等于"什么都不做"。当前仓库的代码里确实存在多层防护,可以作为理解"威胁面"的实物证据:
1. 默认开启的外部访问拦截
default_config.json 中webserver.blockExternalAccess默认值为true。对应的 ExternalAccessCheckMiddleware.js 会在 WebServer.js 中被挂载:
if (this.webserverConfig.blockExternalAccess) { this.app.use(Middlewares.ExternalAccessCheckMiddleware); }该中间件的判定逻辑(isAllowed)是:请求来源 IP 必须是RFC 私网地址(isInSubnet.isPrivate)、本机回环地址(isInSubnet.isLocalhost),或与机器人某个 IPv6 接口处于同一子网(isLocalIPv6Subnet,通过Tools.GET_NETWORK_INTERFACES()比对本地接口 CIDR)。不满足条件时返回 HTTP 418,并记录Blocked external request to ... from ...日志。出于性能考虑,IPv6 判定结果会缓存在一个容量为 15 的 LRU(hashlru)中——这是代码注释里明确说明的取舍。
这意味着:从广域网直连 Valetudo 的 Web 服务,在默认配置下是被代码直接拒绝的。这正是 SECURITY.md 建议"网络层隔离"在软件内部的第一道呼应。
2. 可选的 HTTP Basic Auth
default_config.json 中webserver.basicAuth默认enabled: false(默认用户名/密码均为valetudo)。当开启时,WebServer.js 的createAuthMiddleware()会启用基于express-basic-auth的认证:
- 用户名与密码比对使用
basicAuth.safeCompare(常数时间比较,避免时序侧信道); challenge: true会向未认证请求返回 401 与WWW-Authenticate头;- 未提供凭证时返回
"No credentials provided",凭证错误时返回"Invalid credentials"; - 认证中间件通过
express-dynamic-middleware动态挂载,因此配置变更无需重启进程即可生效(WebServer.js中的config.onUpdate回调会监听webserver配置键并动态use/unuse)。
需要明确的是:Basic Auth 默认关闭,且默认凭证是公开的。它提供的不是"安全",而是阻止局域网内随意访问者的最基本门槛。真正的隔离仍应靠网络层完成。
3. 响应头与输入校验
- CSPMiddleware.js 为所有响应添加
Content-Security-Policy: worker-src 'self';,限制 Web Worker 的来源,配合前端地图渲染(frontend/src/map 使用 Web Worker 做图层管理)。 - WebServer.js 中
app.disable("x-powered-by")关闭 Express 指纹头,并挂载基于 OpenAPI 规范的请求校验(swaggerValidation),非法 payload 返回 400。当 OpenAPI spec 加载失败时,会退化为一个"超级基础校验"(superBasicValidationMiddleware):对 PUT/POST 请求至少校验 body 非空。 - 顺带一提:
/_killswitch路由被刻意放在认证中间件之前(注释写明Intentionally bypasses auth),这是一个有意的设计决策而非疏漏。
4. 配置持久化与恢复
Configuration.js 会在配置校验失败时自动将原文件备份为valetudo_config.json.backup并以默认配置重建;reset()时也刻意保留robot段配置。这类"失败时优雅降级"的处理,正是 SECURITY.md 结尾呼吁的设计哲学——"engineer our systems in ways that fail gracefully"。
发现漏洞之后:作者期望的正确沟通姿势
SECURITY.md 的"发现漏洞怎么办"一节给出了与主流项目截然不同的回答路径:
- 先意识到"你发现的可能是 bug 而非漏洞"。作者半开玩笑地说,在这样一个本地离线、几乎不处理用户输入的软件里,真正发现安全漏洞本身就令人印象深刻。
- 别搞"漏洞披露剧场"(theater)。既然爆炸半径不大,标准的 CVE 披露流程与安全研究者的个人品牌营销在此并无必要。
- 像个想为世界变好做贡献的普通人那样沟通("just talk like a normal person"),而不是把披露当成自我包装。这与 CODE_OF_CONDUCT.md 的规则一脉相承——第一条规则就是"Don't act against the interest of the Valetudo mission"。
- 背景提示:Valetudo 本身就是安全研究的产物(作者在 IT 安全领域有背景),所以"我们其实是同一阵营"——但作者也承认这不代表代码不会出错。
简言之:发现疑似漏洞 → 以普通人的方式、在公开渠道正常交流即可,无需走私密漏洞赏金流程。具体沟通渠道见 README.md 的"Further questions"一节(Telegram 群组等)。
给使用者的安全配置清单
综合 SECURITY.md 的立场与当前仓库的默认配置,若你决定使用 Valetudo,可参照以下清单(配置项均来自 default_config.json,运行时配置文件路径由环境变量VALETUDO_CONFIG_PATH指定,见 env.js;未设置时默认落在系统临时目录下的valetudo_config.json):
| 配置项 | 默认值 | 建议 | 说明 |
|---|---|---|---|
webserver.blockExternalAccess | true | 保持true | 拒绝非私网/非本机来源的 HTTP 请求(见 ExternalAccessCheckMiddleware.js) |
webserver.basicAuth.enabled | false | 局域网内建议开启 | 开启后需修改默认的username/password(默认值valetudo/valetudo是公开的) |
webserver.port | 80 | 按需调整 | Web 服务监听端口(WebServer.js 中读取) |
| 网络层隔离 | — | 强烈建议 | 用防火墙/VLAN 将机器人限制在可信局域网,禁止出站外网——这是 SECURITY.md 的核心建议,也是无法被软件配置替代的边界 |
补充两点实现细节:
- 配置热更新:修改
webserver段配置会通过Configuration的事件机制实时生效,Basic Auth 的启用/停用无需重启(WebServer.js)。 - 配置自愈:配置文件损坏时 Valetudo 会自动备份并以默认配置重建(Configuration.js),因此任何配置修改前建议自行保留备份。
结语:把"安全"放回它应有的位置
Valetudo 的 SECURITY.md 表面上是"最差劲的安全说明",实际却是一次极其清晰的安全边界划定:
- 它不承诺软件层面的绝对安全,而是把安全责任显式地交给部署者的网络架构——这也是本地离线软件最务实的做法;
- 它的代码并未放弃防御,外部访问拦截、可选 Basic Auth、CSP、请求校验、配置自愈等机制在 backend/lib/webserver 中真实存在且默认开启关键项;
- 它对"漏洞"采取去剧场化的态度,要求沟通回归"普通人想让世界变好"的本质,而非流程与营销。
正如 SECURITY.md 结尾那段话:想象一个世界,所有"本不需要连接云端的软件"就真的不连云端;想象一个世界,我们在设计系统时就让它优雅失败,而不是事后一层层往上糊救火补丁。对 Valetudo 的读者而言,这份文档与其说是在劝退,不如说是在校准预期:它的安全边界在网络上,而不在代码里。
- 物联网
- 后端
- 前端
【免费下载链接】Valetudo
Cloud replacement for vacuum robots enabling local-only operation
相关推荐
Maka 安全模型解读:OS 强制边界、Token 单向 IPC 与启发式安全网如何界定 Agent 的信任边界
Maka 安全模型解读:OS 强制边界、Token 单向 IPC 与启发式安全网如何界定 Agent 的信任边界 Maka(Apache Maka, Incub
AI Agent人工智能AI 应用桌面应用工具调用AI 评测CLIAgent 评测MCP ClientsApache DolphinScheduler 安全模型解析:角色权限边界、信任模型与安全边界判定
Apache DolphinScheduler 安全模型解析:角色权限边界、信任模型与安全边界判定 导读 Apache DolphinScheduler 作为现
任务调度数据编排工作流自动化后端大数据CodexBar 声明式自定义 Provider 设计:运行时身份接缝、映射契约与安全边界
CodexBar 声明式自定义 Provider 设计:运行时身份接缝、映射契约与安全边界 本文基于 CodexBar 仓库中的设计文档 docs/custom
AI 应用桌面应用开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考