Microsoft、オープンソースプロジェクト「ebpf-for-windows」を発表:アプリのコードをカーネル内で安全に実行できる
Microsoftは、「eBPF」を「Windows 10」と「Windows Server 2016」以降で動作させるためのオープンソースプロジェクト「ebpf-for-windows」を発表した。アプリケーションプログラムのコードをカーネル内で安全に実行できる。
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.
関連記事
- パケットフィルターでトレーシング? Linuxで活用が進む「Berkeley Packet Filter(BPF)」とは何か
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。初回は、BPFの歴史や概要について。 - BPFのアーキテクチャ、命令セット、cBPFとeBPFの違い
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。今回は、Linuxで用いられるBPFのアーキテクチャなどを説明する。 - 単なるデバッグ情報だけではない「BPF Type Format」(BTF)の使い道
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。今回は、最近のBPFの発展に欠かすことのできない重要機能「BPF Type Format(BTF)」について。