Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
eBPFを使った動的解析手法
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Arata
September 23, 2025
790
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
eBPFを使った動的解析手法
Arata
September 23, 2025
More Decks by Arata
See All by Arata
デコンパイラ研究調査
arata_nvm
1
9
コンパイラ基盤を支える言語たち
arata_nvm
1
67
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
22
5分でわかるPage-Fault Weird Machine
arata_nvm
2
320
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
21
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
140
カーネルハック実験の振り返り
arata_nvm
1
59
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
54
コードエディターのシンタックスハイライトの話
arata_nvm
0
240
Featured
See All Featured
Technical Leadership for Architectural Decision Making
baasie
3
420
Practical Orchestrator
shlominoach
191
11k
How to Ace a Technical Interview
jacobian
281
24k
Marketing to machines
jonoalderson
1
5.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Leo the Paperboy
mayatellez
7
1.8k
Transcript
eBPFを使った動的解析手法 2025/09/23 魔女のお茶会 #8(2025 夏) @Arata
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 導入: rev問題における動的解析 • 動的解析: バイナリを実際に動かして解析する手法
• 問題によって異なるアプローチが求められる ◦ 例: gdb, strace, バイナリパッチ, VM改変 など • 様々な動的解析の手法を知り、使い分けることが重要 → 本発表ではeBPFを使った動的解析手法について紹介 2
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 1. eBPFの概要 2. eBPFを使った動的解析の実例 3.
eBPFを使った動的解析を防ぐには 話すこと 3
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 1. eBPFの概要 2. eBPFを使った動的解析の実例 3.
eBPFを使った動的解析を防ぐには 話すこと 4
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • ユーザーコードをLinuxカーネル内で安全に実行する機能 • ネットワーク・システム動作などをトレースできる eBPFとは
5 https://ebpf.io/ja/what-is-ebpf/
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 用意された「フックポイント」通過時にコードを実行できる フックポイントの例: • syscalls ◦
システムコール • kprobe / kretprobe ◦ カーネル空間のコード • uprobe / uretprobe ◦ ユーザー空間のコード ◦ 今回特に重要 eBPFがトレースできるもの 6 https://github.com/bpftrace/bpftrace
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata Delve: https://github.com/go-delve/delve • Golang向けデバッガー •
関数呼び出し時の引数と戻り値をトレースする機能で試験的にeBPF を利用 • ptraceと比較して高速な点がeBPF利用の主な動機 ◦ ptrace: ブレーク毎にユーザー空間にスイッチする ◦ eBPF: カーネル空間でブレークを処理、一定単位でデータを取得 デバッガーにおけるeBPFの利用 #1 7 https://developers.redhat.com/articles/2023/02/13/how-debugging-go-programs-delve-and-ebpf-faster
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eDBG: https://github.com/ShinoLeah/eDBG • Android向けデバッガー •
ptraceを使わずeBPFでデバッガーのコア機能を実装 • 本来eBPFはトレース対象のプログラムを停止しない ◦ トレース対象のプログラムにSIGSTOP/SIGCONTを送信 ◦ これによってインタラクティブな操作を実現 • anti-debugの回避がeBPF利用の主な動機 デバッガーにおけるeBPFの利用 #2 8
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata ptraceと比較してeBPFには以下の長所がある: • オーバーヘッドが小さい • トレースしていることを検知されにくい
→ 実際CTFではどの程度有用か? ここまでのまとめ 9
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 1. eBPFの概要 2. eBPFを使った動的解析の実例 3.
eBPFを使った動的解析を防ぐには 話すこと 10
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 注意: 以下の問題のネタバレを含みます • gomen (SatokiCTF
2024) • AVX-512 (IERAE CTF 2025) 実例 11
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 問題概要 • よくあるcrackme問題 • 実行するとフラグの入力を求め、正しいか判定する
実例 #1: gomen (SatokiCTF 2024) 12 https://tan.hatenadiary.jp/entry/2024/08/28/021429#Rev-easy-gomen-2-teams-solves-200-points
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 問題の特徴 • C++例外を用いて難読化されている • 文字列定数が暗号化されている
• デバッガーを検知すると無限ループで停止する 実例 #1: gomen (SatokiCTF 2024) 13
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata デバッガーの検知方法 • /proc/self/statusのTracerPidを監視する ◦ TracerPidはptraceでアタッチしているプロセスのPID
◦ TracerPid = 0: プロセスはアタッチされていない ◦ TracerPid ≠ 0: プロセスはアタッチされている • gdb, strace, ltrace等でアタッチすると検知されてしまう 実例 #1: gomen (SatokiCTF 2024) 14
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 方針 • 天啓: 復号した正解フラグを引数にstrlen,memcpy関数が呼ばれる •
ltraceで関数呼び出しをトレースしたいが、今回は難しい • eBPFでltraceっぽいことをしてみる 実例 #1: gomen (SatokiCTF 2024) 15
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPFを用いた解法 • bpftraceを使用 ◦ DSLを用いてeBPFによるトレースを行えるツール
• libcの関数が呼ばれたら、その第一引数を表示したい • DSLでの記法 ◦ libcの関数が呼ばれたら: uprobe:libc:* ◦ その第一引数を表示する: print(str(arg0)) • 実行するとフラグが得られた 実例 #1: gomen (SatokiCTF 2024) 16
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 問題概要 • よくあるcrackme問題 • 実行するとフラグの入力を求め、正しいか判定する
• 0 solves 実例 #2: AVX-512 (IERAE CTF 2025) 17 https://gmo-cybersecurity.com/blog/ierae-ctf-2025-writeup-reversing/
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 問題の特徴 • 命令の実行フローを動的制御して難読化 ◦ EFLAGSのTrap
flagを立てて、1命令実行毎にSIGTRAPを送信 ◦ シグナルハンドラでRIPを操作して実行フローを動的制御 ◦ 様々な命令が乱雑に置かれていて、それらを適切な順番でピック して実行していくイメージ • フラグの判定ロジックがAVX-512を使用 実例 #2: AVX-512 (IERAE CTF 2025) 18
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 難読化手法とGDBの相性の悪さ • 実行された命令をGDBでトレースしたい • しかしGDBは以下の機能のためにSIGTRAPを使う
◦ ブレークポイント ◦ ステップ実行 • 1命令実行毎にSIGTRAPが送信されるプログラムでは GDBがまともに使えない 実例 #2: AVX-512 (IERAE CTF 2025) 19
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 公式Writeupの方針 • 実行フローの制御ロジックを静的解析 • 実行される命令をシミュレートして難読化解除
シミュレート実装における様々な落とし穴 • syscall命令でのTrap flagのクリア • sub命令によるループ • add命令による条件分岐 実例 #2: AVX-512 (IERAE CTF 2025) 20
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPFを用いた解法 • eBPFでは特定のアドレスにおけるレジスタの値を取得できる • シグナルハンドラで計算されるRIPの値を取得すれば実行された命令
をトレースできそう • 以下のコードでそれができる 実例 #2: AVX-512 (IERAE CTF 2025) 21
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPFを用いた解法 • 前ページのコードを実行すると、RIPの値が取得できる • 得られたアドレスでディスアセンブルする
• 始めの部分の難読化を解除できた 実例 #2: AVX-512 (IERAE CTF 2025) 22
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPFを用いた解法の問題点 • フラグの判定ロジックは複数パートに分かれており、不正解だと分 かった時点で早期returnする •
つまり実行された判定ロジックしかわからない • 正解した扱いにするにはレジスタの書き換えが必要だが、eBPFでは 不可能 ◦ 一方でメモリの書き換えは可能 実例 #2: AVX-512 (IERAE CTF 2025) 23 https://devblog.lac.co.jp/entry/20220620
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • 既存のツールでトレースを取れない場合に、代替ツールとしてeBPF が使える可能性がある ◦ 特にstraceやltraceの代替として
• プログラムの状態を書き換えつつトレースを取りたい場合には不向き ◦ 使えるなら素直にgdb scriptを使った方が早い ここまでのまとめ 24
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata 1. eBPFの概要 2. eBPFを使った動的解析の実例 3.
eBPFを使った動的解析を防ぐには 話すこと 25
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPF(特にuprobe)によるトレースを防ぐことは可能か? トレースの検知 • int3命令の存在確認 •
リターンアドレスの検証 • [uprobes]領域の存在確認 トレースの回避 • コード領域をwrite可能にする anti-eBPF 26
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPF(特にuprobe)によるトレースを防ぐことは可能か? トレースの検知 • int3命令の存在確認 •
リターンアドレスの検証 • [uprobes]領域の存在確認 トレースの回避 • コード領域をwrite可能にする anti-eBPF 27
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • u{,ret}probeはトレース対象のアドレスにint3命令を置く • プログラムの命令が変化していればトレースされている可能性がある anti-eBPF:
int3命令の存在確認 28 トレース前 トレース中 命令がint3に置き換えられている様子:
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • uretprobeはトレース対象のリターンアドレスを変更する • リターンアドレスが変化していればトレースされている可能性がある •
この挙動が原因でGo言語のバイナリでは使えない anti-eBPF: リターンアドレスの検証 29 https://mechpen.github.io/posts/2022-10-30-golang-bpf/ リターンアドレスが[uprobes]領域に向いている様子:
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • 置換した命令を配置・実行するために[uprobes]領域が確保される a. int3命令でトラップ b.
[uprobes]領域にコードを生成、RIPを向ける c. コードをシングルステップ実行 d. 元のコードの次の命令にRIPを戻す • /proc/self/mapsに[uprobes]領域があればトレースされている可能 性がある • (推測)この方式はマルチスレッド対応のため? anti-eBPF: [uprobes]領域の存在確認 30 https://blog.quarkslab.com/defeating-ebpf-uprobe-monitoring.html
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • 命令をエミュレートできる時[uprobes]領域を使用しない • そのような命令はarch_uprobe_analyze_insn関数を読むとわかる ◦
https://elixir.bootlin.com/linux/v6.16.8/source/arch/x86/ker nel/uprobes.c#L980 ◦ コメントによればpush, nop, jmp, cond jmp命令など • トレース対象の命令が上記になるよう調整すれば回避できる • オフセットでトレース対象を指定するにはbpftraceをbfd有効でビル ドするか、バイナリをstripする anti-eBPF: [uprobes]領域の存在確認(回避) 31 https://www.sh1no.icu/posts/28348c4/
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPF(特にuprobe)によるトレースを防ぐことは可能か? トレースの検知 • int3命令の存在確認 •
リターンアドレスの検証 • [uprobes]領域の存在確認 トレースの回避 • コード領域をwrite可能にする anti-eBPF 32
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • uprobeの対象アドレスはvalid_vma関数でチェックされる ◦ https://elixir.bootlin.com/linux/v6.16.8/source/kernel/event s/uprobes.c#L1295
• アドレスの指す領域がwrite可能だとこのチェックで弾かれる • つまりwrite可能なコード領域にはuprobeを設定できない • チェックされるタイミング ◦ uprobe設定時: eBPFでアタッチしたとき ◦ mmap時: ライブラリがロードされたとき anti-eBPF: コード領域をwrite可能にする 33 https://blog.quarkslab.com/defeating-ebpf-uprobe-monitoring.html
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata • 本発表ではeBPFを使った動的解析手法について紹介した • CTFでは既存のトレーサーが使えない場合に役に立つ •
完全に検知が不可能な銀の弾丸ではない まとめ 34
2025/09/23 魔女のお茶会 #8(2025 夏) @Arata eBPFについて • 『Binary Hacks Rebooted』
#50 • 『入門 eBPF』 • https://zenn.dev/hidenori3/articles/e1352e8cfeb2af bpftraceについて • https://github.com/bpftrace/bpftrace?tab=readme-ov-file#exa mple-one-liners • https://www.brendangregg.com/BPF/bpftrace-cheat-sheet.html eBPF, bpftraceの資料 35