-
Notifications
You must be signed in to change notification settings - Fork 420
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add suspicious_syscall_source
event
#3953
base: main
Are you sure you want to change the base?
Conversation
The ebpf code for this event contains a call to the Because this helper uses a callback function or in verifier terms a "bpf-to-bpf call", this program cannot be combined with tail calls (which it uses) on some older kernels, even though the helper call would not be called on those kernels. As a result, this event must be split into 2 separate programs that will be loaded conditionally based on kernel version. Currently no such mechanism exists, but is in the works. When such a mechanism will be implemented this event will be split into 2 programs so it can be merged. EDITThe logic for newer kernels which uses the |
c45b5fc
to
a6c4e35
Compare
d90fe4e
to
3a29a8c
Compare
daec435
to
03d7be9
Compare
abd31e6
to
eb312fe
Compare
6fc9f61
to
4c70e9e
Compare
82bc699
to
49499c2
Compare
0d4d80e
to
6e8e468
Compare
6e8e468
to
25da11b
Compare
check_syscall_source
eventsuspicious_syscall_source
event
25da11b
to
a57fa0e
Compare
type eventParameterHandler func(t *Tracee, eventParams []map[string]filters.Filter[*filters.StringFilter]) error | ||
|
||
var eventParameterHandlers = map[events.ID]eventParameterHandler{ | ||
events.SuspiciousSyscallSource: attachSuspiciousSyscallSourceProbes, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since you created event parameters, we can move print_mem_dump in here as well (I'm not sure if there are other events that abuse data filters as parameters)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
print_mem_dump
uses event filters to populate the required ksymbols. handleEventParameters
is called at the end of initialization, because it needs to happen after initBPF
, which is called after the kernel symbols are initialized.
pkg/ebpf/tracee.go
Outdated
// Probes created for suspicious_syscall_source event | ||
suspiciousSyscallSourceProbes *probes.ProbeGroup |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it is a good idea to add probe groups into the tracee struct.
It makes the struct coupled to specific events, and we want to decouple things, not the other way around.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where should it be added? The main probe group is also part of the tracee struct
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The main probe group is the only group that exists now, and it is not event specific like this one
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So where should I put it? I also plan to add additional "syscall checker" events that will all utilize the same probe group which will make it not specific to a single event but for a "class" of events
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@yanivagman I added a map to the tracee struct that holds extra probe groups (indexed by a given name) that can be added dynamically.
a57fa0e
to
e42f227
Compare
e42f227
to
bbc812c
Compare
Instead of saving the probe group for suspicious_syscall_source directly to the tracee struct, it is added to a generic map that holds extra probe groups which can be added dynamically.
1. Explain what the PR does
Add a new event,
suspicious_syscall_source
, which reports invocations of syscalls from unusual code locations (stack, heap and anonymous VMAs).It is implemented using generic syscall kprobes, which trigger the analysis only for syscalls that were selected using event parameters, e.g.
tracee -e suspicious_syscall_source.args.syscall=open,openat
.Closes #4002
2. Explain how to test it
The easiest way to test the event is using the included tester program, which executes a small shellcode that invokes the
exit
syscall from the stack/heap/anonymous VMA according to the command line argument. Note that it must be compiled with-z execstack
to be able to run the shellcode from the stack.Another way of testing the event (for arbitrary syscalls) is by packing a program: