Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
eBPF
Search
Satoru Takeuchi
PRO
December 08, 2025
Technology
180
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
eBPF
以下動画のスライドです。
https://youtu.be/XdZEmdphJG4
Satoru Takeuchi
PRO
December 08, 2025
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
119-多機能ファイルシステムBtrfs_のコピー.pdf
sat
PRO
1
70
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
95
あなたの知らないバージョン命名規則
sat
PRO
3
900
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
64
Machine Check Exception
sat
PRO
2
66
バイナリダンプの模様を読む
sat
PRO
0
89
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
89
114-ファイルのshallow_copy.pdf
sat
PRO
2
58
113-Btrfsのスナップショット.pdf
sat
PRO
0
40
Other Decks in Technology
See All in Technology
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
130
Goodbye ShellScript, Hello File-based App
shunsock
0
390
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
32
28k
リアーキテクチャ後の障害ゼロを目指したShadow Testingの取り組み
nihonbuson
PRO
1
160
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
0
250
Claude Code本って、 読む必要あるの?
oikon48
2
490
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
210
俺の仕事は AIに奪われないし、たぶんその BIも要らない
hikaruri
0
520
CLIライブラリ開発を支える技術
htnabe
0
140
人間はどの意思決定を手放せるのか
kawasima
15
7.5k
Genieを崇めよ
kameitomohiro
0
170
Featured
See All Featured
Ruling the World: When Life Gets Gamed
codingconduct
0
340
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
610
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
320
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Chasing Engaging Ingredients in Design
codingconduct
0
320
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
460
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
810
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Transcript
eBPF Dec. 8th, 2025 Satoru Takeuchi X: satoru_takeuchi
eBPF • Linuxカーネルの機能 • カーネル本体に手を入れず、カーネル空間で安全にプログラムを動かせる • うまくプログラムを書けば… ◦ ビルド済みバイナリを複数カーネルバージョンで動かせる ◦
同、別アーキテクチャの CPUで動かせる • 適用範囲: ◦ トレース(例: bpftrace) ◦ パケット処理(例: Cilium) ◦ 不正動作検出&禁止(例: Falco)
プログラムをカーネルにロードするまでの流れ ソースコード (eBPF C, Rust) eBPF bytecode (アーキテクチャ 非依存) eBPFサブシステム
clang + LLVM BPF backend 変換 eBPFのツール、ライブラリ (libbpf, cilium agent) bpf() syscall呼び出しによりロード verifier(後述) eBPF bytecode 安全性チェック ユーザ空間 カーネル空間
ロード後に実行する流れ eBPFサブシステム eBPF bytecode 何らかのイベント発生 ! カーネル 様々なサブシステム (1) 検出
(2) イベントに対応した ebpfプログラム呼び出し eBPF VM (3) 実行 (JITコンパイル有り)
イベントの例 • システムコール呼び出し、復帰時 • 特定のコード実行時(関数呼び出し時、特定の命令実行時、復帰時など) ◦ カーネルのコードだけでなくプロセスのコードの実行にも使える • パケット送受信時 •
ファイルシステムI/O時 • タイマー起動時
eBPFプログラムの例
実験環境 • CPU architecture: x86_64 • OS: Ubuntu 24.04.3 •
kernel: 6.8.0-88-generic
プログラム実行時にメッセージを表示 #include <linux/bpf.h> #include <bpf/bpf_helpers.h> char LICENSE[] SEC("license") = "GPL";
struct sys_enter_execve_args { unsigned long long unused; long syscall_nr; const char *filename; const char *const *argv; const char *const *envp; }; SEC("tracepoint/syscalls/sys_enter_execve") int trace_exec(struct sys_enter_execve_args *ctx) { bpf_printk("execve is called: %s\n", ctx->filename); return 0; }
実行すると… $ clang -O2 -g -target bpf \ -I/usr/include \
-I/usr/include/x86_64-linux-gnu \ -c test.c -o test.o $ sudo bpftool prog load test.o /sys/fs/bpf/waruibpf autoattach $ sudo cat /sys/kernel/debug/tracing/trace_pipe
execve()が呼び出されるたびにログが出る $ clang -O2 -g -target bpf \ -I/usr/include \
-I/usr/include/x86_64-linux-gnu \ -c test.c -o test.o $ sudo bpftool prog load test.o /sys/fs/bpf/waruibpf autoattach $ sudo cat /sys/kernel/debug/tracing/trace_pipe … (kubelet)-2944 [000] ...21 773.184329: bpf_trace_printk: execve is called: /usr/bin/kubelet ...
ethernetフレーム受信時にL3のプロトコルを表示 #include "vmlinux.h" #include <bpf/bpf_helpers.h> #include <bpf/bpf_endian.h> char LICENSE[] SEC("license")
= "GPL"; SEC("xdp") int xdp_print_eth_proto(struct xdp_md *ctx) { void *data = (void *)(long)ctx->data; void *data_end = (void *)(long)ctx->data_end; if (data + sizeof(struct ethhdr) > data_end) return XDP_PASS; struct ethhdr *eth = data; __u16 proto = bpf_ntohs(eth->h_proto); bpf_printk("XDP eth proto = 0x%x\n", proto); return XDP_PASS; }
eth0にアタッチすると… … $ sudo ip link set dev eth0 xdp
obj test.o sec xdp $ sudo cat /sys/kernel/debug/tracing/trace_pipe
protocolが表示された… … $ sudo ip link set dev eth0 xdp
obj test.o sec xdp $ sudo cat /sys/kernel/debug/tracing/trace_pipe … <idle>-0 [002] ..s2. 1667.143565: bpf_trace_printk: XDP eth proto = 0x800 <idle>-0 [000] ..s2. 1667.159162: bpf_trace_printk: XDP eth proto = 0x800 <idle>-0 [002] ..s2. 1667.160285: bpf_trace_printk: XDP eth proto = 0x800 ... 0x800はIPv4
eBPFの安全装置
安全装置1: カーネル内のsandbox上での実行 BPF map 別のeBPFプログラム BPF map BPF map eBPFプログラム
カーネル本体 eBPFヘルパー関数 読み書き 読み書き 発生したイベントのコ ンテキスト 呼び出し 読み書き(ほぼROM) データ、コード アクセス不可 アクセス
安全装置2: verifier • eBPFバイトコードをカーネルにインストールする前に動作 • バイトコードを静的解析 • 危険と判断したプログラムのインストールを失敗させる ◦ 不正なデータにアクセスする可能性がある
◦ read only領域にwriteする ◦ コードが長すぎる
verifierによりロードが失敗する例
実行するコードが長いとき #include <linux/bpf.h> #include <bpf/bpf_helpers.h> … SEC("tracepoint/syscalls/sys_enter_execve") int trace_exec(struct sys_enter_execve_args
*ctx) { volatile int dummy = 0; for (int i = 0; i < 1000000; i++) dummy++; bpf_printk("execve: %d\n", dummy); return 0; }
実行すると… … $ sudo bpftool prog load test.o /sys/fs/bpf/waruibpf autoattach
検証失敗! … $ sudo bpftool prog load test.o /sys/fs/bpf/waruibpf autoattach
… 6: (61) r3 = *(u32 *)(r10 -4) ; R3_w=scalar(smin=0,smax=umax=0xffffffff,var_off=(0x0; 0xffffffff)) R10=fp0 fp-8=mmmm???? ; for (int i = 0; i < 1000000; i++) 7: (07) r1 += -1 ; R1_w=0xd9039 8: (bf) r2 = r1 ; R1_w=0xd9039 R2_w=0xd9039 9: (67) r2 <<= 32 BPF program is too large. Processed 1000001 insn processed 1000001 insns (limit 1000000) max_states_per_insn 4 total_states 11112 peak_states 11112 mark_read 1 -- END PROG LOAD LOG -- libbpf: prog 'trace_exec': failed to load: -E2BIG libbpf: failed to load object 'test.o' Error: failed to load object file make: *** [Makefile:10: run] Error 255 … 1つのeBPFプログラムは 100万命令を超えてはならない
ethernetフレームだけ受信するだろ?とチェックを外すと #include "vmlinux.h" #include <bpf/bpf_helpers.h> #include <bpf/bpf_endian.h> char LICENSE[] SEC("license")
= "GPL"; SEC("xdp") int xdp_print_eth_proto(struct xdp_md *ctx) { void *data = (void *)(long)ctx->data; void *data_end = (void *)(long)ctx->data_end; //if (data + sizeof(struct ethhdr) > data_end) // return XDP_PASS; struct ethhdr *eth = data; __u16 proto = bpf_ntohs(eth->h_proto); bpf_printk("XDP eth proto = 0x%x\n", proto); return XDP_PASS; }
実行すると… … $ sudo ip link set dev eth0 xdp
obj test.o sec xdp
検証失敗! … $ sudo ip link set dev eth0 xdp
obj test.o sec xdp libbpf: prog 'xdp_print_eth_proto': BPF program load failed: Permission denied libbpf: prog 'xdp_print_eth_proto': -- BEGIN PROG LOAD LOG -- 0: R1=ctx() R10=fp0 ; void *data = (void *)(long)ctx->data; 0: (61) r1 = *(u32 *)(r1 +0) ; R1_w=pkt(r=0) ; __u16 proto = bpf_ntohs(eth->h_proto); 1: (69) r3 = *(u16 *)(r1 +12) invalid access to packet, off=12 size=2, R1(id=0,off=12,r=0) R1 offset is outside of the packet processed 2 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 -- END PROG LOAD LOG -- libbpf: prog 'xdp_print_eth_proto': failed to load: -13 libbpf: failed to load object 'test.o' … パケットの長さが14バイト(イーサネット ヘッダのプロトコルを示すフィールドの末 尾)より短い可能性がある
まとめ • いいところ ◦ カーネル空間で安全にプログラムを実行できる ▪ バグってしまっているプログラム、悪意を持ったプログラムは verifierがロードさせない ◦ JITコンパイラのおかげでネイティブコードを実行できる
• 不便なところ ◦ verifierを通す儀式がちょっと面倒 ▪ veristatやChatGPTを使えば、ある程度楽ができる • 参考 ◦ eBPF公式サイト ▪ https://ebpf.io/ ◦ 入門eBPF ▪ https://www.oreilly.co.jp/books/9784814400560/ ◦ 詳解システムパフォーマンス ▪ https://www.oreilly.co.jp/books/9784814400072/