Microsoftは、eBPFをWindows 10およびWindowsServer2016以降に導入することに取り組んでいることを発表した。サービス拒否攻撃からの防御や可観測性などのユースケースをサポートするためである。
ebpf-for-windowsプロジェクトは、開発者が既存のバージョンのWindows上で使い慣れたeBPFツールチェーンとアプリケーションプログラミングインターフェイス(API)を使用できるようにすることを目的としています。このプロジェクトは、他のプロジェクトをベースとして構築されています。いくつかの既存のeBPFオープンソースプロジェクトを取り上げており、それらをWindows上で実行するための「接着剤」として機能します。
eBPFは、ネットワーキング、セキュリティ、アプリケーションのプロファイリング/トレース、パフォーマンスのトラブルシューティングをサポートすることを目的としたツールのコレクションである。eBPFは、カーネルの再構築やカーネルモジュールのロードを必要としない方法で、Linuxカーネル上にこのような種類のソリューションを簡単に実装できるようにするために生まれた。これを可能にするeBPFの鍵は、特別なサンドボックス環境を使って静的に検証されたバイトコードを実行することである。
Microsoftによると、Linux上でのeBPFの利点が示されることで、他のオペレーティングシステムでもeBPFを使用したり、カーネルを超えてユーザースペースサービスやデーモンに使用を広げることに関心が高まっている。
eBPFのプログラムは、さまざまなソース言語で記述されており、eBPFバイトコードにコンパイルされている。Windowsでは、eBPFバイトコードはLibbpf APIsを実装するライブラリを使って使用できる。このライブラリは、netsh
コマンドラインツールにも統合されている。
最初のステップとして、ライブラリは生成されたバイトコードの正しさを検証しようとする。
バイトコードがすべてのベリファイアの安全性チェックに合格した場合、バイトコードはWindowsカーネルモード実行コンテキストで実行されているuBPFインタープリターにロードするか、あるいは、uBPFジャストインタイム(JIT)コンパイラーによってコンパイルしてネイティブコードをカーネルモード実行コンテキストにロードすることができます。
eBPFプログラムは、カーネルまたはアプリケーションが特定のフックを通過したときに実行される。これには、システムコール、関数の開始/終了、カーネルトレースポイント、ネットワークイベントなどが含まれる。eBPFプログラムは、カーネルのバージョンに厳密に依存するため、カーネル内では呼び出すことができない。代わりに、いわゆるヘルパー関数を使用する。このヘルパー関数は、特定のカーネル機能へのアクセスを提供する関数の集合である。
Microsoftの見解では、LinuxとWindowsで同じフックとヘルパー関数を使用するeBPFプログラムのソースコードの互換性を確保できるはずである。もちろん、多くのフックとヘルパー関数はLinuxに厳格に関連しているため、Windowsには適用できない。
ePBF for Windowsはまだ開発の初期段階にあり、現時点では、eXpressデータパス(XDP)用とソケットバインディング用に2つのフックしか使用できない。Microsoftは、今後フックとヘルパー関数をさらに作成することを計画しており、eBPFコミュニティの貢献を求めている。