Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust×eBPFでEDRっぽいものをつくる

5unl1fe3
August 21, 2026

 Rust×eBPFでEDRっぽいものをつくる

Kernel/VM探検隊@東京 No19で発表したスライドです。

5unl1fe3

August 21, 2026

Transcript

22 slides
  1. 作った機能 条件は緩めで、広く検知できるよう素朴に実装 「eBPFを使ってイベントが検知できそうか」を検証 1. 2. 3. 4. 5. 6. プロセスツリーの追跡

    特定パスからのプロセス実行検知 ファイルレス実行検知 権限昇格検知 ポートスキャンの検知・遮断 C2通信っぽい挙動の検知
  2. 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, }
  3. 2.特定パスからのプロセス実行 Kernel sys_enter_execve sched_process_fork pid, ppid, tgid, パス などプロセス情報取得 write

    プロセス系Event 格納 RingBuf read プロセス情報を格納 監視対象パスか判断 ppidを辿って プロセスツリー追跡 Userland Hashmap ProcInfo Hashmap AyashiiProcInfo
  4. 情報取得のため構造体をたどるイベント ファイルレス実行検知で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; }; カーネルの構造体はオフセットが結構変わる
  5. それでも ...! 1. ユーザー空間側が、デーモン起動の都度、 bpftool btf dump file /sys/kernel/btf/vmlinux -j

    をサブプロセスとして実行 2. 得られたJSONをパースし、union/structを再帰的に辿って必要なフィールドオフ セットを解決。オフセットを構造体にまとめる。 3. まとめたオフセットはグローバル変数として、 ロード前にオフセット値を書き換え (最初では0で初期化)

Other Decks in Technology