ハクソク

世界を動かす技術を、日本語で。

カーネルアンチチートの仕組み

概要

  • 現代のカーネルアンチチートは、Windows上で最も高度なソフトウェアの一つ
  • ユーザーモード保護の限界とカーネル移行の必然性
  • アンチチートとチート開発者の技術的な軍拡競争
  • 主なアンチチートシステムの構造とアーキテクチャ
  • カーネルアンチチートの三層モデルと通信方式の詳細

カーネルアンチチートの進化と現状

  • カーネルアンチチートは、Windowsで動作するソフトウェアの中でも最も高度な部類
  • **最高権限(ring 0)**で動作し、カーネルコールバックのフックやメモリスキャンを実施
  • ゲーム実行中も透明に動作し、ユーザーにはほとんど気付かれない

ユーザーモード保護の限界

  • **ユーザーモード(ring 3)**は、カーネルより下位権限のため、カーネルドライバやハイパーバイザーによるバイパスが容易
  • 例: ReadProcessMemoryによるメモリ整合性チェックも、NtReadVirtualMemoryのフックで偽装可能
  • モジュール列挙APIも、PEBのパッチで回避される
  • これを受け、カーネルモードでのアンチチートが主流に

技術的軍拡競争(アームズレース)

  • ユーザーモードチートカーネルチートカーネルアンチチート
  • **BYOVD(脆弱な正規ドライバを利用した攻撃)**などで署名制限を回避
  • **ハイパーバイザー(仮想化)**によるOS全体の仮想化とアンチチート回避
  • PCIe DMAデバイスによるOSを介さないメモリアクセス
  • 各段階でコストと専門知識が必要になり、一般的なチート利用者の排除に寄与

主要アンチチートシステム

  • BattlEye:PUBG、Rainbow Six Siege、Armaなどで採用。BEDaisy.sysがカーネルドライバ
  • EasyAntiCheat (EAC):Epic Games所有。FortniteやApex Legendsなどに導入
  • Vanguard:Riot Gamesの独自システム。vgk.sysはWindows起動時にロード
  • FACEIT AC:Counter-Strike競技プラットフォームで使用

カーネルアンチチートとルートキットの類似性

  • 2024年のARESカンファレンス論文で、FACEIT ACVanguardが「ルートキット的特徴」を持つと分析
  • カーネルレベルの動作、システム全体のコールバック登録、広範なOS監視などが共通点
  • 意図と技術の違いを明確化しつつも、Windowsアーキテクチャ上の制約として説明

カーネルアンチチートのアーキテクチャ

三層モデル

  • カーネルドライバ(ring 0)
    • コールバック登録、システムコールフック、メモリスキャン、保護の実施
  • ユーザーモードサービス
    • SYSTEM権限でWindowsサービスとして動作
    • IOCTLでカーネルドライバと通信
    • ネットワーク通信、BAN施行、テレメトリ収集
  • ゲーム内DLL
    • ゲームプロセスにインジェクトされ、ユーザーモード側のチェックを担当
    • サービスやカーネルドライバと連携

通信方式

  • IOCTL(I/O Control Codes)
    • ユーザーモードとカーネルドライバ間の主要通信手段
    • DeviceIoControl経由で制御コードを送信、ドライバはIRP_MJ_DEVICE_CONTROLで処理
  • Named Pipe
    • サービスとゲーム内DLL間のIPCに利用
    • 高速かつシンプルな通知が可能
  • 共有メモリセクション
    • NtCreateSection/NtMapViewOfSectionで作成・マッピング
    • 高帯域・低遅延なデータ共有を実現

ドライバのロードタイミング

  • BattlEye、EAC:ゲーム起動時にドライバ(例:BEDaisy.sys)をロード
  • Vanguardシステム起動時vgk.sysをロード(SERVICE_BOOT_START)
    • これにより、以降にロードされる全ドライバを監視可能
    • 再起動必須なのはこのため

ドライバ署名要件

  • Windows 64bitでは**Driver Signature Enforcement (DSE)**が必須
    • EVコードサイニング証明書WHQL認証が必要
    • BYOVD攻撃はこの制限の回避手段

BattlEyeの構成詳細

  • BEDaisy.sys:カーネルドライバ。プロセス・スレッド作成、イメージロード、ハンドル操作のコールバック登録。スキャンや保護のロジックを実装

  • BEService.exe:ユーザーモードサービス。BEDaisy.sysとデバイスオブジェクト経由で通信。ネットワーク、BAN施行、検出結果のサーバ報告を担当

  • BEClient_x64.dll:ゲームプロセスにロードされ、ユーザーモード側のチェック自己整合性検証を実施

    • BEDaisy.sysが異常検知→BEService.exeへIOCTLや共有メモリで通知→BEService.exeがサーバと通信し、BANや切断などのアクションを決定

このように、現代のカーネルアンチチートは多層構造高度な通信・監視技術で、日々進化するチート対策の最前線に立つ。

Hackerたちの意見

ゲーマーではないけど、オンラインゲームのチート問題は面白い技術的な課題だと思う。正直、いい解決策が思いつかないんだよね。そういうゲームやシステムを設計したことがない人たちの「すべてをサーバーで処理する」っていう単純な答えは、笑っちゃうくらいひどい。
それは、停止とチューリングの間くらいだと思う。無限のリソースがあれば解決できる可能性が高いけど、そうじゃないと限界を狭めるだけだね。
技術的な観点から見ると、チーターは常に有利だと思う。だって、ゲームとアンチチートが動いているマシンをコントロールしてるから。アンチチートは、普通のプレイヤーがチーターだらけだと思わないように、十分に高い壁を維持する必要があるんだ。
Netflixがやったみたいに、ISPのサーバーを使うのがいいと思う。まだ分散コンピューティングのインフラがないのはちょっと変だよね。もしかしたら、エージェントがデータの近くで動くような一般的な計算ノードで動くことになるかも。
長期的に見て良い解決策は、リプレイに基づく機械学習と、適度に最新のクライアントサイド(カーネル以外)のアンチチートだと思う。チーターを抑止するには十分なレベルで。
チートを防ぐのは無理だと思う。そもそも、これはオリンピックやプロスポーツ、チェスじゃないからね。もっと言えば、ピックアップリーグみたいなもんだよ。競技の純粋さを守ることは目標にするべきじゃない。むしろ、楽しい試合を目指そう。マッチメイキングは通常、似たスキルレベルの相手を探すから、チーターは広い人口から抜け出させて、問題にならなくなるよ。あとは、プレイヤーがキルカメラを見て、自分の死をタグ付けできるようにすればいい。キャンパー、エイムボット、などなど。それから、試合数が多いプレイヤー同士を同じ戦術で集める。ゲームを真剣なビジネスとして扱うと、楽しさが全部なくなっちゃうよね。
今まで見た中でうまく機能する解決策は、非常にアクティブで優秀なサーバー管理者がいて、ゲームプレイを監視してチーターを永久追放することだね。たくさんの時間と、彼らが見るための良いUIや情報が必要だし、理想的にはリプレイも見れるといい。これが機能するのはプレイヤーがホストするサーバーだけで、大手ゲーム会社(例えばGTA)が自分たちのサーバーを運営しているのを見たことがない。彼らはチーターをゲームから排除できると思ってるみたいだけど、実際には無理なんだよね。
解決策は文化的なものだと思う。オンラインでチートする人は負け犬だってみんなで考えるべきだよ。(皮肉じゃないよ。)
リモートアテステーションを使ったMac OSは、カーネルアンチチートなしでもMac OS上でのアンチチートに十分強力だって証明されてる。
ほとんどの人は「サーバーで全てを行う」というのが、速いインタラクションやまともなローカル予測が必要なゲームを潰すことを無視している。レイテンシが急上昇して、メールでチェスをするようなものになってしまう。クリーンな答えはないよ。カーネルアンチチートもエレガントな解決策じゃない。別の地雷で、セキュリティホールや誤検知、壊れた開発ツール、Windowsのアップデートとの争いがあって、サーバー側にロジックを押し込むことは、ネットコードの調整に数週間かかるし、プレイヤーのピングがスパイクするたびにレースコンディションが発生するから、「より良いコードの規律」に収束するという考えは幻想だね。
現代的な競技ゲームで、オプションのアンチチートがあって、それを有効にすると他のアンチチートユーザー専用のマッチメイキングプールに参加できるようなものが見てみたいな。アンチチートなしのプールのプレイヤーには、「コミュニティモデレーション」があって、アンチアンチチートのプレイヤーがそれを推奨する感じで。どんなことが起こるのか、すごく興味あるよ。例えば、リリース後の最初の数週間でどれくらいのプレイヤーがそれぞれのプールを選ぶのか、そしてその後どれくらいの人が切り替えるのかとか。リリースから数ヶ月後や1年後に参加したプレイヤーはどうなるのかも気になる。残念ながら、これを実現できるのはValveくらいしかないと思う。彼らはプレイヤーのことを本当に気にかけているし、意味のあるデータを集められる規模だから。でも、Valveですらこれにリソースを割く価値があるとは思えないな。
> 現代的な競技ゲームで、オプションのアンチチートがあって、それを有効にすると他のアンチチートユーザー専用のマッチメイキングプールに参加できるようなものが見てみたいな。アンチチートなしのプールのプレイヤーには、「コミュニティモデレーション」があって、アンチアンチチートのプレイヤーがそれを推奨する感じで。これは大体ValveがCS2でやっていることだね。でも、私の理解では、あまり効果的ではなくて、残念ながらValorantよりもチート率が高くなってしまっている。
プレイセーフIDのこと?
それは基本的にプレイセーフIDだね。
それは存在するよ、FACEITって呼ばれてる(特にCS用)。ゲームに真剣に取り組んでる人はほぼそこでプレイしてる。コミュニティのモデレーションは、アンチチートのスケールには全く効果がないんだ。必要な労力、根本原因の特定、精度や信頼性の面でね。
> 現代のカーネルアンチチートシステムは、誇張なしに、消費者向けのWindowsマシン上で動いている最も洗練されたソフトウェアの一つだよ。彼らはソフトウェアに利用可能な最高の特権レベルで動作し、正当なセキュリティ製品のために設計されたカーネルコールバックを傍受し、ほとんどのプログラマーがキャリアの中で触れることのないメモリ構造をスキャンし、ゲームが動いている間にすべてを透明に行う。まあ、落ち着いて。アンチチートソフトウェアが「洗練されている」と信じる用意はあるけど、システムコールを傍受することがそれを意味するわけじゃない。特権を持って動作し、他のソフトウェアが動いている間に透明に動くソフトウェアはたくさんあるし、意図的に洗練されていないものもある。それはカーネルサブシステムと呼ばれている。
チートに対する解決策はあるけど、実装がどれくらい難しいかは不明だね。チーターは定義上異常な存在で、普通のプレイヤーが持っていない情報を使っている。エイムボットを使うと、他のプレイヤーが持っていないスキルを持っているし。サーバー側でプレイヤーの行動をすべてログに記録して、機械学習の手法を使えば、これらの異常を特定できるはず。異常検出は機械学習のサブフィールドだよ。最終的にはこれが解決策になると思う。なぜなら、最も賢いチーターだけが目立たずに優れたプレイヤーのように見えることができるから。最も巧妙に作られたエイムボットだけが、優れたプレイヤースキルのように見える。どちらの場合も、チートは問題にならない。なぜなら、被害者自身が確信を持てないから。サーバーが使える別の方法もあるよ:プレイヤーをゲーム内のエンティティで積極的にテストすることができる。チートを持っている場合にだけ反応するように設計されたものね。こうしたイベントはチーターに確率的な重みを加えることになる。最終的には、ゲームの世界はクライアントに完全には配信されないから、うまくやればチートはフィルタリングできない。例えば、潜在的なチーターが、彼らにだけ見える隠れたコーナーにキャンプしている偽のエンティティの範囲に入ると、その反応(マウスの動きや戦略の変化など)が評価される。そして、それが消えると別の評価が行われる(チートはこの部分に対する緩和策を提供するだろう)。時間が経つにつれて、チーターはノイズの中から目立つようになるし、大半はすぐに自分をさらけ出すだろうね。
私はしばらくの間、統計的ハニーポットモデルを提唱しているよ。これは、ストリーミングやLANゲームよりもはるかに強力なアンチチート対策だと思う。もし誰かが、定期的にアクセスしてはいけない情報を得る方法を見つけたら、最終的にはこれらの技術で見つかることになる。チートの正確なメカニズムは関係ない。これでも「検出不可能」なスクリーンスクレイピングやマウスロボットAIのようなものも捕まえることができる。十分な時間をかけて集めた信号は、決定的な証拠を提供することができる。 > その目標を念頭に置いて、これらのチートが使っている方法を理解した瞬間にパッチをリリースした。このパッチはハニーポットを作り出した:通常のゲームプレイ中には決して読み取られないゲームクライアント内のデータセクションで、これらのエクスプロイトによって読み取られることができる。今日禁止されたアカウントはすべて、このクライアント内の「秘密の」領域を読み取っていたので、すべての禁止が正当であるという非常に高い信頼を得ることができた。 https://www.dota2.com/newsentry/3677788723152833273
> チーターは定義上、異常な存在だよ。すごく上手いプレイヤーや、すごく下手なプレイヤー、変なハードウェアの問題を抱えてるプレイヤー、運良く一発当てたプレイヤーもそう。ランダムに分布した変数が十分にあれば、大数の法則によって、いくつかは純粋な偶然で異常になる。どんな統計的な異常を見ても、それが何かを意味するとは限らないから、もっと調査しないといけない。科学では、たくさんの変数を見て、論文を発表するために一つか二つの統計的に有意な変数を探すことを「pハッキング」と呼ぶ。だから、「Xに関連する健康状態」のような怪しい、時には矛盾する記事がたくさんあるんだ。
これってよく言われるけど、実際にはうまくいってないみたい。Valveはデモファイル(全入力)を分析する機械学習モデルにたくさんの時間とお金を使ってるけど、Counter-Strikeは依然としてチーターで溢れてる。実装がうまくいってないだけかもしれないけど、明らかに「MLモデルを問題に投げれば解決」ってわけじゃないよね。
ユーザーが気づかない限り関係ないっていう前提には同意できないな。例えば、10,000ドルの賞金がかかったCounter-Strikeのトーナメントをやってるとしたら、誠実さが重要だよね。そこで賢いチーターは「隠密」な手段を使ってる。基本的なレーダーや、すごく軽いエイムボットとかね。問題は、従来のチート(エイムボットやウォールハックなど)がユーザーに大きなアドバンテージを与えるから、重要な指標で標準偏差が何倍も離れてしまうこと。そこは同意するし、そういうことを探すアンチチートもあるよ。フラグが立ったユーザーのセッションをレビューするアンチチートも見たことがある。例えば、「チート有効」でセッションをレビューして、そのユーザーがチートしてるかどうかを判断するんだ。CSみたいなゲームでは、ユーザーがコーナーを正しくプレイしてるかどうかを大きなサンプルサイズで比較的自信を持って判断できるから、これもうまく機能する。ゲーム内のエンティティを調査する問題は、最終的にはクライアント側で解決しなきゃいけないってこと。例えば、「これは偽のプレイヤーだから、他のプレイヤーエンティティの隣にメモリに保存するけど、画面には表示しない」みたいなこと。これって複数のゲームで実際に起こったことがあって、一時的な解決策として機能したこともある。結局、これは猫とネズミのゲームになっちゃう。チート開発者はこれを検知して、ゲームクライアントと同じ解決ロジックを使うんだ。メモリアドレスが変わったりして、ユーザーは数時間や数日使えなくなるけど、開発者がパッチを当てて、またすぐに使えるようになる。最近のゲームハックは大きなビジネスになってる。チートはサブスクリプションとして提供されることが多く、月に10ドルから数百ドルまで幅広い。大きな利益があって、一部の大手ハック製造業者は顧客が何万人もいる完全な会社になってる。これは本当に大きなビジネスだと思う。現実的には、2つの選択肢しかないと思う。トーナメントが提供するハードウェアを使った対面LANマッチを要求するか、チートが存在しないように超ロックダウンされたシステムで運営するか。どちらにも問題があるけど…対面だとリスクが大幅に減るけど、常に悪用される可能性はある。超ロックダウンされたシステム(例えば、最新のプレイステーション)で運営するのも多分うまくいくけど、誰かが特別に自分の利益のために隠している0dayを持っていたらどうなるか。あり得ないシナリオだけど、いくつかのeスポーツにはお金が絡んでるから…何が起こるかわからない。
ハニーポットは結構使われてるよね。確かに役立つけど、それだけじゃ足りない。行動分析は実際には思ってるよりずっと難しいんだ。大体、隠れチーターは目立つほどのサインを出さないし、クラスターもすぐに動いちゃうから。人々のプレイスタイルは常に変わるし、エンジニアが思うほどメトリックの選択が問題なわけじゃない。コミュニティの動向を見守る必要があるんだ。今のところ、それができるのは人間だけだね。
本当の「競技的」なゲームは、プレイヤーが他のプレイヤーと対戦することではなく、ハッカーがアンチチートと対戦することだよ。「ビリヤードは物理学ほど良いゲームではない」 (https://mag.uchicago.edu/billiards)
カーネルレベルのアンチチートは、クライアントが怪しいことをするのを防ぐための最大限の努力だよ。でも、今でもそのシステムを使ってるゲームでチーターがいるのを見かける。これは、ゲームサーバーがランダムなクライアントを信頼できないことを証明してる。コストの問題もあるし、クライアントで何を計算するか、サーバー側で何を計算するかの話なんだけど、ゲームがクライアントの計算や「入力」を信頼している限り、チートの問題は続くよ。
コストの問題じゃなくて、トレードオフの話だよね。オンラインシューティングゲーム(例えば)では、遅延があって、アクションを取るときに両方のクライアントが少し違った視点を持つことになる。ネットコードがどれだけ頑張っても、俺が画面でお前を見てるのに、お前が俺を見てないってのは、不公平に感じるのはどうしようもないよ。
これ全部、ほんとにひどいよ。カーネルに手を加えるのは、OSのセキュリティと安定性のモデルを根本から無視することだし。これは理論的な話じゃなくて、バグのあるアンチチートソフトウェアを通じてルート権限を取得された人たちがいるんだ。ゲームが悪意のある呼び出しをカーネルに送って、アンチチートをハイジャックしてルートアクセスを得ることもある。もっと軽微なケースでも、カーネルAPIが誤ってインターセプトされてオーバーライドされることで「グレムリン」や変なエラー、ブルースクリーンが発生することがよくある。ここでの解決策は、ブート時から信頼のルートを確立し、OSのサンドボックス機能(NTのジョブオブジェクトなど)を使うこと。安全な実行環境を提供するのはOS開発者の仕事だよ。セキュリティに関するすべてのまともなアプローチは、悪者を排除することに依存していて、彼らが侵入した後の被害を軽減することじゃない。
つまり、ユーザーが検証されたソフトウェア以外をインストールできないように、コンピュータを完全にロックダウンして売るのが解決策ってこと?
セキュリティに関するまともなアプローチは、クライアントをロックダウンするんじゃなくて、サーバー上で許可されたアクションを確認することに依存してる。
PCに簡単に接続できるハードウェアがあって、任意のカーネルメモリを読み書きできるんだ。カーネルレベルのアンチチートが、本当にチートしたい人を止められない気がする。詳しくはここを見てね: https://github.com/ufrisk/pcileech
この記事で触れられてたよね。
みんなのために簡単に言うと、彼らはやらないよ。でも、著者が表面的な分析を超えて掘り下げてくれたのは感謝してる。現代のチートはハイパーバイザーを使ったり、ハイパーVを侵害したりしてる。ハイパーVは自分を守るから、チートも自動的に守られる。最近すごく人気なのはBIOSパッチングで、ほとんどのマザーボードはブートガードをサポートしてないし、直接BIOSをフラッシュするのは常に選択肢だよ。DMAは特にフューザーの間で人気だけど、良いものの価格は、バンガードが一般的な方法と戦っているせいで上がってきてる。これは仮定じゃなくて、アンチチートがレベルアップするたびにチートも進化する。結局、一番弱いリンクが悪用されるし、アンチチートがどれだけ高度でも関係ない。チート開発者が恐れているのはAI、特にオーバーウォッチで。普通のプレイヤーに迷惑をかけるようなチートはほぼ不可能になってるし、彼らはユーザーモードのアンチチートしか持ってない!彼らはスプーフィング検出やゲームプレイ分析、コミュニティの報告に大きく依存してる。チートを検出するのではなく、チーターを検出して、彼らのシステムに関する情報をできるだけ多くキャッチするんだ(全部ユーザーモードから!!!)。もちろん、彼らがこの情報をキャッチするためにユーザーモードを通る必要があるから、その隙をついてカーネルに座っていることもできるけど、ハードウェア認証がますます難しくなってきてる。未来はユーザーモードのアンチチートとゲームプレイ分析で、カーネルモードのアンチチートは不要だよ。セキュアブートは、BIOSでSMMをパッチすると機能しないから、TPM認証が行われる前に実行されるんだ。
君が説明したことはすべて、攻撃(チートを作成すること)のコストを上げることにつながる。結果的に、誰もがそれを手に入れられるわけじゃないから、アンチチートは機能するんだ。万能薬である必要はない。ゲームプレイの分析は明らかなチーターには効果があるけど、シンプルなESPを使ってるプレイヤーには見逃すことになる。これは「スマホにパスワードはいらない」って言ってるのとほぼ同じだね。
>「もうチートするのは文字通り不可能だ(普通のプレイヤーに影響を与えるような形で)」つまり、最も簡単に検出できる方法で、ゲームにチーターがいないと主張する最も簡単な方法だ。行動分析は、隠れチーターには効果がないし、彼らはコミュニティを腐らせて、ゲームにもっと微妙な形でダメージを与える。ずっと競い合ってきた相手が最初からわずかなアドバンテージを持っていたと知ることほど、最悪なことはない。
このスレッドにいる人たちの中で、明らかに競技ゲームをやったことがない、ましてや高レベルでプレイしたことがない人がこんなにいるのは驚きだわ。「マルチプレイヤーゲームでチートするのは神から与えられた権利だ」ってコメントは、今まで読んだ中で一番クレイジーな意見かもしれない。カーネルアンチチートはちゃんと機能するよ。ValveのVAC(クライアントベース、シグネチャ分析)とVACNet(機械学習)の記録を見るのに5秒もかからない。これらの技術のチート問題は、カーネルレベルのアンチチートを使うプラットフォーム(例えば、FACEITやVanguard)よりもはるかに広がってるのがわかる。もちろん、KLACが完璧ではないのは分かってる。チートは存在するし、これからも存在し続ける。でも、参入のハードルは大幅に上がる。FACEITやVanguardに検出されないカーネルチートは高額で、しばしば定期的なサブスクリプションが必要(中には1日や1週間単位でのものもある)。チート開発者は99%の確率でこれを公にリリースしない。なぜなら、すぐに検知されてしまうからで、プライベートで販売することで大きな利益を得られるから。記事にも書かれてたけど、DMAデバイスを使うなら、ハードウェアだけで数百ドルはかかるし、チート自体は含まれてない。これがビデオゲームなんだ。誰も君にプレイすることを強制してない。もしKLACに道徳的に反対するなら、単にそのゲームをプレイしなければいい。KLACが嫌なら、君の体験は常に、繰り返し台無しにされる覚悟をしなきゃ。