<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Justice MontgomeryWalkup</title>
    <description>The latest articles on DEV Community by Justice MontgomeryWalkup (@justice_montgomerywalkup_).</description>
    <link>https://dev.to/justice_montgomerywalkup_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3979775%2F54e985fa-eaa1-4475-9aba-7426bab9faa4.jpg</url>
      <title>DEV Community: Justice MontgomeryWalkup</title>
      <link>https://dev.to/justice_montgomerywalkup_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justice_montgomerywalkup_"/>
    <language>en</language>
    <item>
      <title>Why VALORANT Can't Come to Mac — And Why It Doesn't Have to Stay That Way</title>
      <dc:creator>Justice MontgomeryWalkup</dc:creator>
      <pubDate>Thu, 11 Jun 2026 15:05:02 +0000</pubDate>
      <link>https://dev.to/justice_montgomerywalkup_/why-valorant-cant-come-to-mac-and-why-it-doesnt-have-to-stay-that-way-4972</link>
      <guid>https://dev.to/justice_montgomerywalkup_/why-valorant-cant-come-to-mac-and-why-it-doesnt-have-to-stay-that-way-4972</guid>
      <description>&lt;p&gt;VALORANT isn't on macOS. Not because Riot doesn't want it there, not because&lt;br&gt;
Apple Silicon can't run it — but because of a single implementation detail:&lt;br&gt;
Apple effectively bans third-party kernel drivers, and Riot's anti-cheat,&lt;br&gt;
Vanguard, needs one to work.&lt;/p&gt;

&lt;p&gt;So I spent the last few months building a proof-of-concept to answer one&lt;br&gt;
question: &lt;strong&gt;does it actually need one?&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Real Problem
&lt;/h2&gt;

&lt;p&gt;Kernel-level anti-cheat (&lt;code&gt;vgc.sys&lt;/code&gt;, EAC, BattlEye) exists because Windows is&lt;br&gt;
an open platform. Memory can be read across processes. Unsigned code can be&lt;br&gt;
injected. Hardware DMA cards can bypass software entirely. A kernel driver is&lt;br&gt;
the only vantage point high enough to police all of that.&lt;/p&gt;

&lt;p&gt;Apple Silicon is a different environment. Most of those attack surfaces don't&lt;br&gt;
exist the same way — or don't exist at all.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Windows threat&lt;/th&gt;
&lt;th&gt;Why it needs ring 0&lt;/th&gt;
&lt;th&gt;macOS — no ring 0 needed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory read/write cheats&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OpenProcess&lt;/code&gt; requires handle strip&lt;/td&gt;
&lt;td&gt;Task-port model + ES events gate access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DLL injection&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AppInit_DLLs&lt;/code&gt;, remote thread&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DYLD_INSERT_LIBRARIES&lt;/code&gt; caught at exec by ES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsigned kernel code&lt;/td&gt;
&lt;td&gt;BYOVD is a live threat&lt;/td&gt;
&lt;td&gt;No kexts without Apple notarization + reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMA hardware cards&lt;/td&gt;
&lt;td&gt;Requires VT-d/AMD-Vi verification&lt;/td&gt;
&lt;td&gt;DART IOMMU + no user PCIe on most Macs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boot-state integrity&lt;/td&gt;
&lt;td&gt;Relies on TPM (bolt-on)&lt;/td&gt;
&lt;td&gt;Secure Boot rooted in SEP (native)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Apple didn't just close these vectors — they built the replacements into the&lt;br&gt;
hardware.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vanguard-for-macOS&lt;/strong&gt; is a two-component PoC that delivers anti-cheat&lt;br&gt;
guarantees without a kernel driver:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — Endpoint Security Monitor (C)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
An entitled user-space agent that subscribes to Apple's ES kernel event stream.&lt;br&gt;
It catches every event competitive integrity actually cares about: process&lt;br&gt;
lifecycle, task-port (memory) access requests, and dylib injection attempts —&lt;br&gt;
all without ring 0, all through an Apple-vetted API.&lt;/p&gt;

&lt;p&gt;Expected output when a cheat attempts memory access against a protected process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[2026] ALERT GET_TASK    requester=loader  target=MyGame
[2026] ALERT EXEC+INJECT path=MyGame  via=DYLD_INSERT_LIBRARIES=/path/to/hook.dylib
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 2 — Hardware Attestation (Swift + Node.js)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The Secure Enclave generates a non-exportable P-256 key. Apple's App Attest&lt;br&gt;
service certifies it. The game server verifies the full certificate chain from&lt;br&gt;
scratch — no black box, every check is auditable. The result: the server only&lt;br&gt;
trusts clients whose hardware proves they're running the real, unmodified agent.&lt;/p&gt;

&lt;p&gt;Running today on real Apple Silicon hardware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[attest-client]   SEP P-256 key generated.
[attest-client]   private key export refused by SEP (expected) ✓
[attest-client]   enclave-signed message verifies: ✓

verifyAssertion — happy-path:
  ✓ valid assertion accepted
  ✓ replayed counter rejected
  ✓ tampered clientData rejected
  ✓ wrong rpIdHash rejected
  ✓ foreign-key signature rejected
  5 passed, 0 failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core idea is a &lt;strong&gt;trust inversion&lt;/strong&gt;: the client doesn't need to be&lt;br&gt;
unbreakable, it needs to be &lt;em&gt;unforgeable&lt;/em&gt;. Tamper with the agent, its code&lt;br&gt;
signature changes, attestation breaks, and the server stops trusting it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Still Missing
&lt;/h2&gt;

&lt;p&gt;I'd rather say this up front than have you find it yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ES entitlement (&lt;code&gt;com.apple.developer.endpoint-security.client&lt;/code&gt;) requires
Apple's review to run on stock macOS. It's pending. Without it, Phase 1
requires SIP disabled to demonstrate — which matters.&lt;/li&gt;
&lt;li&gt;Phase 4 (System Extension packaging) isn't done yet. That's the step that
turns this from a research build into something a studio could actually ship.&lt;/li&gt;
&lt;li&gt;Server-side heuristics, continuous runtime attestation, and hardware input
emulators are out of scope — those are backend problems no client agent fully
closes anyway.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Every Mac player excluded from VALORANT is excluded by an implementation detail,&lt;br&gt;
not by a fundamental security limitation. Apple Silicon's trust chain is&lt;br&gt;
arguably &lt;em&gt;better&lt;/em&gt; than a Windows kernel driver for this use case — it's native&lt;br&gt;
to the hardware, it can't BSOD the machine, and the distribution model (Apple's&lt;br&gt;
entitlement review) is itself a trust property.&lt;/p&gt;

&lt;p&gt;This isn't a complete product. It's a proof that the path exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub: &lt;a href="https://github.com/JusticeRox98577/Vanguard-for-Macos" rel="noopener noreferrer"&gt;github.com/JusticeRox98577/Vanguard-for-Macos&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you work in macOS security or anti-cheat and want to poke holes in it, I'd&lt;br&gt;
genuinely welcome it. If you work at Riot — I'd love a technical conversation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Independent research. Not affiliated with, authorized by, or endorsed by Riot&lt;br&gt;
Games or Apple.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>macos</category>
      <category>security</category>
      <category>gamedev</category>
      <category>anticheat</category>
    </item>
  </channel>
</rss>
