Skip to content
API Documentation
BastionGuard™
ConsoleEventSink.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
3
4#include <iomanip>
5#include <iostream>
6
8
9const char* ConsoleEventSink::eventName(const __u32 type) noexcept
10{
11 switch (type) {
12 case RG_EVENT_SETUID: return "setuid";
13 case RG_EVENT_EXEC_PRIV: return "exec-priv";
14 case RG_EVENT_CREDENTIAL_ANOMALY: return "credential-anomaly";
15 case RG_EVENT_PERMISSION_CHANGE: return "permission-change";
16 case RG_EVENT_OWNER_CHANGE: return "owner-change";
17 case RG_EVENT_XATTR_CHANGE: return "xattr-change";
18 case RG_EVENT_ACL_CHANGE: return "acl-change";
19 case RG_EVENT_PROTECTED_UNLINK: return "protected-unlink";
20 case RG_EVENT_PROTECTED_RENAME: return "protected-rename";
21 case RG_EVENT_PROTECTED_HARDLINK: return "protected-hardlink";
22 case RG_EVENT_INTEGRITY_DRIFT: return "integrity-drift";
23 case RG_EVENT_INTEGRITY_RESTORED: return "integrity-restored";
24 case RG_EVENT_SERVICE_BLOCKED: return "service-blocked";
25 case RG_EVENT_FILE_RESTORED: return "file-restored";
26 case RG_EVENT_FILE_QUARANTINED: return "file-quarantined";
27 case RG_EVENT_PROTECTION_MODE_CHANGED: return "protection-mode-changed";
28 default: return "unknown";
29 }
30}
31
32const char* ConsoleEventSink::verdictName(const __u32 verdict) noexcept
33{
34 switch (verdict) {
35 case RG_VERDICT_AUDIT: return "AUDIT";
36 case RG_VERDICT_AUTHORIZED: return "AUTHORIZED";
37 case RG_VERDICT_BLOCKED: return "BLOCKED";
38 case RG_VERDICT_TRUSTED: return "TRUSTED";
39 case RG_VERDICT_ALERT: return "ALERT";
40 case RG_VERDICT_RESTORED: return "RESTORED";
41 default: return "UNKNOWN";
42 }
43}
44
45namespace {
46
47const char* pathResolutionName(const __u32 resolution) noexcept
48{
49 switch (resolution) {
50 case RG_PATH_PROTECTED_BASELINE: return "protected-baseline";
51 case RG_PATH_PROC_FD: return "proc-fd";
52 case RG_PATH_PROCESS_CWD: return "process-cwd";
53 case RG_PATH_KERNEL_EXACT: return "kernel-exact";
54 case RG_PATH_LSM_EXACT: return "lsm-exact";
56 default: return "basename-only";
57 }
58}
59
60} // namespace
61
62void ConsoleEventSink::onEvent(const rg_event& event) noexcept
63{
64 try {
65 std::cout << '[' << verdictName(event.verdict) << "] "
66 << "type=" << eventName(event.event_type)
67 << " pid=" << event.pid
68 << " tgid=" << event.tgid
69 << " ppid=" << event.ppid
70 << " comm=" << event.comm
71 << " parent-comm=" << event.parent_comm
72 << " actor-dev=" << event.actor_file.device
73 << " actor-ino=" << event.actor_file.inode
74 << " parent-dev=" << event.parent_file.device
75 << " parent-ino=" << event.parent_file.inode
76 << " actor-start=" << event.actor_start_boottime_ns
77 << " euid=" << event.old_euid << "->" << event.new_euid
78 << " rule=" << event.rule_id
79 << " reason=0x" << std::hex << event.reason_flags << std::dec
80 << " aux=" << event.auxiliary
81 << " dev=" << event.file.device
82 << " ino=" << event.file.inode;
83
84 if (event.old_mode != 0 || event.new_mode != 0) {
85 std::cout << " mode=" << std::oct << event.old_mode
86 << "->" << event.new_mode << std::dec;
87 }
88 if (event.old_uid != 0 || event.new_uid != 0 ||
89 event.old_gid != 0 || event.new_gid != 0) {
90 std::cout << " owner=" << event.old_uid << ':' << event.old_gid
91 << "->" << event.new_uid << ':' << event.new_gid;
92 }
93 if (event.xattr_name[0] != '\0')
94 std::cout << " xattr=" << event.xattr_name;
95 std::cout << " file="
96 << (event.filename[0] != '\0' ? event.filename : "-")
97 << " path-resolution=" << pathResolutionName(event.path_resolution);
98 if (event.actor_executable[0] != '\0')
99 std::cout << " actor=" << event.actor_executable;
100 if (event.parent_executable[0] != '\0')
101 std::cout << " parent-exe=" << event.parent_executable;
102 std::cout << '\n';
103 std::cout.flush();
104 } catch (...) {
105 // Never allow an exception to cross the libbpf callback boundary.
106 }
107}
108
109} // namespace bastionguard::rootguard
static const char * verdictName(__u32 verdict) noexcept
static const char * eventName(__u32 type) noexcept
void onEvent(const rg_event &event) noexcept override
const char * pathResolutionName(const __u32 resolution) noexcept
@ RG_EVENT_PROTECTED_RENAME
@ RG_EVENT_FILE_QUARANTINED
@ RG_EVENT_EXEC_PRIV
@ RG_EVENT_OWNER_CHANGE
@ RG_EVENT_ACL_CHANGE
@ RG_EVENT_PROTECTED_UNLINK
@ RG_EVENT_SETUID
@ RG_EVENT_SERVICE_BLOCKED
@ RG_EVENT_INTEGRITY_RESTORED
@ RG_EVENT_INTEGRITY_DRIFT
@ RG_EVENT_PROTECTED_HARDLINK
@ RG_EVENT_CREDENTIAL_ANOMALY
@ RG_EVENT_PROTECTION_MODE_CHANGED
@ RG_EVENT_XATTR_CHANGE
@ RG_EVENT_PERMISSION_CHANGE
@ RG_EVENT_FILE_RESTORED
@ RG_PATH_LSM_EXACT
@ RG_PATH_PROCESS_CWD
@ RG_PATH_BASENAME
@ RG_PATH_PROC_FD
@ RG_PATH_PROTECTED_BASELINE
@ RG_PATH_KERNEL_EXACT
@ RG_VERDICT_TRUSTED
@ RG_VERDICT_ALERT
@ RG_VERDICT_AUDIT
@ RG_VERDICT_RESTORED
@ RG_VERDICT_AUTHORIZED
@ RG_VERDICT_BLOCKED