rustsec 4小时前 · 2026-09-07 22:07:57 · 2 阅读
RUSTSEC-2026-0279:rojo 中的漏洞
Rojo 的 rojo serve 命令会在 localhost 上启动一个无需认证的 HTTP API(默认端口 34872),且不校验 Host 或 Origin 请求头。虽然浏览器默认的 CORS 策略能阻止恶意网站直接发起跨域 fetch() 请求,但攻击者可以利用 DNS rebinding 完全绕过这一限制。
该 serve API 是一个双向同步协议。一旦建立 DNS rebind,运行 rojo serve 的开发者只需访问一个恶意网页,无需任何后续操作,攻击者就可以:
- 读取完整项目源码:
GET /api/rojo返回会话 ID、根实例 ID 和项目名称。GET /api/read/{id}枚举完整的实例树,包括所有脚本内容,从而暴露专有游戏逻辑、配置以及源文件中嵌入的任何机密信息。 - 写入磁盘上的项目文件:
POST /api/write通过 Rojo 的同步管线推送更改,攻击者因此可以向开发者的项目中注入任意 Lua 代码。如果开发者随后发布游戏,注入的代码就会在每个玩家的客户端上执行——这是一个供应链攻击向量。 - 启动本地程序:
POST /api/open/{id}调用操作系统级的opener::open()函数,由平台默认处理程序(macOS 上是open,Linux 上是xdg-open,Windows 上是start)打开目标文件。 利用此漏洞只需满足两个条件:rojo serve正在运行(这是 Roblox 开发的标准工作流),且开发者在同一台机器的任意浏览器中访问了攻击者控制的网页。端口是固定的知名默认值(34872),没有任何认证机制,除了初始访问页面外也不需要任何用户交互。
该漏洞已在 #1270 中修复:新增 Host/Origin 请求头校验以拒绝跨域请求,/api/open 无论来源是否通过校验都仅限 loopback 客户端调用,并在服务器绑定到非 loopback 地址时发出警告。
本安全公告以 CC0-1.0 许可证发布。
原始来源: rustsec