关于 scenario-roblox-networking
面向 Roblox Studio 的网络与安全技能,指导开发者审计远程调用、验证客户端输入,并通过对抗性测试检查防护措施。
主要功能
- 01远程调用审计与验证
- 02速率限制和参数检查
- 03命中与移动验证
- 04交互对象所有权检查
- 05漏洞模糊测试与延迟测试
适用场景
- 01审查 Roblox 项目的远程调用
- 02测试防刷与伪造参数防护
- 03验证延迟下的战斗命中
- 04防止客户端控制对象决定结果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-roblox-networking安装后在 Claude Code 中输入/scenario-roblox-networking确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/rbx_net.pyscripts/agentkit/networking/Exploit.luauGuard.luauHitCheck.luaulune_net_audit.luauMoveGuard.luauNet.luauNetAudit.luauRateLimit.luauSuspicion.luau详细介绍
Roblox 网络与安全
目标:在 macOS 上使用 scenario-roblox-expert 工具包驱动 Roblox Studio(2026 年 10 月版本)。
这里的专家级意味着:每个可由客户端触发的操作都属于攻击者输入;状态由服务端掌控;每次调用都按固定顺序检查;并通过在游戏测试客户端发送恶意参数来验证。检测是验证的补充,可见后果则延后出现,并由多种信号触发。
如果这里提到的某项相邻技能不在你的可用技能中,请让用户安装它
(npx skills add scenario-labs/skills --skill <name>);若无人值守,则根据工具架构继续操作,并指出缺失项。
必备背景: scenario-roblox-expert(通道、审查循环、工具包、当前 Roblox 的陷阱)。
立场(专家级的额外要求)
- 远程调用传递意图,而非结果。 客户端指定物品,服务端计算价格。武器上报发射起点和命中点,绝不指定受害者或伤害值(Creator Docs,客户端-服务端边界;GnomeCode)。
- 按固定顺序检查:先频率限制,再检查参数,最后检查上下文。 文档列出的顺序是上下文、类型、值和频率;先执行频率限制的成本最低 [新增]。NaN 会通过
typeof(v) == "number"检查,却无法通过任何比较,因此应使用math.isfinite(Creator Docs;Suphi Kaner)。实测中,仅做范围检查的处理器收到 NaN 和无穷大载荷后,将 IntValue 余额设为 -9223372036854775808。 - Instance 参数是一种声明。 检查
typeof和IsDescendantOf(expectedFolder):表可以伪装成 Instance,客户端也可以重放其仍持有引用的已销毁拾取物(Creator Docs;Suphi Kaner)。 - 所有可由客户端触发的入口都是远程调用。 ProximityPrompt 只会在
Triggered时检查距离,并忽略Enabled。ClickDetector 不会进行服务端检查。Touched上报的是客户端的物理模拟结果(Creator Docs;Suphi Kaner)。 - 移动:新竞技游戏采用 Server Authority,现有休闲场景则采用服务端 MoveGuard。 决定因素是游戏类型,以及能否采用固定模拟、InputActions 和流式加载(Creator Docs;Jason Knight,Roblox)。Server Authority 无法阻止 ESP、自瞄或摄像头滥用(ev1)。
- 根据攻击者看到的情况验证命中。 Roblox 没有内置延迟补偿(ev1)。回溯服务端记录的位置,时间范围为
[now - min(ping + 0.1, 0.4), now][新增],或者使用约 10 度的锥形范围(ev1)。遮挡检查只考虑静态几何体(Creator Docs)。 - 后果逐级升级,并延迟出现。 保留会衰减的可疑度分数;执行措施前要求有两个不同原因;并随机延迟 20 至 90 秒 [新增数字],再采取可见行动。蜜罐远程调用和方向蜜罐是高置信度信号(Creator Docs,服务端检测)。对于移动违规,应使用橡皮筋回弹,而非踢出,因为延迟会造成误报(GnomeCode)。
- 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) 会复制这些模块并返回仓库内的路径。
- 审计。 目标:列出每个远程对象、处理程序和交互实例及其发现项。方法:
rbx_net.audit_place(place)离线运行(Lune),然后在 Edit 中运行rbx_net.run(studio, "return NetAudit.run(game, Audit)", kit=["NetAudit"], lead_kit=["Audit"])。 GATE:零错误;每条警告均已修复或说明理由;实时统计与离线统计一致。 - 验证并限流。 目标:参数错误或请求速率过高时,不运行任何处理程序。方法:
对每个客户端到服务端的远程对象使用
Net.bind(remote, {args = {Guard...}, limit = {capacity, perSecond}, handler = fn});在服务端时钟上使用幂等处理程序。GATE:审计中没有handler-unvalidated、nan-unsafe、trusted-value或no-rate-limit发现项。 - 命中。 目标:根据历史记录验证命中声明。方法:为每个目标维护 1 秒的
HitCheck.History,每次 Heartbeat 时推送;对静态墙使用带有ExcludeInstances或IncludeInstances的HitCheck.melee和HitCheck.ranged。GATE:拒绝超出距离、伪造起点、穿墙和偏移射击;有效射击能够命中。 - 移动。 目标:遏制速度和传送作弊,同时避免误报。方法:使用 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。 - 所有权和表面。 目标:客户端拥有的部件不会决定结果。方法:
对未锚定的拾取物、NPC 根部件和提示词父级调用
SetNetworkOwner(nil);Net.prompt重新检查距离、状态和速率;在MouseClick中检查距离;对Touched拾取物使用Net.touch(触碰者、CanTouch、距离、MoveGuard 可达距离、共享限流器)。GATE:客户端写入 CFrame 不会使服务端上的任何物体移动。 - 从客户端进行漏洞测试。 目标:拿出证据,而非意图。方法:在
Playtest中,rbx_net.fuzz(pt, path, gap=...),同帧垃圾请求、触发蜜罐,然后在 Server 数据模型中运行rbx_net.net_log(pt)。加入一个故意存在漏洞的远程对象作为负向对照。GATE: 余额和生命值保持不变,ok_<Remote>等于有效用例数量,没有服务端脚本错误,负向对照会发放奖励。Touched拾取物没有远程对象:使用exploit_case让客户端传送到部件上,然后并排测试一个Net.touch部件和一个裸Touched部件(P6)。 - 检测和后果。 目标:高置信度信号,延迟采取行动。方法:
Net.init({enforce = ..., enforceDelay = {20, 90}})、Net.honeypot、Net.serverOnly。GATE:一次蜜罐触发会安排延迟后到达enforce;单独的洪泛请求不会达到restrict阈值。 - 延迟。 目标:有效游戏体验能够承受真实网络延迟。方法:Play 前在 Edit 中运行
rbx_net.set_latency(studio, 100, 100),并对移动目标进行最后一刻的挥击。GATE:回溯命中率至少为 0.8。实时测试中,202 ms 延迟下:启用回溯时命中 13 次(共 13 次),未启用回溯时命中 0 次(共 13 次,运行三轮)。挥击时机设在接近可达距离并留有余量:余量剩 0.2 秒时,未启用回溯的命中率在不同轮次间从 31% 波动到 92%。 - 带宽。 目标:流量小,且仅在数据变化时发送。方法:选择不可靠传输前运行
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/s | MoveGuard 允许的 XZ 速度,dt 上限为 0.01 s | Suphi Kaner |
| 6 studs,每秒泄漏 0.5 | MoveGuard 突发令牌桶 | [新增] |
| 插值 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/s | Roblox 每个客户端的发送和接收目标(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 全面发布。
AuthorityModeServer 会设置 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)。
参考资料
- references/expert-notes.md:专家的原则和判断,附有时间戳和实时测量结果。
- references/procedures.md:P1 到 P11 阶段的完整代码,附测试 ID 和实时结果;松散部件和检测器检查(P6)、Server Authority 迁移清单(P11)以及顺序陷阱。
- references/critique.md:用于评估自身输出的通过与失败标准。
- references/gui-paths.md:执行相同任务的 Studio 菜单及脚本替代方案。
- references/sources.md:所有文档和视频,附凭据和时间戳。
- scripts/rbx_net.py:审计、工具包树、模糊测试、载荷探测、延迟和 NetLog 辅助工具。
- scripts/agentkit/networking/:
Guard、RateLimit、Suspicion、Net、HitCheck、MoveGuard、Exploit、NetAudit、lune_net_audit.luau。