Malwarebytesの近代化を支える、見えない作業

セキュリティ製品の信頼性を支える作業の多くは、目に見えません。ユーザーの目に映るのは、スキャンが完了したこと、脅威がブロックされたこと、一晩のうちにアップデートが適用されたことだけです。その裏側にあるプラットフォームは見えません。ランタイム、マネージドライブラリ、ネイティブドライバー、Windowsの要件はすべて、数百万台のエンドポイント上で常に最新の状態を保ち、互いに連携し続けなければなりません。.NET 10への移行は、私たちがこの基盤をどのように前進させ続けているかを示す一例であり、本稿ではこの取り組みに焦点を当てます。

こうしたアップグレードを単なる保守作業と呼んで片付けてしまうのは簡単ですが、それでは実態を過小評価することになります。私たちのコードは常時稼働し、高い権限を持ち、Windowsの中でも特に機密性の高い部分のすぐそばで動いているのです。

ランタイムやサードパーティのライブラリから、ネイティブドライバー、オペレーティングシステムの要件に至るまで、私たちのスタックを構成するあらゆる依存関係が、ソフトウェアが動作する環境そのものに影響を及ぼします。一つが変われば、それに依存するすべてのものが変わらざるを得ない場合もあります。

課題:立ち止まったプラットフォームは取り残される 

エンドポイントセキュリティの世界では、足場が止まることはありません。Windowsは進化し続け、脅威も進化し続けます。ハードウェアもまた、ARM64搭載ノートPCから、私たちのコードが最初に書かれた当時よりもはるかに大きなメモリと高速なストレージを備えたマシンへと進化しています。 

立ち止まったプラットフォームは現状維持にはなりません。むしろ取り残されていきます。依存関係やランタイムのアップデートを一度見送るたびに、私たちが構築の土台とした当時のエコシステムと、今日安定して使われているエコシステムとの間の溝は広がっていきます。 

最新のランタイム、とりわけ.NET 10は、より高いセキュリティ、より高速なコードパス、より小さなメモリフットプリント、そしてより豊富な診断機能をもたらしてくれます。同時に、開発者にとっても、より効率的に作業できる言語機能やツールの改善をもたらします。

セキュリティソフトウェアにとって、この点は特に重要な意味を持ちます。

  • Webアプリケーションであれば、デプロイをロールバックすれば済みます。しかし、顧客のエンドポイントに既にインストールされたソフトウェアはそうはいきません。
  • 私たちのコードは高い権限を持ち、カーネルドライバーや改ざん防止機能と並んで動作しています。 
  • ランタイムの不具合は、一台のサーバーだけに影響するものではありません。数百万台のマシンに影響が及ぶ可能性があります。 

だからこそ私たちは、ランタイムのアップグレードをセキュリティ機能そのものと同じ厳格さで扱っています。

課題:すべてが連動して動く 

Malwarebytes for Windowsは単一のプログラムではありません。ユーザー向けのインターフェース、複数の常駐Windowsサービス、インストーラー、自己更新パイプライン、プラグイン基盤、そしてサードパーティのマネージド依存関係が組み合わさった、協調的なシステムです。 

これらはネイティブドライバーと検出エンジンの上に位置しています。今回の.NET 10移行は、Malwarebytesのマネージド部分を対象としたもので、このネイティブコア部分には手を加えていません。とはいえ、それぞれの層は依然として連携して動作しなければなりません。

今回の移行では、以下の要件を同時に満たす必要がありました。 

  • セキュリティに関わるコードは、変更前後で全く同じ挙動をしなければなりません。 
  • ネイティブドライバーと改ざん防止レイヤーは、マネージドコードと引き続き正しく連携して動作しなければなりません。
  • インストーラーと更新パイプラインは、新しいランタイムのファイルを配布し、古いファイルを削除する必要がありました。 
  • プラグインとサードパーティの依存関係は、互換性を維持する必要がありました。
  • 既存のMalwarebytesのインストール環境は、そのまま動作し続ける必要がありました。 
  • すべての処理経路を人手で一つひとつ検証しなくても結果を信頼できるよう、自動検証を十分に手厚くする必要がありました。

マネージドコードとネイティブコードの境界には、特に注意を払いました。私たちのサービス内のマネージドコードは、P/InvokeやCOMといったインターフェースを通じてネイティブコンポーネントとやり取りします。ランタイムの変更は、Malwarebytesを構成するこれらの異なる部分がどのように通信し連携するかに、微妙な影響を与える可能性があります。

こうした違いは、デモの場では決して表面化しないかもしれません。1万台に1台のマシンでしか現れないこともあり得ます。だからこそ、顧客より先にそれを見つけ出すことが重要なのです。

アップデートは一様ではない 

依存関係をアップデートする理由は主に3つあります。自ら選択して行う場合、下層のプラットフォームに強いられる場合、そして脆弱性によって行わざるを得なくなる場合です。それぞれでタイムラインが異なります。 

選択的な近代化。新機能や修正、セキュリティの改善を取り入れるために、新しいランタイム、ライブラリのメジャーバージョン、あるいは新しいプラットフォーム機能への移行を自ら選択することがあります。 

ベースラインの移行。プラットフォームの要件が進化するにつれて、古い互換性の制約が近代化の足かせになることがあります。例えば.NET 10への移行によって、アプリケーションのベースラインを更新し、サポート対象の新しいランタイムを採用できるようになりました。この変更と同時に、Windows 7のサポートは非推奨となりました。

強制的なパッチ適用。時には、私たちが提供するライブラリや依存しているシステムに脆弱性が発見されることがあります。こうなると、対応はもはや任意ではなく、タイムラインも自分たちの都合では決められません。私たちにコントロールできるのは、そうした事態への備えです。すなわち、新たな問題を生むことなく迅速に対応できるだけのテスト体制、リリースプロセス、段階的なロールアウトです。

理由もタイムラインもそれぞれ異なりますが、いずれも同じように慎重なアプローチが求められます。

.NET移行:なぜ実施したのか 

.NET 10への移行により、MalwarebytesはWindows向けに、より安全でサポートされた、より高性能な基盤を手に入れました。その効果は複合的に積み重なっています。

セキュリティ。最新のランタイムは、より安全なデフォルト設定、より強固な暗号化、メモリや相互運用性に関するバグへの緩和策など、Microsoftが継続的に行っているセキュリティ対策の恩恵を受けられます。Microsoftが積極的にサポートしているランタイムを使い続けることで、脆弱性が発見された際にも修正を継続的に適用できます。 

サポートされた基盤。華やかな理由ではないかもしれませんが、.NET 10を採用することで、私たちは新しいバージョンのWindowsとの親和性が高く、サポートされ、活発に開発が続けられているプラットフォームの上に立ち続けることができます。これにより、将来の修正や機能、改善を、一過性のプロジェクトとしてではなく、日常的な作業として取り込みやすくなります。

診断とオブザーバビリティ。最新の.NETは、トレース、メトリクス、クラッシュ診断の組み込み機能が強化されています。セキュリティ製品において、コードが実際の現場でどう振る舞っているかを把握することは重要です。診断機能の向上は、信頼性に関わる問題の特定と解決に役立ちます。 

パフォーマンスとメモリ効率。近年の.NETのリリースでは、JITコンパイラ、ガベージコレクタ、コアライブラリが改善されています。私たちのプロセスはバックグラウンドで一日中稼働し続けているため、その実行効率とメモリ管理のあり方は重要です。こうした機能強化によって効率を高める余地が広がりますが、その効果はコンポーネントごとに異なります。

.NET移行:どのように実施したか  

指針はシンプルです。「根拠が許す以上のスピードでは決して前に進まない」という原則です。 

まず、作業を専用ブランチに切り出すところから始めました。プラットフォームの対象を再設定し、マネージド依存関係をすべて更新することで、新しいランタイムとコードベースの間で、どのコンポーネントを出荷すべきかについて完全な合意が取れるようにしました。

この作業を通じて、アップグレードに伴う分かりにくい影響の一部が早い段階で明らかになりました。名前が変更されたり、ランタイムに統合されたりしたライブラリ、もはや不要になったファイル、そして代わりに新たに出荷する必要が生じたファイルなどです。

Image

デプロイは見落とされがちですが、失敗すれば高くつく作業です。ランタイム移行が関わるのは、実行されるコードだけではありません。顧客のディスクに実際に配置されるファイルそのものにも関わってきます。

私たちのインストーラーと更新サービスは、新しいランタイムのファイル構成を理解する必要がありました。ランタイムが今では提供するようになった依存関係を削除し、名前が変更されたファイルの出荷を停止し、新規インストールと既存環境へのアップデートの両方で、その置き換えを問題なく配布する必要がありました。 

デプロイを正しく行えるかどうかが、ユーザーが全く気づかないアップグレードになるか、サポート対応の問題を引き起こすアップグレードになるかの分かれ目になります。

ビルドが正しく動作するようになった後は、検証作業に重点が移りました。

  • サービス、インストール、アップデートの各経路にわたる広範な自動テスト。
  • 実際の運用環境の構成や、以前のインストール環境を対象とした互換性検証。
  • 起動時間、メモリ使用量、スキャン挙動における性能劣化を検出するためのベンチマーク測定。
  • カナリアリリースおよび段階的な展開。小規模な集団から始め、結果が安全であることを示した場合にのみ範囲を拡大しました。
  • 実運用環境における継続的なモニタリングと自動的な回帰検出。
  • プラットフォーム、QA、インストール/アップデート、リリースエンジニアリングの各部門を横断した連携作業。
Image

「私たちは、根拠が許す以上のスピードでは決して前に進みませんでした。すべてのゲートは、それぞれ独立して緑になる必要があったのです」 

.NET移行:トレードオフ  

今回の移行は、決して代償なしに実現できたものではなく、それぞれの選択には意図的なトレードオフが伴いました。

ブランチにおけるトレードオフは「乖離」でした。移行作業をメインのコードベースから切り離すことで本体は保護されましたが、そのブランチが存在し続ける期間が長くなるほど、活発に開発が進む本体との差異が広がっていくリスクがありました。私たちはこのリスクを、最後に一度だけ大きくリスクの高いマージを行うのではなく、頻繁な統合を重ねることで管理しました。 

ロールアウトにおけるトレードオフは「速度」でした。段階的な展開は、一斉配信のリリースに比べて、顧客がアップデートを受け取るタイミングが遅くなることも意味していました。私たちはこのトレードオフを受け入れました。小規模な集団から得られる根拠があれば、はるかに多くのエンドポイントにアップデートが行き渡る前に問題を発見できる機会が生まれるからです。

AOTにおけるトレードオフは「柔軟性」でした。事前コンパイル(AOT)は起動時のパフォーマンスを向上させる一方で、動的な挙動を制約する可能性もあります。私たちはこれをすべてのコンポーネントに一律で適用するのではなく、コンポーネントごとに選択的に採用しました。

.NET 10移行が顧客にもたらす意味

基盤に関する作業の最良の成果は、顧客がそれを意識することなく恩恵を受けられることです。

  • 完全にサポートされ、積極的に保守されているランタイム上での信頼性の向上。
  • プラットフォームの継続的なセキュリティ改善の恩恵を受けられる、より安全な基盤。
  • 新しい.NET機能や修正へのアクセス。
  • 新しいバージョンのWindowsへのより優れた対応。
  • 最新の.NETツールにより、新しい防御機能をより迅速に開発・提供できるようになること。

胸に刻んでおくべき教訓  

ランタイムであれ、ベースラインであれ、セキュリティパッチであれ、こうしたアップデートの一つひとつが、私たちチームの信念をより強固なものにしてくれます。 

プラットフォームのアップグレードは、その上に構築されるあらゆるものへの戦略的投資です。また、近代化は継続的に行うことで最も効果を発揮します。プラットフォームが取り残される期間が長くなればなるほど、最終的なアップグレードはより困難なものになり得るからです。

これほど広範囲に及ぶ変更においては、自動化が特に重要になります。同じくらい重要なのが、何年も前に下された地味で目立たない決定の数々です。例えば、コンポーネント間の境界を明確に保つことや、何を出荷しているのかを正確に把握しているビルドプロセスを持つことなどです。

こうした基盤があってこそ、より大きな変更が可能になるのです。 

「技術的負債は金融的負債と同じように複利で膨らんでいく。最も安く済むアップグレードとは、決して先送りしなかったアップグレードのことだ」  

今後に向けて  

アップグレードにゴールはありません。それぞれが、より長いパターンの中の一歩に過ぎないのです。プラットフォームが取り残されることのないよう、意図的な小さなステップを重ねながら、継続的に近代化を進めていく。ベースラインは今後も再び移り変わっていきますし、脆弱性は前触れなく降りかかってきます。そのたびに私たちは、同じ規律をもって臨みます。同じテスト、同じ段階的なロールアウト、そして前進する前に同じだけの根拠を求める姿勢です。

その規律こそが、あらゆるマシン上で毎日何の疑いもなく信頼して動かせる製品を、実際に支えているものなのです。 

.NET 10上で動作するMalwarebytes for Windowsは、バージョン5.6.0でリリースされました。これは、製品を支えるプラットフォームへの投資を続け、その上にある防御機能を進化させ続けるという、私たちの長年にわたる取り組みの中の最新の一歩です。


Image

「地球上で最高峰のサイバーセキュリティスイートの一つ」 

CNETによる評価です。 レビューを読む


翻訳元: https://www.malwarebytes.com/blog/inside-malwarebytes/2026/09/the-hidden-work-of-modernizing-malwarebytes

本記事は malwarebytes.com の記事を翻訳・要約したものです。