検索
ニュース

Microsoft、オープンソースプロジェクト「ebpf-for-windows」を発表アプリのコードをカーネル内で安全に実行できる

Microsoftは、「eBPF」を「Windows 10」と「Windows Server 2016」以降で動作させるためのオープンソースプロジェクト「ebpf-for-windows」を発表した。アプリケーションプログラムのコードをカーネル内で安全に実行できる。

Share
Tweet
LINE
Hatena

 Microsoftは2021年5月10日(米国時間)、「eBPF」(extended Berkeley Packet Filter)を「Windows 10」と「Windows Server 2016」以降で動作させるためのオープンソースプロジェクト「ebpf-for-windows」を発表した。

 eBPFはアプリケーションプログラムのコードをカーネル内で安全に実行するための仕組みで、カーネルを拡張するための手間や時間を軽減する。これまでは主にLinuxで活用されてきた。

 例えばDoS(サービス妨害)攻撃からの保護機能を追加したり、オブザーバビリティを実現したりする。

 ebpf-for-windowsプロジェクトは、Linuxエコシステムで使われてきたeBPFのツールチェーンとAPIを、開発者がWindowsで利用できるようにすることを目指している。

 既存のオープンソースeBPFプロジェクトをサブモジュールとしてWindows上で実行するために、これらとWindowsの間にレイヤー(Windows固有のホスティング環境)を追加する。

 ebpf-for-windowsプロジェクトはまだ、開発の比較的初期の段階にあるが、GitHubリポジトリからコードを取得し、ビルドして機能を試すことが可能だ。完成前の段階でプロジェクトを発表した理由について、Microsoftは「eBPFをWindowsや他の環境で効果的に機能させるために、強力なeBPFコミュニティーと共同で取り組みを進めるため」と説明している。

どのようなアーキテクチャなのか

 次の図は、ebpf-for-windowsプロジェクトのアーキテクチャと関連コンポーネントを示している。


ebpf-for-windowsプロジェクトのアーキテクチャと関連コンポーネント 手が加わっていないWindowsコンポーネント(紫色)とebpf-for-windowsプロジェクトのコード(薄緑色)、その他のオープンソースのコード(緑色)が描かれている。図の上半分はユーザーモードで、下半分はカーネルモードで動作する(出典:Microsoft

 図の左上にあるように、既存のeBPFツールチェーン(「clang」など)を使って、さまざまな言語で作成されたソースコードからeBPFバイトコードを生成できる。このバイトコードを任意のアプリケーションや、Windowsコマンドラインツール「netsh」で使用できる。いずれも、「Libbpf API」をエクスポーズする共有ライブラリを使用するが、これはまだ開発途上だ。

 このライブラリはeBPFバイトコードを、ユーザーモードの保護プロセスでホストされる静的検証ツール「PREVAIL」(図の右上に描かれている)に送信する。PREVAILは信頼できる鍵で署名されたユーザーモードデーモンをカーネルコンポーネントが信頼できるようにするWindowsのセキュリティ環境の一つだ。

 検証ツールの全ての安全チェックを通過した後、バイトコードは2つの経路のいずれかで実行される。第一はWindowsカーネルモードの実行コンテキストで動作する「uBPF」インタープリタ(図中央左)に読み込まれる経路、第二はuBPF JITコンパイラ(図右上)でコンパイルされ、ネイティブコードがカーネルモードの実行コンテキストに読み込まれる経路だ。

 カーネルモードの実行コンテキストにインストールされたeBPFプログラムは、さまざまなフックに接続してイベントを処理したり、eBPFシム(shim)でエクスポーズされるさまざまなヘルパーAPIを呼び出したりする。

 eBPFシムは、パブリックなWindowsカーネルAPIを内部的にラップしているため、既存バージョンのWindowsでeBPFを利用できる。現在、2つのフック(XDPとソケットバインド)が追加されている。これらはネットワーク固有のフックだ。Microsoftによれば今後、多様なフックやヘルパーが追加されるという。

eBPFのフォークなのか

 Microsoftによれば、ebpf-for-windowsプロジェクトはeBPFのフォークではない。今回のプロジェクトは、「IOVisor uBPF」プロジェクトやPREVAILなどの既存のオープンソースプロジェクトを活用し、Windows固有のホスティング環境を追加することで、Windows上でeBPFのコードを動かすことが目的だ。

 Linux用に書かれたeBPFプログラムとのアプリケーション互換性については、次のように説明している。

 「今回のプロジェクトは、OSのエコシステム全体に適用される共通のフックやヘルパーを使用するコードのソースコード互換性を提供することが目的だ」(Microsoft)

 Linuxは多くのフックやヘルパーを提供しているが、その中には他のプラットフォームでは適用できないようなLinux特有のもの(例えば、Linux内部のデータ構造体を使用する)もある。それ以外のフックやヘルパーは一般に適用可能であり、eBPFプログラムではそれらをサポートすることを意図しているという。

 同様に、ebpf-for-windowsプロジェクトでは、eBPFプログラムとやりとりするアプリケーションのソースコード互換性を確保するために、LibbpfのAPIを公開している。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る