My game was recently targeted by an exploit that allowed users to automatically complete certain game-wide actions that sped up the process for acquiring an ingame UGC item. A Youtube video got 2,000 views over a matter of hours, and hundreds of players were exploiting it.
I was able to implement and push a fix as well as detecting all users using it within 3-4 hours of the exploit being released (I was asleep the first 3 hours or so), and since then I have tracked down the GitHub repository of the bad actor, with exploits for many games as well as my own, and deobfuscated what I can manage to, with not much success.
In this case, I benefited massively from having very intimate knowledge of exactly how my game’s networking works. On seeing the exploit it was immediately obvious to me what the resolution would need to be because of that, and I was able to very quickly push out a fix. However, still to this point I have absolutely no knowledge of what the script itself does, I haven’t seen it, I got as far as deobfuscating and reverse engineering enough to find a single loadstring that brought in the UI Library, but not the actual script logic itself. With this instance I can guess pretty accurately what the script is doing, and I’m confident in most cases I could do the same as I’m always going to have a better understanding of my game than a bad actor does.
It is not the obfuscation making it difficult, it's Roblox's own limits on the permissions of developers in Studio
Here is my issue. Bad actors and the players who make use of these exploits have more access than developers themselves. They are free to access CoreScripts, CoreGui, essentially they have complete control over the game client as Roblox does. We as developers do not get the same special treatment.
What stopped me investigating further was that at every turn I was coming up against Roblox’s own permissioning blocking me. Not only do I have to deobfuscate the script, I have to somehow try and find alternatives to the services the script is using that I do have permissions for to test it, so that I can monitor what the script is doing, and in most cases there is no suitable alternative.
I feel that Roblox has, nobly, but misguidedly taken the weight of exploit prevention on their own shoulders, when this is simply not a realistic goal. No matter how much client detection is done on Roblox’s end, it will never be enough to prevent exploiters from running code clientside. In fact I feel that the recent hype around the improvements to anti exploit have had a negative affect and caused developers to become more complacent than ever, believing that Roblox will take care of the anti-exploit side.
Roblox need to offer the tools developers need to take exploit detection and prevention into their own hands, rather than restricting developers
A developer will always have a better idea of what’s going on in their game code than Roblox does. Universal anti-exploit can only work to a certain extent, the endless nuances of individual experiences mean that there will always be areas that are not covered.
While I am very happy to see Roblox taking the issue seriously on their end, they must understand that this is not a problem that can be addressed on just one side. I believe the standard of safety and fairness will be improved much more significantly by handing the power to developers than it is through platform-wide detection.
It is well known that there are multiple programs that offer this level of access. Developers currently have very few options to test with anything like that level of privilege, and the ways that are available come with inherent and very real risk. Running exploit code as a local plugin could potentially give a bad actor unfettered access to your game code if written to detect that it’s running in that environment. Developers are obviously not expected to download or subscribe to one of these programs themselves, either, I image this would be a bannable offense.
We are fighting on the losing side, and it’s not because we’re not able or motivated, it’s because Roblox is treating developers in the same way it treats bad actors, only we are trying to stick by the rules and they are not. The current state of things puts developers and players at risk.
A very high level suggestion
Roblox knows better than me how this can be done in a way that has a net positive impact. Though I feel that even in the worst case, where such a service was used by exploiters themselves to develop exploits, it at least puts us on an equal playing field with them - and I think we would win. We are the people who spend years learning and hundreds or thousands of hours creating experiences, the people who write these exploits are far less capable.
A sandboxed environment where we can run exploit code against our experiences, or simply the ability to use sensitive services in a testing environment would put us there. Such a program could be invite only, it could be heavily monitored, but it needs to exist.