- What do you want to achieve? Keep it simple and clear!
I want to get to the bottom of combating an exploit that seems to be simply too persistent. No matter what we have tried the exploit somehow still manages to go through.
- What is the issue? Include screenshots / videos if possible!
There is an exploiter (or possible more) that keep targeting a car driving game I am working for, and I happen to be the one that scripts it all. The exploit is the insertion of a foreign sound object into the workspace of the game that plays bypassed music loudly for everyone.

A loop I ran in the workspace found this audio which silenced the music. From this image alone I deducted that the exploiter could choose a name, pitch, and SoundId for the object, which is plenty of freedom.
I want to add that one of our developers did have an infected plugin that inserted a backdoor script in the past, but that has been addressed long ago and the current build of the game is clean from suspicious scripts with obfuscated code or weird require() calls.
- What solutions have you tried so far? Did you look for solutions on the Developer Hub?
I looked through the entire game using CTRL+Shift+F to find items related to Instance.new, getfenv, require, etc but came up empty handed. Currently everything audio related is managed by server and the client can only choose things like a radio station, engine, and so on, not audios and properties directly.
There is also zero instances of Instance.new() being able to be used freely, and the only Instance.new(“Sound”) in the game is in a local script that gets an OnClientEvent from the gun system, the hypothetical scenario of the exploiter changing the guns sound ID then firing it to trigger the client event has been tested and only the offender was affected, rest hearing regular gunshots.
When spawning a car, the car comes with a set of sound objects placed already to avoid needing to use Instance.new(), and the IDs for it are taken from the cars module script, not a local script. The server side script that manages the volume and pitch also go through a math.clamp().
The custom car radio we have is also heavily secured, the server-side script limiting the volume between 0 and 3, only allowing a custom ID and only goes forth if the player has a gamepass, which gets prompted to buy if they don’t have it… the range of the sound is also small.
We also use an admin system called Adonis, which i confirmed twice with the owner that its the official one, having checked myself the modules it requires and comparing it with the official one from Epix Incorporated.
The obvious SoundService.RespectFilteringEnabled is checked and loadstring() is not enabled.
I tried to look on the devforum for answers but none have fixed the issue.
In summary:
- RespectFilteringEnabled and loadstring() are as they should be
- No remote event ingame that can freely create sound objects on client request
- Only one case of remote event which can change SoundId of a cars radio, but that is heavily secured
- Exploiter somehow inserts a sound object into workspace with a custom name, pitch and SoundId that can be heard by everyone loudly while no ingame feature or RemoteEvent offers such large freedom.
Our current plan is possibly replacing Adonis with a custom admin system but I really doubt Adonis would have vulnerabilities as heavy as this, plus their music command places sounds in SoundService not workspace. All of this is concerning and I don’t know where to look anymore.
Edit: I got the Adonis main module and forked its sound related commands, purposely breaking them so they don’t work and throw an error instead, and then made the Adonis loader use the forked module instead of the official live one. These loud music cases I get from the players seem to have stopped from a sudden…? I will give it some time and make a second edit if the loud music exploit cases happen again, it could be a coincidence.
Edit 2: It still happens, Adonis is not it. The exploiter can even choose where to put the sound, I don’t know anymore what could be causing this.