Skip to content
This repository has been archived by the owner on Mar 9, 2022. It is now read-only.
ScottGriffin213 edited this page Feb 15, 2022 · 3 revisions

General

Why did you make BundleBouncer?

I got tired of getting nuked by assetbundle crashers.

Why the name?

BundleBouncer acts like a bouncer at a bar for downloaded assetbundles.

What does BundleBouncer do?

BundleBouncer is a plugin for MelonLoader that intercepts VRChat avatar assetbundles before they download, so that it can scan them for issues. If the assetbundle passes the tests, it is permitted to load.

Doesn't this other plugin/client do this already?

BundleBouncer is available to the public free-of-charge, is not hidden behind an invite-only Discord, and is not part of a larger client. In addition, many existing avatar hiders only block the avatar after download and do not effectively protect against assetbundle crashers.

Why is BundleBouncer not available on VRCMG/VRCMelonAssistant?

The VRCMG Discord, which provides the dataset for VRCMelonAssistant, the auto-updater and update checker plugins, and other package management systems, requires a manual review for every uploaded change. Because BB is still in very active development, it's not wise for us to put it up for review yet. We will be making a VRCMG listing soon.

Technical

What is an AssetBundle?

Unity is a 3D game development platform, so developers need a way to store all their assets (meshes, textures, rigs, animations, etc) in an efficient manner. An AssetBundle is Unity's standardized answer to this puzzle, by providing a simple API by which developers can load assets from a single file.

What is Dependencies/BundleBouncer.Shitlist.dll?

This file contains a set of built-in avatar and assetbundle blacklists.

WTF is all this weird code in Dependencies/BundleBouncer.Shitlist.dll?

The shitlist DLL uses optimized if-trees to match SHA256 checksums efficiently. These if-trees are generated at compile time from a trie (sic) in order to optimize lookups, and to provide mild obfuscation. Similar structures are used in many parsers due to their efficiency.

Why are avatar IDs hashed/obfuscated?

We wish to make it difficult for skiddies to try and scrape avatar IDs from our code. While it is possible to find the IDs, it requires that the actor in question already know the ID.

Why are so many methods hooked?

Due to VRChat's closed-source nature, their use of IL2CPP, and their unwillingness to work with security researchers, we have to guess at how they are loading avatar assetbundles. We therefore make use of a shotgun approach and hook as many possible ingress routes for assetbundles.

Why are you patching UnityPlayer.dll?

BundleBouncer needs to intercept AssetBundles just after they are downloaded, but before they are parsed by Unity. Because of how Unity works, we have had to actually implement our own modified download stream so that bytes are saved to disk before they are sent to the Unity AssetBundle loading infrastructure, otherwise we would only be getting small snippets with zero context.

Security

What is an AssetBundle Crasher (ABC)?

Because of their design, VRChat is particularly weak to a vulnerability in Unity where a maliciously-crafted assetbundle will throw an assertion in Unity's native code. This causes Unity to crash to desktop without giving managed code the opportunity to catch an exception.

Has the ABC vulnerability been reported to VRChat?

VRChat cannot fix this issue, it is a problem with Unity itself.

Has the ABC vulnerability been reported to Unity?

Yes.

What can VRChat do to fix ABCs?

  1. Petition Unity to fix the problem. Unity has rejected this solution so far, since assetbundles were not intended for UGC.
  2. Stop using AssetBundles for UGC, as they have many similar problems. Unfortunately, this solution cannot be easily made due to the vast amount of existing UGC.
  3. Run a small Unity program that checks assetbundles after upload. If the program attempts to load assets from an assetbundle and then crashes or freezes, the assetbundle is rejected. We are working on a public, CLI, scriptable tool for this purpose.

What can Unity do to fix ABCs?

Make the asserts trigger an exception that can be caught by managed code.

Have the ABCs in your database been reported to VRChat?

Yes, and we are making an automated system for this purpose.

Shitlists

Why is the database called a shitlist rather than a white/black/block/allow/etc list?

Because it's funnier, and the list will eventually contain multiple kinds of rules.

Why isn't your database public?

We don't want skiddies getting access to a large list of known-malicious avatar IDs.

How can I add an avatar to the list?

Add a line containing just the avatar ID to UserData/BundleBouncer/My-Blocked-Avatars.txt.

You should then send the ID to us via the email provided in the README.

An avatar on your list isn't malicious!

Our list is regularly checked by an automated script that attempts to load samples into a small Unity program. If it crashes during the process, the sample is listed as an ABC.

If you think we're wrong, please send an email to Scott (scgriffin213@outlook.com).

In the meantime, you can add the Avatar ID to UserData\BundleBouncer\My-Allowed-Avatars.txt and/or the assetbundle SHA256 hash to UserData\BundleBouncer\My-Allowed-Asset-Hashes.txt.

Troubleshooting

My friend is invisible and has a red pill around them. How can I fix this?

Your friend was blocked by BundleBouncer and automatically added to a user shitlist in case they eventually found a way to crash you that worked. To fix this, tell them to stop being a client monkey, then close your game and remove their user ID from UserData/BundleBouncer/Player-Blacklist.json.

I was crashed by an ABC!

Tell us the avatar ID via the process described in the README file.

BundleBouncer won't load

  1. Check your version of VRChat.
  2. Check your version of MelonLoader.
  3. Make sure you have VRChatUtilityKit and UIExtensions installed.
  4. Make sure you have the latest core DLL from the releases page.

If all else fails, hop onto Discord and ask for help in the #bundlebouncer channel.

Contributing

Can I help out?

Yes. You can submit PRs against our public codebase and help triage bugs.

Can I help out with the secret codebase?

No. We don't want anyone to have access to the avatar shitlist database. Only people I know and trust have access.

Can I fork BundleBouncer?

You may fork the public codebase.

Can I use BundleBouncer in my client/mod package?

Sure, as long as you provide credit and aren't using it for malicious purposes.

For future alien archaeologists

Your project died. How do I get access to the secrets?

Email me. Beware, lots of the build process involves self-made tools and hacks.

Glossary

Skiddie
Skiddies
Low-skill malicious actor, frequently using someone else's tools rather than making their own. Many are young teens or children. From *script kiddie*.
Client
A large injected plugin for VRChat that usually contains a large set of features. Term generally used in reference to malicious clients.
Client monkey
Slang for a VRChat user obviously and blatantly using malicious features. Generally low-skilled and confrontational.