Commit graph

1800 commits

Author SHA1 Message Date
Gustavo Iñiguez Goia
bde5d34deb
reload more config options without restarting the daemon
Reload the configuration without restarting the daemon when changing:
 - server authentication options.
 - GC percentage.
 - Rules path.
 - Loggers.
 - FW options.
 - eBPF modules path.

Also, try to avoid unnecessary changes.
2024-05-02 21:14:59 +02:00
Gustavo Iñiguez Goia
f5f30b1e58
added Reject to the list of DefaultActions(s)
We only offered two options for the DefaultAction option: allow/deny.

Since a long time ago we support "reject"ing connections, but it was not
configurable as the DefaultAction.

Closes: #1108
2024-05-01 00:23:48 +02:00
Gustavo Iñiguez Goia
be87bc538e
build parent process hierarchy of already running processes
We build the parent process tree of a process when it's executed
for the first time.
Now we also build the tree when an already running process opens a new
outbound connection by the first time.
2024-04-30 23:26:47 +02:00
Gustavo Iñiguez Goia
0a911ef791
disable (process) ebpf events when to many errors
if an invalid opensnitch-procs.o module was loaded, we were flooding
the log with errors.
In these cases stop processing events after 20 errors (random, we should
have no errors).

This may occur if the module is malformed (valid .o ebpf module but
different structs, etc), or when loading modules from other versions.

Closes: #1099 #1082
2024-04-30 00:51:41 +02:00
Gustavo Iñiguez Goia
7442bec96f
ebpf: performance improvement for opensnitch-procs
We were sending to userspace unnecessary exit events, consuming
unnecessary CPU cycles.

We only intercept execve and execveat, but sched_process_exit is invoked
by more functions (sched_process_exit, clone, ...), so we were receiving
on the daemon events that we did nothing with them, apart from consuming
CPU cycles.

On some scenarios like on servers running saltstack (as salt-master),
this caused to consume more CPU than needed.

cherry picked from 15fcf67535
2024-04-29 01:06:39 +02:00
Gustavo Iñiguez Goia
81dd625a1c
added more kernel config paths for checking system requirements
On Fedora Silverblue the kernel config of the current kernel is under
/usr/lib/modules/<kernel>/config

Closes: #1117
2024-04-27 23:36:04 +02:00
Gustavo Iñiguez Goia
bf9801f917
ui: allow to configure screen/themes scale factor
Added new options to the Preferences dialog, to configure screens/themes
scale factor.

If the UI is using the System theme (default), configure Qt scale
options (needs UI restart):
QT_AUTO_SCREEN_SCALE_FACTOR (default True)
QT_SCREEN_SCALE_FACTORS (If auto scale is False, use this value(s))

The user can configure different scale factors for multiple screens, by
separating values with ; (1;1.5, etc...)

https://doc.qt.io/qt-5/highdpi.html#high-dpi-support-in-qt

If the UI is using a qt-material theme, you can configure the "density"
scale of the theme:
https://github.com/UN-GCPDS/qt-material?tab=readme-ov-file#density-scale

https://github.com/evilsocket/opensnitch/wiki/GUI-known-problems#gui-size-problems-on-4k-monitors

Closes: #1102
2024-04-27 19:02:54 +02:00
Gustavo Iñiguez Goia
2ec37ed593
ui: fixed deleting rules with list limits
Fixed deleting rules when the GUI is configured to display a maximum
number of rules.
2024-02-11 11:41:49 +01:00
Gustavo Iñiguez Goia
fbd17a29da
pop-ups: filter by absolute path+cmdline on some cases
If the pop-ups' target is to filter by cmdline, but the typed/launched
command is not absolute or it starts with /proc, also filter by the
absolute path to the binary.
2024-02-08 17:45:21 +01:00
Gustavo Iñiguez Goia
c3ec54efaf
Updated ebpf compilation instructions
kudos to @planetoryd for reporting it (#1080).
2024-02-06 00:30:44 +01:00
Gustavo Iñiguez Goia
51779e8b8d
updated ebpf makefile
- Added -fno-stack-protector:
   https://lore.kernel.org/bpf/194f38f2dc7d521375e5a660baaf1be31536be9a.camel@gmail.com/
   https://reviews.llvm.org/D142046

 - Added -Wno-unused-value, -Wunused to warn on unitialized/not used
   variables.

kudos to @planetoryd for reporting this (#1080).
2024-02-06 00:18:16 +01:00
Gustavo Iñiguez Goia
dddfdc924e
pkgs: improved rpm upgrades
We were not handling configuration upgrades properly on rpm based
systems.

Now local changes to default-config.json and system-fw.json are kept,
and if the distributed files changes in the future, new files will be
created with the extension .rpmnew
2024-02-02 14:16:16 +01:00
Gustavo Iñiguez Goia
785500cd08
clean dns ebpf hooks on exit
We were not reacting to common exit signals, only to kill/interrupt
signals, so the DNS uprobes were never properly removed. Each uprobe
has the PID of the daemon in the identifier, so in theory, there
shouldn't be conflicts, but better clean our probes on exit.

previous to this commit with the daemon running
(and lot of starts/stops):

~ # cat /sys/kernel/debug/tracing/uprobe_events |wc -l
367

after stopping the daemon:
~ # cat /sys/kernel/debug/tracing/uprobe_events |wc -l
364

~ # > /sys/kernel/debug/tracing/uprobe_events
~ # cat /sys/kernel/debug/tracing/uprobe_events |wc -l
0

~ # cp opensnitchd-new /usr/bin/opensnitchd ; service opensnitchd start
~ # cat /sys/kernel/debug/tracing/uprobe_events |wc -l
3
~ # service opensnitchd stop
~ # cat /sys/kernel/debug/tracing/uprobe_events |wc -l
0
2024-01-28 01:10:00 +01:00
Gustavo Iñiguez Goia
c118058dd8
on aarch64 send exec events directly to userspace
On 68c2c8ae1a we excluded failed execve*
calls from being delivered to userspace, in order to get the binary that
was executed and avoid errors/confusion.

But on aarch64, it seems that we fail to save the exec event to a map,
so the event is never delivered to userspace.

So for the time being, send the exec events as soon as they arrive on
aarch64, without checking if the call failed.
2024-01-26 20:58:07 +01:00
Gustavo Iñiguez Goia
27509d6fe0
ebpf,dns: initialized structs
On the previus commit we just disabled dns uprobes for armhf/i386 to
avoid loading errors. A better fix is to initialized the structs used.
On armhf still fails after loading it, when attaching to the uprobes
(offsets?), and on i386 it doesn't seem to send anything to userspace
(more analysis needed).

- Increased the number of IPs associated with a domain that are
  delivered to userspace. (getfedora.org returns 30 ipv4+ipv6).
- Fixed getting the aliases of a domain when using gethostbyname().
2024-01-26 20:50:50 +01:00
Gustavo Iñiguez Goia
55678b4d3b
added more debug info to the dns ebpf hook
Added the path to the libc as well as the calculated offset for the
uprobe.
Don't return on the first error found loading a uprobe, instead try all
the uprobes and return if the loaded uprobes are 0.
2024-01-26 14:48:44 +01:00
Gustavo Iñiguez Goia
d55e567dd8
fixed dns ebpf module for i386/arm architecture
The opensnitch-dns module was not loading on i386/arm architectures.
With the following changes it loads and some uprobes are attached.

for-loops unrolling doesn't still work though on i386/armhf (help
needed).

And on armhf the perf_output channel fails to load for some uprobes.
2024-01-26 14:16:43 +01:00
Gustavo Iñiguez Goia
c1ba2add20
fixed debug msg printing resolved IP 2024-01-25 16:00:49 +01:00
Gustavo Iñiguez Goia
016f4842ff
ui:use appimages pattern as default target if found
If the path of a process starts with /tmp/.mount_*, which is the common
path for appimages, use it as the default target on the popups.

Previously it was only added to the list of targets, but preselecting it
will help users to create rules for appimages.
2024-01-22 12:54:10 +01:00
Gustavo Iñiguez Goia
2f1a9b8c9e
on errors stop established conns monitor
There's a long running task that monitors established connections every
~2s.

When a connection is not found via ebpf or proc, sometimes it's found
there so we can use the inode to search for the process.

However on some systems the netlink call to dump the sockets may fail
continuously, wasting resources. It'll also fail if you block connections
to port 0 (common case for ICMP packets).

So if there're too many errors dumpng the sockets, stop this task for
these cases.
2024-01-20 23:37:51 +01:00
Gustavo Iñiguez Goia
01edd361fe
process tree improvements
- When discovering the hierarchy of a process, reuse components of
   the tree if they're already on cache, to improve speed and reduce
   mem allocs.
 - When building the tree of a proces, rebuild the tree if the first
   component doesn't have pid 1. Otherwise reuse the tree.
2024-01-18 13:35:29 +01:00
Gustavo Iñiguez Goia
379d010ab8
minor improvement/refactoring
Move queues setup to its own func.
Don't declare some dns vars inside for loops.
2024-01-18 11:37:07 +01:00
Gustavo Iñiguez Goia
164696ff22
removed not used functions
part of the previous commit.
2024-01-18 01:37:08 +01:00
Gustavo Iñiguez Goia
33437672b2
ebpf cached improvements
Simplify the cache of connections by storing only the PID of a process,
instead of the Process object.

We can obtain the Process object from the cache of processes by PID.
2024-01-18 01:25:19 +01:00
Gustavo Iñiguez Goia
dc43d5913c
allow to configure GC percentage
Added config option to set how often the garbage collector runs.

For example:

  "Internal": {
      "GCPercent": 75
  },

If this option is not specified in the config file, or the value
is 0, then the GC percentage is not configured.

More info:

https://pkg.go.dev/runtime/debug#SetGCPercent
2024-01-18 00:01:58 +01:00
Gustavo Iñiguez Goia
a389707eb6
added more options to debug the daemon
- Improved -mem-profile icli option for writing memory statistics.
 - Added -trace-file cli option for writing trace events.

https://github.com/google/pprof/blob/main/doc/README.md
https://go.dev/blog/pprof
2024-01-17 21:31:55 +01:00
Gustavo Iñiguez Goia
96e62bf973
strings concatenation improvements
Use strings.Join() to concatenate strings, instead of Sprint*(), for
better performance.
2024-01-16 00:14:44 +01:00
Gustavo Iñiguez Goia
e8dffbe11c
fixed typo 2024-01-15 20:45:17 +01:00
Gustavo Iñiguez Goia
e5787aef65
structs fields reorganized
Structs' fields reorganized based on fieldalignment tool output
2024-01-14 20:44:49 +01:00
Gustavo Iñiguez Goia
9446d191f0
ebpf: delete pid from exec maps if it exists
We track new processes execution by intercepting the enter and exit
of the functions, but sometimes the exit hook is not called, so the
corresponding entry was not being removed from the map.
In this situation the map becomes full and accepts no new entries.

Now the entry is deleted from the map once the process exits, if it
still exists in the map.
2024-01-08 01:33:54 +01:00
Gustavo Iñiguez Goia
bb95a77c58
sys-fw: load default config path if non supplied
By default load the system fw config file from
/etc/opensnitchd/system-fw.json.

There're these options to specify the file to load:

 - via cli option with -fw-config-file
 - writing it in the default-config.json file:
   "FwOptions": { "ConfigPath": "..." }

If both options are empty, then the default one is used.

FIXME:
 When the cli option is used to load the fw configuration, and the main
preferences are saved, the fw is reloaded but the path to the fw config
is lost.
2024-01-08 00:34:28 +01:00
Gustavo Iñiguez Goia
b2bd56d7e2
updated TestProcIOStats test
On this test we assumed that there would always be reading stats for our
own process /proc/self, but on restricted environments that might not
alwys be the case. Anyway, a value of 0 is not an error in itself.

Closes #1075
2024-01-05 15:31:00 +01:00
Gustavo Iñiguez Goia
1518cb39de
ebpf: fixed dns uprobes
We were not deleting DNS entries from the hash map, so when it reached
the maximum capacity (12k entries), we couldn't allocate new entries,
resulting in events not being sent to userspace.
2024-01-05 13:33:56 +01:00
Gustavo Iñiguez Goia
d9287bf601
ui: display alert details by double-clicking on it 2024-01-04 12:15:39 +01:00
Gustavo Iñiguez Goia
159494d1e2
fixed loading dns ebpf module
Closes #1076
2024-01-04 01:12:03 +01:00
Gustavo Iñiguez Goia
dc48d392f2
ui: save and display alerts/events from the daemon
New option to save and display alerts/events received from the daemon,
like system fw errors or eBPF modules errors.

Until now we only displayed a desktop message, making it difficult to
review the message in detail, or other actions.
2024-01-03 20:22:45 +01:00
Gustavo Iñiguez Goia
050e3c51b0
fixed leak dispatching alerts
Fixed potential leak when disconnecting from the GUI, and at the same
time dispatching an alert/message to the GUI.
2023-12-31 20:12:44 +01:00
Gustavo Iñiguez Goia
68c2c8ae1a
ebpf: fixed getting ppid, skip failed execve's
- Fixed getting ppid (precompiled .o won't probably work).
 - Skip failed execve* calls.
2023-12-26 14:04:19 +01:00
Gustavo Iñiguez Goia
ffb76683aa
allow to configure ebpf modules path
Now it's possible to configure eBPF modules path from the
default-config.json file:
 "Ebpf": {
   "ModulesPath": "..."
 }

If the option is not provided, or if it's empty, we'll keep loading from
the default directories:

 - /usr/local/lib/opensnitchd/ebpf
 - /usr/lib/opensnitchd/ebpf
 - /etc/opensnitchd/ebpf (deprecated, will be removed in the future).

Closes #928
2023-12-22 23:27:18 +01:00
Gustavo Iñiguez Goia
090bb0e2a4
updated sys-fw tests 2023-12-20 23:02:45 +01:00
Gustavo Iñiguez Goia
54ac5a3549
fw: allow to configure config file/ check interval
- Allow to configure system firewall configuration file path:
   * via cli (-fw-config-file).
   * via global configuration file.
 - Allow to configure fw rules check interval.

The system fw config file contains regular iptables/nftables rules.
Previously it was hardcoded to /etc/opensnitchd/system-fw.json

The interval to check if the interception rules were added was also
hardcoded to 10 seconds. Now it's possible to configure it.
A value of "0s" disables the interval, while "" defaults to 10 seconds.
2023-12-20 21:32:45 +01:00
Gustavo Iñiguez Goia
e905163a03
ui: make fw dialog status label selectable
- Allow to select by mouse or keyboard the status messages of the
   firewall.
 - Enable word wrapping.
2023-12-20 01:08:49 +01:00
Gustavo Iñiguez Goia
290ed40e8d
procmon: fixed leak reading proc's environ vars 2023-12-17 23:29:27 +01:00
Gustavo Iñiguez Goia
94492f0a71
ui: fixed config option 2023-12-17 20:52:39 +01:00
Gustavo Iñiguez Goia
6006717b86
ui: allow to configure refresh interval
Up until now, the GUI was refreshed if:
 - it was not minimized or hidden.
 - if there were new events (even if we received events from the daemon,
   they were filtered out if they were duplicated).

But still, there were scenarios where refreshing the views every second
(more or less) was too much, like when monitoring multiple machines.

Now it's possible to configure the views' refresh interval, regardless
of what the daemon sends.

Asked here: #1073
2023-12-17 20:19:40 +01:00
Gustavo Iñiguez Goia
6873fd3a2d
updated ui/client tests 2023-12-17 00:39:41 +01:00
Gustavo Iñiguez Goia
211c864d76
allow to configure rules and config file paths
- Added cli option -config-file to specify an alternate path to the
   config file.
 - Allow to configure rules path from the configuration file (cli option
   takes precedence).
 - Default options are now /etc/opensnitchd/rules and
   /etc/opensnitchd/default-config.json. Previously the default rules
   directory was "rules" (relative path).

Closes #449
2023-12-17 00:22:07 +01:00
Gustavo Iñiguez Goia
9cee3b3a73
fixed leak checking fw status 2023-12-15 11:49:16 +01:00
Gustavo Iñiguez Goia
0207e3a55f
cache of events improvement
don't reset/recalculate checksums on every configuration change, only if
the checksums config item has changed.
2023-12-12 18:11:46 +01:00
Gustavo Iñiguez Goia
431e2d3ed9
procmon/cache improvements
- Fixed several leaks.
 - Cache of events reorganized and improved.
   * items are added faster.
   * proc details are rebuilt if needed (checksums, proc tree, etc)
   * proc's tree is reused if we've got the parent in cache.

rel: #413
2023-12-12 14:48:17 +01:00