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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
78
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
110
あなたの知らないバージョン命名規則
sat
PRO
3
920
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
73
Machine Check Exception
sat
PRO
2
70
バイナリダンプの模様を読む
sat
PRO
0
110
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
110
114-ファイルのshallow_copy.pdf
sat
PRO
2
62
113-Btrfsのスナップショット.pdf
sat
PRO
0
46
Other Decks in Technology
See All in Technology
メルペイ 会計システム概要と歴史
mewuto
1
220
その Valkey 使いこなしていますか?
onk
PRO
4
720
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
130
FactoryBotアンチパターン / factory_bot anti-patterns
toshimaru
0
160
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
110
分析AIエージェントを育てる、動く環境を育てる
codatum
1
1k
AI時代のPRレビューにどう向き合うか?
kairim0
1
220
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
0
130
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
730
Loop Engineering, beyond prompt, context, and harness engineering
glaforge
0
110
大型犬好きによるPugの紹介
yamanoku
1
150
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
180
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Automating Front-end Workflow
addyosmani
1369
210k
30 Presentation Tips
portentint
PRO
1
430
The browser strikes back
jonoalderson
0
1.8k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Ruling the World: When Life Gets Gamed
codingconduct
0
400
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
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/