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
820
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
Black Hat USA 2026の面白かった発表を紹介
arata_nvm
1
14
Operating Systems: Three Easy Pieces, Chapter 49 / Sun's Network File System (NFS)
arata_nvm
0
15
デコンパイラ研究調査
arata_nvm
1
34
コンパイラ基盤を支える言語たち
arata_nvm
1
110
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
37
5分でわかるPage-Fault Weird Machine
arata_nvm
2
430
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
26
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
160
カーネルハック実験の振り返り
arata_nvm
1
69
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Become a Pro
speakerdeck
PRO
31
6.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
500
Building Adaptive Systems
keathley
44
3.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
450
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
500
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
750
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