mcpField
S
scenario-roblox-networking

scenario-roblox-networking

github.com/scenario-labs安全1.2k54 次安装1 天前更新
代码仓库

关于 scenario-roblox-networking

面向 Roblox Studio 的网络与安全技能,指导开发者审计远程调用、验证客户端输入,并通过对抗性测试检查防护措施。

主要功能

  1. 01远程调用审计与验证
  2. 02速率限制和参数检查
  3. 03命中与移动验证
  4. 04交互对象所有权检查
  5. 05漏洞模糊测试与延迟测试

适用场景

  1. 01审查 Roblox 项目的远程调用
  2. 02测试防刷与伪造参数防护
  3. 03验证延迟下的战斗命中
  4. 04防止客户端控制对象决定结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/scenario-labs/skills --skill scenario-roblox-networking

安装后在 Claude Code 中输入/scenario-roblox-networking确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
critique.md
expert-notes.md
gui-paths.md
procedures.md
sources.md
scripts/
rbx_net.py
scripts/agentkit/networking/
Exploit.luau
Guard.luau
HitCheck.luau
lune_net_audit.luau
MoveGuard.luau
Net.luau
NetAudit.luau
RateLimit.luau
Suspicion.luau

详细介绍

Roblox 网络与安全

目标:在 macOS 上使用 scenario-roblox-expert 工具包驱动 Roblox Studio(2026 年 10 月版本)。

这里的专家级意味着:每个可由客户端触发的操作都属于攻击者输入;状态由服务端掌控;每次调用都按固定顺序检查;并通过在游戏测试客户端发送恶意参数来验证。检测是验证的补充,可见后果则延后出现,并由多种信号触发。

如果这里提到的某项相邻技能不在你的可用技能中,请让用户安装它 (npx skills add scenario-labs/skills --skill <name>);若无人值守,则根据工具架构继续操作,并指出缺失项。

必备背景: scenario-roblox-expert(通道、审查循环、工具包、当前 Roblox 的陷阱)。

立场(专家级的额外要求)

  1. 远程调用传递意图,而非结果。 客户端指定物品,服务端计算价格。武器上报发射起点和命中点,绝不指定受害者或伤害值(Creator Docs,客户端-服务端边界;GnomeCode)。
  2. 按固定顺序检查:先频率限制,再检查参数,最后检查上下文。 文档列出的顺序是上下文、类型、值和频率;先执行频率限制的成本最低 [新增]。NaN 会通过 typeof(v) == "number" 检查,却无法通过任何比较,因此应使用 math.isfinite(Creator Docs;Suphi Kaner)。实测中,仅做范围检查的处理器收到 NaN 和无穷大载荷后,将 IntValue 余额设为 -9223372036854775808。
  3. Instance 参数是一种声明。 检查 typeof 和 IsDescendantOf(expectedFolder):表可以伪装成 Instance,客户端也可以重放其仍持有引用的已销毁拾取物(Creator Docs;Suphi Kaner)。
  4. 所有可由客户端触发的入口都是远程调用。 ProximityPrompt 只会在 Triggered 时检查距离,并忽略 Enabled。ClickDetector 不会进行服务端检查。Touched 上报的是客户端的物理模拟结果(Creator Docs;Suphi Kaner)。
  5. 移动:新竞技游戏采用 Server Authority,现有休闲场景则采用服务端 MoveGuard。 决定因素是游戏类型,以及能否采用固定模拟、InputActions 和流式加载(Creator Docs;Jason Knight,Roblox)。Server Authority 无法阻止 ESP、自瞄或摄像头滥用(ev1)。
  6. 根据攻击者看到的情况验证命中。 Roblox 没有内置延迟补偿(ev1)。回溯服务端记录的位置,时间范围为 [now - min(ping + 0.1, 0.4), now] [新增],或者使用约 10 度的锥形范围(ev1)。遮挡检查只考虑静态几何体(Creator Docs)。
  7. 后果逐级升级,并延迟出现。 保留会衰减的可疑度分数;执行措施前要求有两个不同原因;并随机延迟 20 至 90 秒 [新增数字],再采取可见行动。蜜罐远程调用和方向蜜罐是高置信度信号(Creator Docs,服务端检测)。对于移动违规,应使用橡皮筋回弹,而非踢出,因为延迟会造成误报(GnomeCode)。
  8. UnreliableRemoteEvent 仅用于低于 1,000 字节的高频外观数据。 上限为 1,000 字节(Creator Docs);Roblox Learn 2025 年视频中的 900 字节说法已过时。实测中,随机生成的 980 字节缓冲区成功送达,而 1,000 字节的数据被丢弃。这两种远程事件类型都必须执行相同的验证。

首先确认

  • Workspace.AuthorityMode:Automatic 表示角色由客户端控制(应用 MoveGuard);Server 表示由引擎模拟这些角色。rbx_net.audit_place(place) 可离线读取全部六项设置。
  • 项目利害关系:竞技还是休闲、线上运营还是原型。原型可以暂缓部署蜜罐和排行榜,但不能省略验证。
  • Remote 清单:名称、方向、频率、负载大小,以及每个处理程序会写入哪个服务器端值。
  • 交互对象:提示、ClickDetectors、DragDetectors、Touched 拾取对象,以及它们的父对象是否未锚定。
  • 执行策略:踢出、Players:BanAsync,还是仅缓解;由谁处理申诉(Net.reset)。
  • 未收到答复时的默认值:所有 remote 都通过 Net.bind;设置一个蜜罐;对服务器到客户端的 remotes 使用 Net.serverOnly;测试期间以干运行模式执行策略。

流程

通过工具包运行各阶段;完整代码和测试结果见 procedures.md。状态:在 Studio 0.743 中,24 项在线测试均通过(竞技场重跑和 Server Authority place 于 2026-10-19 测试)。将 NetKit(Guard、RateLimit、Suspicion、Net、HitCheck、MoveGuard)作为 ModuleScripts 保存在同一个服务器文件夹中。rbx_net.kit_tree(project_dir) 可生成测试 place 所需的 Rojo 片段;在用户的仓库中,rbx_net.vendor_kit(repo, dest) 会复制这些模块并返回仓库内的路径。

  1. 审计。 目标:列出每个远程对象、处理程序和交互实例及其发现项。方法: rbx_net.audit_place(place) 离线运行(Lune),然后在 Edit 中运行 rbx_net.run(studio, "return NetAudit.run(game, Audit)", kit=["NetAudit"], lead_kit=["Audit"])。 GATE:零错误;每条警告均已修复或说明理由;实时统计与离线统计一致。
  2. 验证并限流。 目标:参数错误或请求速率过高时,不运行任何处理程序。方法: 对每个客户端到服务端的远程对象使用 Net.bind(remote, {args = {Guard...}, limit = {capacity, perSecond}, handler = fn});在服务端时钟上使用幂等处理程序。GATE:审计中没有 handler-unvalidated、nan-unsafe、trusted-value 或 no-rate-limit 发现项。
  3. 命中。 目标:根据历史记录验证命中声明。方法:为每个目标维护 1 秒的 HitCheck.History,每次 Heartbeat 时推送;对静态墙使用带有 ExcludeInstances 或 IncludeInstances 的 HitCheck.melee 和 HitCheck.ranged。GATE:拒绝超出距离、伪造起点、穿墙和偏移射击;有效射击能够命中。
  4. 移动。 目标:遏制速度和传送作弊,同时避免误报。方法:使用 Server Authority(Rojo 写入设置,阶段 P11),或在每次服务端传送前调用 MoveGuard.start 和 MoveGuard.grace(player, s);enforce = false 只记录日志,然后从角色所在位置开始测量。GATE:正常行走 0 次标记;客户端传送和本地 WalkSpeed 更改会被回弹(实时测试:WalkSpeed 设为 80,持续 2.5 秒后,服务端测得移动距离为 12.6 studs)。 使用 Server Authority 时,实时测试:按住 W 2 秒,服务端角色移动了 32.4 studs;客户端传送移动了 0;本地 WalkSpeed 设为 80 后按住 W,移动了 32.0。
  5. 所有权和表面。 目标:客户端拥有的部件不会决定结果。方法: 对未锚定的拾取物、NPC 根部件和提示词父级调用 SetNetworkOwner(nil);Net.prompt 重新检查距离、状态和速率;在 MouseClick 中检查距离;对 Touched 拾取物使用 Net.touch(触碰者、CanTouch、距离、MoveGuard 可达距离、共享限流器)。GATE:客户端写入 CFrame 不会使服务端上的任何物体移动。
  6. 从客户端进行漏洞测试。 目标:拿出证据,而非意图。方法:在 Playtest 中, rbx_net.fuzz(pt, path, gap=...),同帧垃圾请求、触发蜜罐,然后在 Server 数据模型中运行 rbx_net.net_log(pt)。加入一个故意存在漏洞的远程对象作为负向对照。GATE: 余额和生命值保持不变,ok_<Remote> 等于有效用例数量,没有服务端脚本错误,负向对照会发放奖励。Touched 拾取物没有远程对象:使用 exploit_case 让客户端传送到部件上,然后并排测试一个 Net.touch 部件和一个裸 Touched 部件(P6)。
  7. 检测和后果。 目标:高置信度信号,延迟采取行动。方法: Net.init({enforce = ..., enforceDelay = {20, 90}})、Net.honeypot、Net.serverOnly。GATE:一次蜜罐触发会安排延迟后到达 enforce;单独的洪泛请求不会达到 restrict 阈值。
  8. 延迟。 目标:有效游戏体验能够承受真实网络延迟。方法:Play 前在 Edit 中运行 rbx_net.set_latency(studio, 100, 100),并对移动目标进行最后一刻的挥击。GATE:回溯命中率至少为 0.8。实时测试中,202 ms 延迟下:启用回溯时命中 13 次(共 13 次),未启用回溯时命中 0 次(共 13 次,运行三轮)。挥击时机设在接近可达距离并留有余量:余量剩 0.2 秒时,未启用回溯的命中率在不同轮次间从 31% 波动到 92%。
  9. 带宽。 目标:流量小,且仅在数据变化时发送。方法:选择不可靠传输前运行 rbx_net.payload_probe;使用 buffer 打包;在数据流中使用序列号。GATE:测得的负载低于上限;数据流的已接受数量等于发送数量。

数值

数值适用范围来源
1,000 字节压缩后的 UnreliableRemoteEvent 负载;单个缓冲区可容纳 996 字节文档;实测:随机的 980 字节成功到达,1,000 字节“超出 4 字节”
每秒约 500 次每个客户端按远程类型划分的客户端到服务端请求数RemoteEvent 参考文档;Studio 游玩测试中未观察到(实测:0.5 秒内到达 1,000 次)
突发 5 次,每 2 秒 1 次文档中的令牌桶示例 TokenBucket.new(5, 10)文档
1 秒内 50 次丢弃调用洪泛标记阈值,每个时间窗口触发一次[新增]
WalkSpeed + 5 studs/sMoveGuard 允许的 XZ 速度,dt 上限为 0.01 sSuphi Kaner
6 studs,每秒泄漏 0.5MoveGuard 突发令牌桶[新增]
插值 0.1 s,上限 0.4 s回溯窗口 [now - min(ping + 0.1, 0.4), now][新增]
约 10 度命中可信度锥角ev1
1、3、6、10嫌疑等级:记录日志、缓解、限制、强制执行;半衰期 120 s[新增]
20 至 90 s可见强制执行前的随机延迟[新增]
64、50 个字符每个预测实例的复制属性数量;名称和字符串长度文档
0.5 percent最高脚本化丢包率(读取 5 会返回 0.5)实测
50 KB/sRoblox 每个客户端的发送和接收目标(Stewiepfing 的目标为 25)Stewiepfing

质量门槛

可量化:

  • 审计:错误数为零;所有警告均已解决,或记录了未解决的原因。
  • 模糊测试:每个恶意用例都归入 args_<Remote> 或 rate_<Remote>;余额、健康值和拾取物均未改变。
  • 垃圾信息:同一帧触发 1,000 次奖励,只发放一次;购买数量绝不超过桶的容量。
  • 命中、移动、所有权、提示词:判定计数器与测试用例(流程 P4 至 P6)一致。
  • 模糊测试期间的控制台:处理程序没有产生 ServerScriptService.<script>:<line> 错误。
  • 延迟:每程 100 ms 时的命中率与基线相差不超过 0.2。
  • 类型:两种 Luau 求解器均无错误;在使用 rojo sourcemap --include-non-scripts 构建的 sourcemap 下,luau-lsp analyze 在启用和未启用 --flag:LuauSolverV2=true 时均无错误(scenario-roblox-tooling 门槛)。

视觉:

  • 游戏运行期间的客户端截图通过 rbx_review.image_checks 检查,且没有任何标记。
  • 对于 Server Authority,在模拟延迟下使用可视化工具(仅 GUI, gui-paths.md)。

宣布完成前,使用 critique.md 为结果评分。

常见错误

错误症状修复
范围检查未使用 math.isfinite余额变为 NaN 或 INT64_MIN使用 Guard.num、Guard.int、Guard.vec3
客户端发送价格、伤害或数量免费物品、无限金钱客户端指定物品名称;服务端查询物品信息
仅用防抖保护拾取物重放导致拾取物重复使用 Guard.inst(folder),发放后销毁
仅在客户端进行速率限制远程调用仍然会被刷屏服务端按 UserId 设置桶,并在 PlayerRemoving 时清除
仅凭一次移动标记就踢出玩家延迟较高的玩家被踢拉回原位、计分、满足两个判定原因后再延迟处理
服务端传送没有宽限期自己的传送会误标记玩家首先调用 MoveGuard.grace(player, s)
提示词父级未锚定可从任意位置使用提示词调用 SetNetworkOwner(nil) 或进行锚定
用 InvokeClient 获取答案服务端线程会永久挂起使用 RemoteEvent 请求并在超时后回复
将数据批处理到 UnreliableRemoteEvent超过 1,000 字节后会静默丢弃批处理使用可靠传输;用 payload_probe 测量
仅检查“当前时刻”的命中延迟时有效命中被拒绝使用回溯窗口或锥形范围
用针对移动玩家的射线检测墙壁延迟会导致真实射击被拒绝仅检测静态几何体
将 LocalScript 放在 ReplicatedStorage 下用作加载器客户端代码不会运行使用 RunContext 为 Client 的 Script
通过 MoveTo 或 character_navigation 驱动 Server Authority 测试角色不会移动,因此所有作弊看起来都被拦截了按住按键(Playtest.press);先证明正常步行能够移动

交接

  • 从 scenario-roblox-architecture 接收:远程列表、文件夹布局以及状态的存放位置。
  • 从 scenario-roblox-gameplay 接收:需要验证的命中箱、投射物和能力规则。
  • 交付给 scenario-roblox-data:任何保存操作前经过验证、值有限且大小经过检查的数据,以及交易和购买的原子性问题。
  • 交付给 scenario-roblox-monetization:仅通过 ProcessReceipt 发放;以及 purchase-signal 的发现。
  • 交付给 scenario-roblox-performance:载荷大小、发送速率和 Server Authority 模拟预算。
  • 向 scenario-roblox-luau 咨询缓冲区打包和 Parallel Luau 相关问题,并向 scenario-roblox-tooling 咨询离线审计的 CI 接线。

当前 Roblox 说明

  • Server Authority 于 2026-07-09 全面发布。AuthorityMode Server 会设置 StreamingEnabled、Deferred 信号、UseFixedSimulation、NextGenerationReplication 和 PlayerScriptsUseInputActionSystem。
  • 脚本无法从 Studio 的 MCP 上下文读取或设置这些选项(“缺少 RobloxScript 能力”);请在 Rojo 项目或 Properties 面板中设置。通过行为检查:Deferred 信号、仅输入驱动移动。
  • 在 BindToSimulation 中使用 time();task.defer 会离开模拟步骤;效果应放在 RenderStepped 中,而不是模拟中。
  • RaycastParams.ExcludeInstances 和 IncludeInstances 取代了 FilterDescendantsInstances 和 FilterType(2026-04-07);Blacklist 和 Whitelist 已移除。
  • Network Simulator 处于 Beta 阶段,会驱动 NetworkSettings;旧版 IncomingReplicationLag 仍然存在,但不是该工具。
  • 会让出执行权的 API 带有 Async 后缀(BanAsync、UnbanAsync、GetBanHistoryAsync)。

参考资料

评论

支持 Markdown