Skip to content

Security: FELIXDAD/RenderMesh

Security

docs/SECURITY.md

安全说明

  • RenderMesh 面向可信公司内网;不要把 UDP 8390 或 TCP 8391 直接暴露到互联网。
  • 初次运行生成 128-bit 内部随机集群凭证和独立的六位可见匹配 ID。修改匹配 ID 会立即轮换内部凭证、撤销当前节点信任并进入待匹配状态;只有两端匹配 ID 相同,才会重新交换并统一随机凭证。协议 v10 的健康检查、发现广播和派发前证明携带内部凭证与当前匹配 ID 的绑定标签;协议 v11 进一步签名 Blender 可用状态,缺少这些能力的旧节点会被明确要求升级。任务、单帧开始、日志和结果接口都用常量时间比较验证内部 X-RM-Token;单帧开始/日志/结果还必须匹配 task ID 与当前 attempt token,过期租约返回 409。正式 UDP 发现把节点自身 IPv4 地址列表、随机 nonce、硬件与状态纳入 HMAC-SHA256 签名,接收端验证实际源 IP,派发前还要求该端点完成新的 HMAC 挑战。
  • 六位匹配 ID 只用于可信公司 LAN 上的自动配对。协议 v11 的未认证候选广播包含由六位 ID 派生的匹配标签和回连端点,但候选本身不获得信任、不进入工程同步/任务池;真正配对仍必须通过 /v2/pair HMAC 证明,服务端对每个来源 IP 每分钟最多接受六次尝试。由于六位数字空间较小,能监听局域网广播的攻击者可离线枚举候选标签,因此它不能替代企业身份认证;不要在不可信 Wi-Fi、互联网或跨租户 VLAN 使用自动配对。
  • 定向广播与 239.255.83.90 局域网组播都只携带按协议版本完整签名的发现报文;组播 TTL 固定为 1。协议 v13 的直接 /health 状态使用一次性 challenge 对完整 JSON 快照做 HMAC,share、assigned、task_id、空闲时间和活动帧无法被第三方目录冒充。协议 v14 把 Worker 按本机阈值计算的 idle_ready 同时纳入发现签名和完整状态证明;协议 v15 再把 frame_start 能力纳入发现签名和健康证明,Origin 不会把不支持真实单帧开始事件的旧节点误当成多帧兼容节点。
  • 协议 v12 的节点目录只返回当前节点已经认证且八秒内仍在线的端点,并对随机 challenge、提供者节点 ID 和完整目录做 HMAC。目录地址不会直接获得信任;接收方必须逐个完成正常 /health 能力证明和 /v1/prove 后才加入任务池。节点目录最多 128 项,每轮最多主动验证 2 个新地址,且不能为已知节点刷新在线时间或任务状态。
  • 共享算力默认关闭;关闭时即使集群码正确也拒绝远端任务。
  • 任务 ID 只允许字母、数字、-、_,接收文件总是写到内部生成的目录,避免路径穿越。
  • 接收采用临时文件和原子替换;请求体上限为 100 GiB。内置 HTTP/1.1 服务只接受带 Content-Length 的请求体,分块编码请求返回 411;socket 以 50 ms 为片轮询退出信号,空闲连接按读写超时关闭。多文件结果接收前按“原包+解包”两份峰值预留数据盘空间,发布每个文件前另行检查工程输出盘。
  • 工程存储迁移只接受普通空目录,拒绝磁盘根目录、互相包含的目录和重解析点。迁移在节点服务停止后执行,逐文件 SHA-256 校验通过才原子切换 project_storage_path;目标发布前不会删除原目录,切换后也只清理 RenderMesh 管理的 jobs/cache/incoming/preflight/inspection/previews/failed-results 目录。
  • 协议 v2 的工程缓存目录只能由 64 位小写十六进制 SHA-256 派生。断点续传的每个 8 MiB 分块都携带 SHA-256,接收时逐块校验。若整个文件在同一接收进程内从偏移 0 连续写满且每块都已校验,提交时只刷盘、不再重读全文件;含有更早会话遗留 partial 数据的文件在提交时重新计算整个文件 SHA-256,不匹配就删除。逐块校验防止传输损坏,整体哈希仍由已认证的发送节点给出,因此该机制依赖集群凭证的信任边界。缓存命中还要求 Blender 版本、引擎和 GPU 要求一致;插件清单不参与兼容判断。
  • 多文件结果包中的路径必须是无 ..、盘符或反斜杠的相对逻辑路径;Origin 仅把主输出映射到本机预检记录的帧路径,把合成器输出映射到已记录 File Output 节点目录。所有文件先按 attempt token 暂存并再次验证租约,再带旧文件备份/回滚地发布。
  • 同级 tex 目录使用独立的 RMPKG1 工程包格式,包内只允许唯一的 source.blend 和 tex/ 下的安全相对路径;除盘符、..、反斜杠外,还拒绝 Windows 会归一化的尾随空格/句点、保留设备名、ADS 冒号和非法字符。接收端在创建文件前按路径组件再次确认最终目标严格位于临时解包根目录内,并限制条目数、单项与总大小;创建端同时拒绝重解析点/符号链接。工程包整体仍以 SHA-256 作为缓存键,旧节点不会接收该类任务。
  • 局域网更新只接受已经通过匹配 ID 绑定、直接 /health 与新鲜 /v1/prove 挑战的节点。更新清单包含版本、字节数、EXE SHA-256 和内部集群凭证 HMAC;JSON 必须是字段类型完整的对象,线程入口会兜住异常,关闭程序会取消后续节点扫描。下载再次校验响应头、实际长度、SHA-256 与 PE 类型。目标目录同卷暂存后,从已验证的新 EXE 复制 AppData 独立助手;助手等待旧进程退出,对短暂共享/锁冲突执行最长 15 秒重试,再以 ReplaceFileW 同时发布新 EXE 和生成 .previous。替换前失败会重新启动原版本;新程序无法启动或五秒内异常退出时以相同原子替换回滚。该机制不等于公开代码签名,只应用于可信公司 LAN,正式全公司分发仍建议使用企业证书签名。
  • Blender 下载器只从 https://mirror.blender.org/release/ 读取版本目录和 Windows x64 MSI 入口,并从同一官方版本目录取得 SHA-256 清单;LTS 标签从 https://www.blender.org/download/lts/ 读取。初始地址拒绝非 HTTPS 和非 Blender 官方主机;官方入口为大文件选择地区镜像时只允许继续使用 HTTPS,最终 MSI 必须与官方 SHA-256 清单完全一致。MSI 支持断点续传,完整长度与哈希匹配后才交给 Windows Installer。安装界面仍由 Blender 官方 MSI 提供,RenderMesh 不执行静默提权或绕过系统安装确认。
  • 命令行使用 /v5/local/status、/v5/local/jobs、/v5/local/job 和 /v5/local/job-action 本机控制接口。节点只在请求来源地址为 127.0.0.1 且 X-RM-Local-Token 以常量时间比较等于本机 config.json 的内部集群凭证时处理这些请求,其余情况返回 401;凭证不会出现在命令行参数或输出中。能读取当前用户 %LOCALAPPDATA%\RenderMesh\config.json 的本机进程等同于该用户,可以通过这些接口提交、停止或删除任务;这与该用户直接操作桌面程序的权限边界相同。inspect 在命令进程内运行,不经过节点。
  • 任务/结果上传的 socket 阻塞等待上限为 5 秒,数据提供器、大文件打包/解包/发布循环都检查退出信号;Blender 预检、兼容性检查和正式渲染也支持中止。
  • “无视警告”是用户明确选择的全量预检覆盖,并记录到后台日志;它会跳过素材、插件和节点警告,直接准备任务。源 .blend 仍必须可读取、复制,帧范围和基本输出格式仍必须能构造任务;发起端不执行正式帧,真实兼容性由参与 Worker 的测试帧确认。该功能只面向可信公司内部工程。
  • 每次远端派发使用独立随机 attempt token。Origin 只接受当前 Assigned 或 Rendering 活跃租约的开始事件、日志与结果,过期 Worker 的迟到请求返回 409。
  • 远端兼容性检查不加载 .blend;正式渲染使用 Blender --disable-autoexec,避免工程自动执行 Python。但 .blend、插件、驱动和原生库仍必须视为公司内部受信内容。
  • 数据面当前是内网明文 HTTP。VLAN 内主动抓包者可能观察集群码和工程;生产范围扩大前应增加设备证书/mTLS 或隔离渲染 VLAN。
  • 内部集群凭证或邀请码泄露后,应在所有节点重新配对。当前版本没有中央轮换服务。
  • EXE 未做商业代码签名。正式全公司部署前建议由 IT 代码签名,并通过域策略只允许专用/域网络端口。

There aren't any published security advisories