Sorry for writing all of this in single post, but all of this is connected to that single issue of broken protocol design.
So far most of protocol works on very funny rule to send data to other clients, and other clients sometimes validate some of that data - but this can't be made really secure, especially that other clients trust other clients, currently client actually inform other client who it is, and this is just wrong... Anyone can spoof any packet to be send as anyone else - including mods.
Other problem is that avatars are not validated at all, client can just send custom ApiAvatar object with custom URL to his own web server with own avatar asset bundle - and every client will download it.
And they can also send custom userId of other player.
There will be more and more players each day, and with current protocol it is just impossible to make it really secure.
Stealing avatars can't be fixed, but can be made much harder to perform - we can save if given avatar id is public or not - only public ones can be used on pedestals, and if someone tries to switch to private one - no one see that change, as they will validate that given avatar does not belong to that client.
Then it is possible to also validate that changed avatar belong to that person OR that there is pedestal next to that person with this skin, so they can't change it to random skin.
People still can skip this - as they can download skin and reupload it as own one, but at least this will be much slower and will not allow for super simple troll button to become someone else.
There just need to be a server that will authenticate each player in room on join - and that server need to inform other player about new player. Players can't inform about them-self, as this can't be secure, especially that VRChat use very small room, some hackers can easily become master client or be more than 50% of the room - so any checks based on clients can be faked.
In best case server should handle all packets - to check if player is moving in valid way - not too fast, not going into a wall, not flying, not teleporting, and not sending administration RPCs without required permission.
This same checking for modded client by sending .dll hash... client can just send valid hash and random hardware id, or even inject into a process after that and mod game in runtime.
As long as you trust the client in any information they send - there will be more and more "hackers". Banning will not help with anything here.
List of bugs caused by all this stuff above:
  • People can still go to non-friends friends+ room. (not sure about friends only, should be possible, at least for your friends that are in friends only world of someone else who is not your friend, but maybe for everyone)
  • People can spawn portal where they want without any validation.
  • And any number of them.
  • People can force other clients to download avatars from their own web server.
  • People can change own userId to anything they want.
  • People can teleport other people
  • People can logout/kick/warn other people without any validation - with custom message and colors, size etc.
  • People can send invites/request invites/or broken messages that can't be close with custom text in it - including basic formatting like with warn. (and you don't even need to mod client for that)
  • It is way too easy to use skin of other people
  • You can use no-clip and fly whatever you want on the map (and then teleport people here so they can't even change world without restarting the game)
  • And use this lack of any security in every mini-game available.
  • [EDITED] You can use vrchat as free extension to your disk, files are not validated at all, you can upload anything you want to later download it, people can use that to distribute illegal stuff using vrchat servers. What is worse, each of that files then considered as "white-listed" so later someone can find a way to load it as a plugin to some world.
Also I would personally say that choosing NodeJS for game server API isn't best choice, after all NodeJS process all requests in single thread, ofc it can be scaled, but with amount of request this game can send, it would be better to have something that can operate in multiple threads, not only use async IO.
I would actually love to work on such game, especially that I have some experience with protecting game protocols, but as you seems not to be interested in hiring I hope that at least this text will help VRChat to fix all this bug, to make this better place to all of us...
EDIT: added one more issue