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

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

Avatar for 5unl1fe3 5unl1fe3
August 21, 2026

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

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

Avatar for 5unl1fe3

5unl1fe3

August 21, 2026

Other Decks in Technology

Transcript

  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で初期化)