パケットフィルターでトレーシング? Linuxで活用が進む「Berkeley Packet Filter(BPF)」とは何か:Berkeley Packet Filter(BPF)入門(1)(3/3 ページ)
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。初回は、BPFの歴史や概要について。
BPFの安全性
LinuxはBPFプログラムをカーネル内で安全に実行するため、下記を行っています(一部の機能はオプションです)。
- 検証器による静的なBPFプログラムの検証
- BPFプログラム領域をread onlyなメモリ領域に配置(アーキテクチャが対応している場合)
- JITにおけるConstant Blinding(ROP攻撃対策)
- JITを常に有効化し、BPFインタープリタを除去する(Spectre Variant 2対策)
また、「/proc/sys/kernel/unprivileged_bpf_disabled」を1にすると、「CAP_SYS_ADMIN」を持っていないユーザー(基本的にルートユーザー以外)はBPFシステムコールが利用できなくなります。
2018年の年頭に公表されたSpectre variant 1およびvariant 2における、GoogleのProject ZeroのPoC(概念実証)でeBPFが利用されていたことを記憶されている人も多いかと思います。
このことについて少し補足しておくと、PoCでは攻撃が成功しやすいように一部修正したカーネルを利用していました。また、Spectre対策用のパッチはすでに追加されています。そのため現在のカーネルで攻撃を実施することは非常に困難であると思います。
BPFがカーネルで広く用いられるにつれ、セキュリティに対する意識も一層高まっています。現在、BPF関連のテストコードは約3万行あります。
ただし、BPFが安全性を最優先に考慮しているといっても、100%バグがないとは言い切れません。一般論として、セキュリティ情報に気を配り、もしセキュリティに関するパッチがあれば迅速にアップデートすることが重要になります。
BPFの情報源
最後に、BPFの情報源をまとめます。
下記はBPFに関する公式のドキュメントです。
- BPF Documentation
BPF全般に関するLinuxのドキュメント - Linux Socket Filtering aka Berkeley Packet Filter (BPF)
主にBPFのフィルタリング機能に関するLinuxのドキュメント。BPFの命令セットに関する記載もここにある
また、下記も参考になります。
- BPF Features by Linux Kernel Version
BPFの機能とカーネルバージョンの対応表 - BPF and XDP Reference Guide
ネットワーク関連を中心BPFに関して技術的に詳しく書いてある(おすすめ) - iovisor/bpf-docs
BPFに関するドキュメント集 - Dive into BPF: a list of reading material
BPFに関する包括的なリンク集。初投稿日は2016年9月だが、それ以降断続的にアップデートされている - BPF, Linux kernel code execution engine
ブログでBPFの主要開発者がBPF内部構造について記述している
下記は、BPFに関連する主要なソースです。
- kernel/bpf
BPFコア部分 - net/core/filter.c
cBPFコア部分 - tools/bpf
cBPFインタープリタ、jitコンパイラ - tools/bpf/bpftool
eBPFのデバッグツール - tools/lib/bpf
eBPFローダー - tools/testing/selftests/bpf
BPF関連のテストコード - samples/bpf
BPF関連のサンプルコード
BPFの開発は歴史的経緯より、基本的にLinuxのnet-nextブランチで進められてきました。現在は主にbpf-nextブランチで進められています。bpf-nextブランチの内容がnet-nextにマージされ、最終的にカーネル本体へとマージされています。
開発に関する詳細はLinuxのドキュメントを参照してください。
次回は、BPFのアーキテクチャについて、
次回は、BPFの基礎として、Linuxで用いられるBPFのアーキテクチャについて説明します。
筆者紹介
味曽野 雅史(みその まさのり)
東京大学 大学院 情報理工学系研究科 博士課程
オペレーティングシステムや仮想化技術の研究に従事。
- メール:misono(at)os.ecc.u-tokyo.ac.jp
- ブログ:http://mmi.hatenablog.com/
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 2018年上半期に話題になったSpectreとその変異、Linuxカーネルでの対応まとめ
連載「OSS脆弱性ウォッチ」では、さまざまなオープンソースソフトウェアの脆弱性に関する情報を取り上げ、解説していく。2018年の上半期は、「Meltdown」「Spectre」とその変異(Variant)の脆弱性に悩まされた。今回はいつもとは異なり、上半期のまとめも兼ねて、Meltdown/Spectreの各変異をバージョンを追いかけながら整理する。 - 2017年版Linuxカーネル開発レポート公開――支援している企業トップ10とは?
The Linux Foundationは2017年版Linuxカーネル開発レポートを公開した。Linuxカーネル4.8から4.13までの開発に焦点を当て、カーネル開発に携わった開発者や変更数などについて言及した。 - Linuxカーネルのソースコードを読んで、システムコールを探る
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。前回まで、printf()内の中身をさまざまな方法で探り、write()やint $0x80の呼び出しまでたどり着いた。今回は、さらにその先にあるLinuxカーネル側のシステムコールを見ていく。