setuid_monitor.php 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <?php
  2. $prog = <<<EOT
  3. #include <linux/sched.h>
  4. // define output data structure in C
  5. struct data_t {
  6. u32 pid;
  7. u32 uid;
  8. u64 ts;
  9. char comm[TASK_COMM_LEN];
  10. };
  11. BPF_PERF_OUTPUT(events);
  12. TRACEPOINT_PROBE(syscalls, sys_enter_setuid) {
  13. struct data_t data = {};
  14. // Check /sys/kernel/debug/tracing/events/syscalls/sys_enter_setuid/format
  15. // for the args format
  16. data.uid = args->uid;
  17. data.ts = bpf_ktime_get_ns();
  18. data.pid = bpf_get_current_pid_tgid();
  19. bpf_get_current_comm(&data.comm, sizeof(data.comm));
  20. events.perf_submit(args, &data, sizeof(data));
  21. return 0;
  22. }
  23. EOT;
  24. # load BPF program
  25. $b = new Bpf(["text" => $prog]);
  26. # header
  27. printf("%-14s %-12s %-6s %s\n", "TIME(s)", "COMMAND", "PID", "UID");
  28. # process event
  29. function print_event($cpu, $data, $size) {
  30. $event = unpack("Lpid/Luid/Qts/A16comm", $data);
  31. printf("%-14.3f %-12s %-6d %d\n", $event['ts'] / 1000000000, $event['comm'], $event['pid'], $event['uid']);
  32. }
  33. # loop with callback to print_event
  34. $b->events->open_perf_buffer("print_event");
  35. while (true) {
  36. try {
  37. $b->perf_buffer_poll();
  38. } catch (Exception $e) {
  39. exit();
  40. }
  41. }