VAC-Safe Wallhacks, or an sv_pure
and .vmt $ignorez
bypass
July 14, 2025
I’ve reached out via email to two Valve employees known to actively contribute to TF2, and the TF Team, but haven’t heard back since my initial email on April 20, 2025 (85 days before making this public). I disclosed in my email to the TF Team when I would make this exploit public, to raise awareness and hopefully prioritize creating a fix, and / or make it easier to come up with a community fix in the meantime.
sv_pure 2
doesn’t allow stuff like custom sounds, models, materials, particles, etc. Additionally, the .vmt $ignorez
shader parameter is disabled for models only, and prints a console error message saying it was ignored.
In /tf/gameinfo.txt
, replacing type multiplayer_only
with type singleplayer_only
appears to bypass both the sv_pure
rules and the $ignorez
safeguard, with no console message. Playermodel .vmt and .vtf files are no exception, enabling VAC-Safe wallhacks, playermodel included. All servers are affected, no matter the sv_pure
value. Here’s a video example from a sample demos.tf demo:
Note: This may also be present in other Source games (aside from CS:GO (see below) and CS2), though I’ve only tested TF2. CS2 is already
singleplayer_only
withingameinfo.gi
by default, likely because the option makes no difference(?) there, or only has one mode.
I’m not the first by any means to discover this exploit, at least for everything not involving $ignorez
. The earliest mention I could find is from a more thorough explanation in CS:GO dating back to 2020, which looks to be really similar (if not the same). It was also reportedly patched by Valve not long after. cueki notes the bypass has been widely known since 2018-2019. I’d recommend taking her words with a grain of salt, given her history of using wallhacks to disrupt competitive PUGs.
That aside, I came across the first example of this exploit after seeing someone use fullbright playermodels to aid with player visibility in late 2024. This has been distributed a fair bit, at least among RGL 6s players. I acquired the custom files for them, and experimented until I found the $ignorez
parameter and tested it in a private sv_pure 2
server with a friend. In April, I compiled what I knew and a video of how to reproduce it, and reached out to Valve.
This example enables wallhacks on the default RED Scout playermodel, on a fresh install of TF2. I’ve provided the VPK these steps produce, along with a video.
/tf/gameinfo.txt
and replace type multiplayer_only
with type singleplayer_only
, and save./tf/tf_misc_dir.vpk
/materials/models/player/scout
, and right click -> Extract Folder...
/tf/custom/test-materials/
, after creating this filepath./tf/custom/test-materials/materials/models/player/scout
"$ignorez" "1"
to scout_red.vmt
and scout_head_red.vmt
, and save.
Launch TF2.
sv_pure 0
and map cp_sunshine
(to “preload” the these .vmts)sv_pure 2
and map cp_snakewater_final1
mp_tournament 1
and tf_bot_add red scout
Upon approaching spawn doors, you should be able to view the red scout’s model through the wall.
https://www.youtube.com/watch?v=hd4N-xtSuCo
test-materials.vpk (catbox renames files)
Set /tf/gameinfo.txt
back to type multiplayer_only
, or verify game files (which will do the same thing).
VPKEdit can pack extra stuff into a map file the client is forced to load. The downside is that map filesizes would increase.. a lot (~9GB with these default assets). This doesn’t include per-map assets, which should also be packed into the map. Not ideal..
In console, the output from running trackerlistallfiles
can differentiate between TF2 launched with singleplayer_only
from multiplayer_only
, but is just a client-side command. The singleplayer_only
file list has much fewer entries (depending on how much is in your custom folder), while the multiplayer_only
list has thousands. It also appears in the console of POV demos. This would probably call for more aggressive demo checking by competitive leagues.. and of course can’t stop people from joining the server and using it. It’s still worth consideration. Thank you to @rtldg 🕵️ for discovering this.
The root cause for this is most likely in the closed-source Source Engine, not the SDK. That said, another possible fix is for Valve to add a .sig file for gameinfo.txt
, which was done for items_game.txt
in 2014. With that update, an engine error became presented if a bad items_game.txt
was found.
huge thanks to siyo at Fireside Casts for getting in touch with competitive league heads before public release