Anwendungen einsperren und überwachen

Aus LinuxUser 01/2024

Anwendungen einsperren und überwachen

© Alexey Kuzin / 123RF.com

Nahtlos im Blick

Es birgt Risiken, Software aus unbekannten Quellen einzusetzen. Mit dem Analyse-Tool Strace überwachen Sie solche Applikationen, mit der Sandbox Firejail sichern Sie sie ab.

Malware wird gelegentlich auch für Linux-Anwender zum Thema. Wenn Sie Programme nicht über die offiziellen Standard-Repos einer Distribution einrichten, sondern von Drittanbietern herunterladen und von Hand installieren, müssen Sie zwangsläufig den Betreibern des jeweiligen Projekts vertrauen. Programme aus Quellen, denen Sie misstrauen, können Sie unter Aufsicht laufen lassen und prüfen, welche Dateien die Anwendung öffnet und welche Netzwerkverbindungen sie aufbaut. Indem Sie diese Tests in einer Sandbox starten, verwehren Sie dem Programm zudem den Zugriff auf das echte System und Ihre privaten Konfigurationsdateien. Wir stellen Strace als Überwacher und Firejail als Sandbox-Tool vor.

Spurensuche

Um zu überwachen, welche Software auf welche Dateien zugreift, bietet sich der System Call Tracer Strace [1] an. Als kleines Beispiel sehen wir uns im Folgenden an, wie Sie mit Strace herausfinden, welche Dateien der Befehl passwd öffnet, wenn Sie Ihr Passwort ändern.

Öffnen Sie zwei Terminalfenster und geben Sie in einem davon als normaler Benutzer passwd ein. Antworten Sie noch nicht auf die Fragen. In einem zweiten Terminal und geben Sie als Root strace -yy -o passwd.log -p $(pidof passwd) ein. Das startet die Protokollierung für den Passwd-Prozess im ersten Fenster, die Informationen schreibt das Tool in die passwd.log. Nun geben Sie im ersten Fenster zunächst das alte und dann zweimal das neue Passwort ein.

Nach dem Beenden von Passwd analysieren Sie im zweiten Fenster die von Strace erstellte Log-Datei. In Abbildung 1 zeigen zwei Grep-Aufrufe, dass das alte Passwort abc123 lautet und das neue Passwort a49152bcbc heißt. Außerdem hat Passwd seit dem Beginn der Protokollierung auf sechs Dateien im Ordner /etc zugegriffen, darunter /etc/passwd und /etc/shadow. Letztere enthält die kryptografischen Hashes der Passwörter.

Abbildung 1: Strace sieht alles: Es erkennt sowohl Dateioperationen als auch die Kommunikation mit dem Terminal über Standardein- und -ausgabe.

Abbildung 1: Strace sieht alles: Es erkennt sowohl Dateioperationen als auch die Kommunikation mit dem Terminal über Standardein- und -ausgabe.

Wie das Beispiel zeigt, vermag Strace ohne Weiteres, bereits laufende Prozesse zu überwachen. Meist ist es jedoch leichter, Strace gleich beim Programmstart einzubinden. So startet etwa der erste Befehl aus Listing 1 das SSH-Login auf einem Rechner namens server42. Dabei protokolliert Strace unter anderem alle aufgebauten Netzwerkverbindungen, wie sich mit einem Blick in die Log-Datei ssh.log überprüfen lässt. Das zweites Kommando aus dem Listing filtert nach Zeilen, die sin_addr enthalten. Im Beispiel hat das Programm Verbindungen zum lokalen DNS-Server 127.0.0.53 und zu server42 (IP-Adresse 192.168.178.173) aufgebaut.

Listing 1

Verbindungsaufbau

$ strace -o ssh.log ssh server42
[...]
$ grep ^connect.*sin_addr ssh.log
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.53")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("192.168.178.173")}, 16) = 0

Strace-Magie

Wie funktioniert diese Protokollierung eigentlich? Moderne Betriebssysteme errichten eine Barriere zwischen der Hardware und den Anwendungen. Beispielsweise kann kein Programm einen direkten Kontakt mit einem Festplattencontroller aufbauen, um etwa Datenblöcke von einer angeschlossenen Platte einzulesen und zu durchsuchen. Stattdessen muss jede Anwendung über System Calls (kurz: Syscalls) das Betriebssystem um Mithilfe bitten. Dabei handelt es sich um ausgewählte Funktionen im Kernel, die das Programm nicht direkt über einen normalen Funktionsaufruf nutzen kann. Stattdessen greift hier ein etwas umständlich wirkendes Prozedere.

Jeder vom Betriebssystem bereitgestellte Syscall besitzt eine Nummer, die das Programm in ein Prozessorregister schreiben muss. Die Argumente für den Syscall landen in weiteren Registern. Dann führt das Programm eine spezielle Maschinensprache-Instruktion aus, zum Beispiel syscall, sysenter oder früher den Software-Interrupt 128 (in Assembler: int 0x80). Dadurch wechselt es vom User Mode in den Kernel Mode.

An dieser Stelle übernimmt das Betriebssystem die Kontrolle. Im Kernel Mode hat es volle Zugriffsrechte auf die Hardware. Anhand der Syscall-Nummer findet es den passenden Syscall-Handler. Der erledigt dann nach einer Berechtigungsprüfung den Auftrag, der sich aus den Argumenten in anderen Registern ergibt. Ein eventueller Rückgabewert landet in einem weiteren Register.

Nach dem Abschluss der Arbeiten wechselt das Betriebssystem aus dem Kernel Mode zurück in den User Mode. Daraufhin liest das Programm den Rückgabewert aus und setzt seine Arbeit fort.

Listing 2 zeigt ein Testprogramm in der Programmiersprache C, das mit open() die Datei /etc/os-release öffnet und daraus mit read() bis zu 4095 Zeichen in einen Puffer liest. Dann schließt es die Datei mit close() und schreibt den Pufferinhalt mit write() auf die Standardausgabe (also ins Terminalfenster). Die Bibliotheksfunktionen open(), read(), write() und close() rufen gleichnamige Syscalls im Kernel auf, dessen Verhalten Strace beobachtet.

Listing 2

C-Testprogramm

#include <unistd.h>
#include <fcntl.h>
#define BUFSIZE 4096
int main () {
  char buf[BUFSIZE] = {0};
  int fd = open("/etc/os-release", O_RDONLY);
  int res = read(fd, buf, BUFSIZE-1);
  close(fd);
  write(STDOUT_FILENO, buf, res);
}

Übersetzen Sie das Programm und lassen es mit Strace laufen, dann finden Sie die Syscall-Aufrufe in der angelegten Protokolldatei. Listing 3 zeigt das Kommando für den Aufruf und die letzten Zeilen aus der von Strace erzeugten Log-Datei. Im Protokoll erscheinen dabei auch die Rückgabewerte der Funktionsaufrufe.

Listing 3

Strace beobachtet Dateizugriffe

$ strace -e trace=open,read,write,close -o /tmp/testprog.log ./testprog
PRETTY_NAME="Ubuntu 23.10"
[...]
$ tail -5 /tmp/testprog.log
open("/etc/os-release", O_RDONLY)       = 3
read(3, "PRETTY_NAME=\"Ubuntu 23.10\"\nNAME="..., 4095) = 393
close(3)                                = 0
write(1, "PRETTY_NAME=\"Ubuntu 23.10\"\nNAME="..., 393) = 393
+++ exited with 0 +++

Überwachen Sie eine Anwendung über einen längeren Zeitraum, dann wird die Protokolldatei sehr groß. Es bietet sich darum an, schon bei der Protokollierung zu filtern. Geben Sie dazu an, welche Syscalls das Tool mitschneiden soll. Details finden Sie in der Manpage von Strace im Abschnitt Filtering. Typische Beispiele sind:

  • strace -e trace=open,close – nur open() und close(),
  • strace -e trace=file – alle Dateioperationen, und
  • strace -e trace=network – alle Netzwerkoperationen.

Wichtig ist außerdem die Option -f (--follow-forks). Sie sorgt dafür, dass Strace auch Kindprozesse beobachtet, denn oft passieren die interessanten Dinge nicht in der zuerst gestarteten Anwendung, sondern weiter unten im Prozessbaum.

Firejail

Mit Firejail [2] sperren Sie Programme zudem in ein “Jail” (Gefängnis), oft auch als Sandbox bezeichnet. Ähnlich wie bei Docker und allgemein Container-basierter Virtualisierung lässt Jail-Software Programme isoliert von sonstigen Anwendungen laufen. Der Blick auf das Dateisystem und das Netzwerk lässt sich ebenfalls einschränken. Firejail bietet derartige Features. Dabei erleichtern vorbereitete Programmprofile den Umgang damit – im Idealfall stellen Sie einem Programmaufruf einfach das Kommando firejail voran. Das Programm steht bei vielen Distributionen in den Standard-Repos zur Installation bereit.

Wenn Sie firejail eingeben, startet eine Shell, in der unter anderem Netzwerkzugriffe deaktiviert sind und der Zugriff auf die Bash-History verboten ist. Diese und weitere einschränkende Regeln stehen in der Standard-Profildatei default.profile, die Firejail für die neu gestartete Shell eingelesen hat. Aus dieser Datei heraus kommen über Include-Zeilen noch zwei weitere Regeldateien zum Einsatz. In Abbildung 2 lässt sich deutlich erkennen, dass die im Jail eingesperrte Bash weder die History lesen noch mit Ping einen Rechner im Netz erreichen kann.

Abbildung 2: Keine History, kein Ping: Firejail schaltet diverse Funktionen ab.

Abbildung 2: Keine History, kein Ping: Firejail schaltet diverse Funktionen ab.

Grundsätzlich hat Software, die in einem solchen Jail läuft, aber noch Zugriff auf das ganze Dateisystem. Davon ausgenommen bleiben lediglich Bereiche, deren Nutzung Sie explizit verbieten. Eine Alternative besteht darin, ein privates Verzeichnis bereitzustellen, in dem ein Programm läuft und aus dem es nicht ausbrechen kann. Das erlaubt die Option --private, die Sie nach dem in Listing 4 gezeigten Schema nutzen.

Listing 4

Privater Ordner

$ mkdir ~/privat
$ firejail --private=$HOME/privat

Das ist besonders für Programme interessant, die nicht auf Ihr Home-Verzeichnis zugreifen sollen. Der hinter --private angegebene Ordner dient im Jail als Ersatz-Home-Verzeichnis, sodass die Anwendung nur dort Unterverzeichnisse erzeugen und Dateien ablegen kann, nicht aber im gesamten Heimatverzeichnis. Das verhindert auch wirksam das Ausspionieren von privaten Daten. Die privaten Ordner anderer Benutzer blendet Firejail ebenfalls aus. Ergänzen Sie den Aufruf um den Schalter --noprofile, dann wendet Firejail keine Regeln aus den Standardprofilen an. In diesem Fall funktionieren zum Beispiel Netzwerk-Tools wie Ping.

Geben Sie beim Aufruf von Firejail ein Programm an, das Sie abgesichert starten möchten, sucht die Software nach einem dazu passenden Profil. Im Paket firejail-profiles finden sich 1200 davon für alle möglichen Anwendungen. Beim Start zeigt Firejail an, welche Profildateien es nutzt. Für Mplayer gibt es zum Beispiel die Profildatei mplayer.profile, die unter anderem die generischen Regeln aus whitelist-player-common.inc einbindet (Abbildung 3). Sie gelten für alle Mediaplayer und erlauben beispielsweise den Zugriff auf den Download-Ordner.

Abbildung 3: Starten Sie Mplayer im Jail, nutzt Firejail die zugeh&ouml;rige Regeldatei, die dann auf eine Profilversion f&uuml;r alle Mediaplayer verweist.

Abbildung 3: Starten Sie Mplayer im Jail, nutzt Firejail die zugehörige Regeldatei, die dann auf eine Profilversion für alle Mediaplayer verweist.

Firejail verträgt sich allerdings nicht mit Software, die als Snap-Paket installiert ist; es findet die Binaries aus den Snaps nicht. Auch die Kombination mit Strace scheint auf den ersten Blick nicht möglich, denn ein entsprechender Aufruf beispielsweise für Mplayer schlägt fehl. Die Lösung liegt in einem Feature von Strace, das es erlaubt, den Überwacher selbst mit Root-Rechten laufen zu lassen, während das überwachte Programm als normaler Nutzer arbeitet. Listing 5 zeigt den passenden Aufruf, der die Strace-Option -u (für den User) verwendet.

Listing 5

Strace und Firejail

$ sudo strace -f -u esser \
  -o mplayer.log \
  firejail \
  mplayer -idx big_buck_bunny.avi

Firejail bietet zahlreiche weitere Optionen, über die Sie fein abgestuft einstellen, was Sie der Software erlauben und was Sie ihr verbieten. Ein älterer LinuxUser-Artikel [3] beschreibt einige davon. Interessant ist auch ein Blick in die Profildateien im Ordner /etc/firejail/.

Fazit

Mit Firejail und Strace schränken Sie die Bewegungsfreiheit unbekannter und nicht vertrauenswürdiger Software ein. Eine noch weitergehende Isolation erreichen Sie durch den Einsatz einer virtuellen Maschine wie Virtualbox, Vmware Workstation oder KVM/Qemu, was aber die Einrichtung eines Linux-Systems in der VM erfordert. (tle)

Infos

  1. Strace: https://strace.io

  2. Firejail: https://firejail.wordpress.com

  3. Firejail: Ferdinand Thommes, “Ab in den Knast!”, LU 12/2017, S. 72, https://www.linux-community.de/39833

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 01/2024 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben