„Linux ist der beste Virenschutz“, heißt es in „Fachkreisen“. „Installiere Linux und Du wirst fortan ruhiger schlafen können!“ Ähm… falsch.
Ja, Linux ist ein guter Anfang was die Herstellung der Sicherheit auf dem eigenen Rechner betrifft. Aber es hilft einem nichts ohne brain.exe
. Vor allem wenn man es mit einem Magier zu tun bekommt…
Mögen die Spiele beginnen!
ps -fu nagios
Wer auf das Monitoring-System Zugriff hat, hat viel Macht.
Wo Bernd recht hat, hat er recht – nicht umsonst nimmt z. B. Gunnars Jabber-Notification-Skript Nutzername und Passwort via Umgebungsvariablen entgegen. Check- und Notification-Skripte, die diesem Beispiel nicht folgen, reißen eine Sicherheitslücke auf, die jeder Systemnutzer ganz einfach ausnutzen kann:
aklimov@icinga2:~$ ps -fu nagios UID PID PPID C STIME TTY TIME CMD nagios 8128 1 0 11:10 ? 00:00:00 /usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2 --no-stack-rlimit daemon -e /var/log/icinga2/error.log nagios 8148 8128 0 11:10 ? 00:00:00 /usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2 --no-stack-rlimit daemon -e /var/log/icinga2/error.log nagios 8433 8148 0 11:17 ? 00:00:00 /usr/lib/nagios/plugins/check_ping -6 -H ::1 -c 200,15% -w 100,5% nagios 8434 8433 0 11:17 ? 00:00:00 /bin/ping6 -n -U -w 10 -c 5 ::1 nagios 8435 8148 0 11:17 ? 00:00:00 /usr/lib/nagios/plugins/check_ping -4 -H 127.0.0.1 -c 200,15% -w 100,5% nagios 8436 8148 0 11:17 ? 00:00:00 /usr/lib/nagios/plugins/check_ping -H 127.0.0.1 -c 5000,100% -w 3000,80% nagios 8437 8435 0 11:17 ? 00:00:00 /bin/ping -n -U -w 10 -c 5 127.0.0.1 nagios 8438 8436 0 11:17 ? 00:00:00 /bin/ping -n -U -w 30 -c 5 127.0.0.1
Schwarze Magie ist hier noch nicht im Spiel. (Aber dieses Beispiel ist auch nur zum Aufwärmen.)
strace -p
Was tut ein Programm so alles wenn ich gerade mal nicht hinschaue? Um diese Frage zu beantworten, wird nicht zwangsläufig der Quellcode benötigt. In vielen Fällen reicht bereits strace
:
aklimov@WS-AKlimov:~$ echo $$ # Prozess-ID der Shell
20901
aklimov@WS-AKlimov:~$ strace -p20901
strace: Process 20901 attached
wait4(-1,
Der Ausgabe können wir entnehmen, dass die Shell gerade darauf wartet, dass ein beliebiger Kindprozess (z. B. strace
) sich beendet.
Diese Art der Hexenkunst hat sich bereits rumgesprochen und die Kernel-Entwickler haben ihre Wirkung eingedämmt. Daher konnte ich ohne weiteres nur den Elternprozess von strace
als Beispiel nehmen.
gdb -p
Ich erinnere mich noch genau an diese eine AWP-Unterrichtsstunde in der Berufsschule:
Es ging darum, dass ein C/C++-Programm auf mehrere Module aufgeteilt werden kann. Mit dem static
-Schlüsselwort sei es möglich, „modulglobale“ Variablen zu erstellen – d. h. Variablen, die zwar global, aber nur für das eigene Modul sichtbar sind. Ein Argument des Lehrers für solche Variablen war allen Ernstes die Sicherheit. Und die Übung zu diesem Thema bestand darin, in einem Modul ein Passwort vor den anderen Modulen zu verbergen.
Wenn der wüsste…
Zunächst starte ich in einem neuen Terminal cat
:
aklimov@WS-AKlimov:~$ cat
Damit haben wir auch schon unseren „Opfer“-Prozess, der im konkreten Fall auf eingehende Daten wartet.
Darauf hin öffne ich ein zweites Terminal (mit den gleichen Benutzerrechten!) und starte gdb
:
aklimov@WS-AKlimov:~$ ps -ef |grep cat
aklimov 10217 10149 0 12:25 pts/11 00:00:00 cat
aklimov 11088 10298 0 12:26 pts/12 00:00:00 grep cat
aklimov@WS-AKlimov:~$ gdb -p 10217
GNU gdb (Debian 7.11.1-2+b1) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
(...)
Attaching to process 10217
(...)
(gdb)
Die schwarze Magie daran…
… besteht darin, dass ich nun innerhalb dieses Prozesses schalten und walten kann wie ich will. (Und sämtlichen Speicher aller Module auslesen.)
Beispielsweise kann ich den Standard-Eingabe-Datenstrom (Stdin) des Prozesses on-the-fly durch /dev/null
ersetzen (ohne ihn zu verlieren):
Aktion (Beschreibung) | Aktion (GDB) | Datei-Deskriptoren | |
---|---|---|---|
/dev/null öffnen |
(gdb) p open("/dev/null", 0) |
0 | /dev/pts/1 |
3 | /dev/null |
||
Stdin sichern | (gdb) p dup(0) |
0, 4 | /dev/pts/1 |
3 | /dev/null |
||
Datenstrom umleiten | (gdb) p dup2(3, 0) |
4 | /dev/pts/1 |
0, 3 | /dev/null |
||
Redundanten Deskriptor schließen | (gdb) p close(3) |
4 | /dev/pts/1 |
0 | /dev/null |
||
Programm-Ausführung fortsetzen | (gdb) c |
N/A |
Fazit
Linux nimmt einem keinerlei Sicherheitsfragen vollständig ab. Es gibt einem lediglich die Möglichkeit, sich selbst um diese zu kümmern (und sie nicht der NSA zu überlassen).
Gehet hin und sichert euch!

0 Kommentare
Trackbacks/Pingbacks