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
150
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
AI-DLC実践録_フルサイクル開発への挑戦
miyuc
0
310
同じWAFが、攻撃の“形”は弾く── 正当な“形”の不正は通す
kuroneko13
0
250
システム思考で問題に対処する
yussak
0
360
LLM Internals: 언어 모델의 계보와 알고리즘 진화 (2023~2026)
inureyes
PRO
1
790
AIにブラウザを触らせて、E2EテストをPlaywrightで書く
koji_kawamura
0
190
Android skills に学ぶ
kokiko
0
130
小粒でもパワフルなJS Runtime Antjsについて
comamoca
0
110
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9.3k
My broken English still works: speaking at global OSS events
naruoga
0
120
MulticaとPi Coding Agentで、小規模OSSを30本同時運用した流れ
eiei114
0
130
Digitization部 紹介資料
sansan33
PRO
2
7.7k
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
380
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
390
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
800
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
290
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
A Tale of Four Properties
chriscoyier
163
24k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Darren the Foodie - Storyboard
khoart
PRO
3
3.7k
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