From 6aad0ece456f1e703fc8519d27a6326c2bd4e0a9 Mon Sep 17 00:00:00 2001 From: Mark Stemm Date: Thu, 12 Apr 2018 08:20:40 -0700 Subject: [PATCH] Add unit test for syscall support This does a madvise, which doesn't have a ppm event type, both directly and indirectly via syscall(__NR_madvise, ...), as well as an open directly + indirectly. The corresponding rules file matches on madvise and open. The test ensures that both opens and both madvises are detected. --- test/falco_tests.yaml | 10 ++++++++++ test/rules/syscalls.yaml | 11 +++++++++++ test/trace_files/syscall.scap | Bin 0 -> 21649 bytes 3 files changed, 21 insertions(+) create mode 100644 test/rules/syscalls.yaml create mode 100644 test/trace_files/syscall.scap diff --git a/test/falco_tests.yaml b/test/falco_tests.yaml index 98448907c3f..6b7641b7838 100644 --- a/test/falco_tests.yaml +++ b/test/falco_tests.yaml @@ -689,3 +689,13 @@ trace_files: !mux rules_file: - rules/detect_connect_using_in.yaml trace_file: trace_files/connect_localhost.scap + + syscalls: + detect: True + detect_level: INFO + rules_file: + - rules/syscalls.yaml + detect_counts: + - detect_madvise: 2 + - detect_open: 2 + trace_file: trace_files/syscall.scap diff --git a/test/rules/syscalls.yaml b/test/rules/syscalls.yaml new file mode 100644 index 00000000000..b984e15a336 --- /dev/null +++ b/test/rules/syscalls.yaml @@ -0,0 +1,11 @@ +- rule: detect_madvise + desc: Detect any call to madvise + condition: evt.type=madvise and evt.dir=< + output: A madvise syscall was seen (command=%proc.cmdline evt=%evt.type) + priority: INFO + +- rule: detect_open + desc: Detect any call to open + condition: evt.type=open and evt.dir=< and fd.name=/dev/null + output: An open syscall was seen (command=%proc.cmdline evt=%evt.type file=%fd.name) + priority: INFO diff --git a/test/trace_files/syscall.scap b/test/trace_files/syscall.scap new file mode 100644 index 0000000000000000000000000000000000000000..90dc870a39214aba95b3710b45016d79723f87a5 GIT binary patch literal 21649 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