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
Rust×eBPFでEDRっぽいものをつくる
Search
5unl1fe3
August 21, 2026
Technology
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rust×eBPFでEDRっぽいものをつくる
Kernel/VM探検隊@東京 No19で発表したスライドです。
5unl1fe3
August 21, 2026
Other Decks in Technology
See All in Technology
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
240
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
380
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
570
ソフトウェアサプライチェーンの構造的リスクとコンテナ環境の保護
kyohmizu
5
730
Bits AI を制するものは Datadog を制す / The player that controls Bits AI, controls Datadog
kaminashi
0
140
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
610
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
SmartHR Engineering Team Deck
smarthr
1
3.1k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
160
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Design in an AI World
tapps
1
280
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Mobile First: as difficult as doing things right
swwweet
225
10k
The Curious Case for Waylosing
cassininazir
1
470
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
370
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Transcript
Rust×eBPFでEDRっぽいものをつくる Kernel/VM探検隊@東京 No19 @5unl1fe3
自己紹介 さんらいふ(X: @5un1fe3) • • 学生時代は超小型人工衛星(CubeSat)の開発とか 通信のセキュリティや低レイヤへの興味がわき 界隈をチェンジ 最近の活動 •
• 技術同人誌 Kernel/VMは見る専だったが今回初発表
この時間が休憩タイムなあなた 検証が終わりかけの頃、先行事例を知ってしまいました(単に勉強不足)。 Kernel/VMはまだまだ始まったばかりです。 以下のような話題に覚えのある方や詳しい方、 その他なんとなく内容に想像がつく方は10分間の休憩をどうぞ • • Cilium Tetragon Microsoft
Defender for Endpoint Linux版にeBPFベースのセンサー追加 https://github.com/cilium/tetragon https://learn.microsoft.com/ja-jp/defender-endpoint/linux-support-ebpf
eBPF×Rust eBPF カーネルのイベントをフックして色々できるようにするやつ Aya Rust製eBPFライブラリ(https://aya-rs.dev/book/) モチベ • • Rustでちょっと規模の大きいソフトウェアを書いてみたい 書くなら低レイヤが絡むものがいい
eBPFを使って EDRみたいなものが書けそうなのでは?
作った機能 条件は緩めで、広く検知できるよう素朴に実装 「eBPFを使ってイベントが検知できそうか」を検証 1. 2. 3. 4. 5. 6. プロセスツリーの追跡
特定パスからのプロセス実行検知 ファイルレス実行検知 権限昇格検知 ポートスキャンの検知・遮断 C2通信っぽい挙動の検知
1.プロセスツリーの追跡 イベント発生時にプロセスを追跡するために情報を取っておく sys_enter_execveや、sched_process_fork といったTracepointにフック Kernel sys_enter_execve sched_process_fork pid, ppid, tgid,
パス などプロセス情報取得 write Event格納 RingBuf read プロセス情報を格納 Userland Hashmap ProcInfo struct ProcessEvent{ pub event_type: EventType, pub pid: u32, pub tgid: u32, pub parent_pid: u32, pub target_pid: u32, pub uid: u32, pub comm: [u8; 16], pub filename: [u8; 256], pub filename_len: u32, pub fd: i32, pub prot: u32, pub is_deleted: u32, pub exec_time_ns: u64, pub old_uid: u32, }
2.特定パスからのプロセス実行 Kernel sys_enter_execve sched_process_fork pid, ppid, tgid, パス などプロセス情報取得 write
プロセス系Event 格納 RingBuf read プロセス情報を格納 監視対象パスか判断 ppidを辿って プロセスツリー追跡 Userland Hashmap ProcInfo Hashmap AyashiiProcInfo
3.ファイルレス実行検知 その1. リンク解除済ファイルの実行検知 bprm_check_security (LSM) をフック Kernel bprm_check_security dentryがリンク解除 していたら書込み
write Event 格納 RingBuf イベントが起きたこと を検知して発火 Userland
3.ファイルレス実行検知 その2.オンディスクからの痕跡消去実行の検知 memfd_create/exit、execveat の組み合わせで検知 Kernel memfd_create memfd_exit execveat Event 格納
RingBuf fd/name Hashmap MemInfo Userland fdを検索して、 見つかれば発火
4.権限昇格検知 commit_creds(kprobe)をフック。 現在のプロセスのeuidが0以外で、新しいタスクのeuidが0なら発火 Kernel commit_creds 新しいプロセスのeuidが0 かどうか 現在のプロセスのeuidが0 でないかどうか Event
格納 RingBuf Userland プロセスの情報が あるか Hashmap AyashiiProcInfo
5.ポートスキャンの検知・遮断 XDPでポートスキャンを検知・ブロック Kernel パケットの情報を XDPコンテキスト からパース 送信元IPアドレスごとに ウィンドウ内で閾値回数以 上パケットを検知 以降ウィンドウ中は
DROP Event 格納 RingBuf 発火 Userland
6.C2通信っぽい挙動の検知 socket_connect(LSM)のフックと、組み合わせで検知 configに書いたIPアドレス宛の通信で、監視対象パスからの実行であれば発火 Kernel IPアドレス/ポート、pidなど を取得 socket_connect Event 格納 RingBuf
指定のIPアドレスか判断 プロセスの情報があるか Userland Hashmap AyashiiProcInfo
課題その 1 CO-REが素直に実装できない?
情報取得のため構造体をたどるイベント ファイルレス実行検知でbprm_check_secyurityをフック後、unlink確認まで struct linux_binprm { ~~ struct file *interpreter; struct
file *file; struct cred *cred; ~~ }; struct file { ~~ union { const struct path f_path; struct path __f_path; }; union { struct mutex f_pos_lock; u64 f_pipe; ~~ } struct path { struct vfsmount *mnt; struct dentry *dentry; }; カーネルの構造体はオフセットが結構変わる
CO-REが素直に実装できない? 1. Clangなどでは、コンパイル時 BPF_CORE_READ() マクロでフィールドアクセスを書 くことでリロケーション情報を付与する。 2. ロード時に実行環境の /sys/kernel/btf/vmlinux を読むことで、リロケーションす
べき箇所のオフセットを実際のカーネル構造体から計算して書き換える
だが現実は厳しい 1. rustcにリロケーション情報を与える機能がない疑惑 https://github.com/aya-rs/aya/issues/349 2. verifierによるポインタアクセスの制約 実行時に読んだ値(BPFマップの値など)とのポインタ演算を拒否 ・LSMフックの ctx.arg(n) は「trusted
pointer」 ・LSMフックの場合は、BPFマップ経由で値を渡してオフセットを反映させることも難 しい
それでも ...! 1. ユーザー空間側が、デーモン起動の都度、 bpftool btf dump file /sys/kernel/btf/vmlinux -j
をサブプロセスとして実行 2. 得られたJSONをパースし、union/structを再帰的に辿って必要なフィールドオフ セットを解決。オフセットを構造体にまとめる。 3. まとめたオフセットはグローバル変数として、 ロード前にオフセット値を書き換え (最初では0で初期化)
課題その 2 恐怖!突然の execve検知不可
スライドを作り始めていたそんなある日 一旦全機能が動くかをもう一度試してみた 結果:11件中5件 pass ←は? 調べると、Tracepointのフックがうまくいっていない execve系のイベント検知は全滅 いきなりなに?
もう一度検知を見せてくれ 1. 簡単に、HelloworldのELFを/tmpに置いて実行(/tmp/a.out) →検知ログが出てこない 2. execveを検知するのみの頃のプログラムにロールバックしてリトライ →検知ログが出てこない 3. /tmp/a.outを100回実行する →
9回検知 → 9/100 = 0.09 $ lscpu ~ CPU: →1/12 ~ 0.083… 12
CPU 0しか検知してないぞこれ ... $ taskset -c 0 /tmp/a.out → 100件中100件検知
どうしようと思ったがここで時間切れ
まとめ・今後の課題 • EDRっぽいものを目指してeBPFプログラムをつくってみた • (当然だが)誤検知が爆裂に出る。検知ロジックを高度化したい • 検知ロジックを書こうとした時、不審性を示す情報が参照できると実装が非常に 楽。IoCは偉大 • どのCPUで実行されても検知するようにしなければならない
https://github.com/sunlife3/needre