Kann ein Angreifer mit mkdir ein System kompromittieren?

22

Ich richte ein eingeschränktes Benutzerkonto für Benutzer ein ricardo, ein problematischer Benutzer auf meinem System. Ich möchte ihm das Recht einräumen, Verzeichnisse zu verwenden sudo, was er manchmal tun muss. Ich betrachte diese Regel in meiner /etc/sudoersDatei:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

Gibt es eine Möglichkeit, mit der Ricardo das System absichtlich oder versehentlich gefährden kann, wenn er nur diese Regel verwendet?

Ricardo Altamirano
quelle
2
Wenn Sie ein Dateisystem mit einer statischen Inode-Anzahl haben, könnte er alle Ihre Inodes verbrauchen.
Jordan
2
@schaiba Er bastelt gerne und prüft, ob er das System ausnutzen kann und liest die Manpages nicht immer so oft, wie er sollte.
Ricardo Altamirano
8
Eine ordnungsgemäße Benutzererziehung, kombiniert mit momentan keinem Sudo, wäre die empfohlene Vorgehensweise von mir.
Schaiba
2
Wie @schaiba sagt, können Sie solche Benutzer verwenden, indem Sie sie unterweisen und ihnen Verantwortlichkeiten zuweisen (unter strenger Aufsicht). Ich habe Kriege zwischen Systemverwaltern und Benutzern gesehen, als die ersten versuchten, das System zu sehr zu blockieren. Die Benutzer waren 10 zu 1 zahlreicher als die Systemadministratoren , und selbst dann ( ohne den heutigen Internetzugang!) War die Niederlage der Systemadministratoren erniedrigend. Niemals in eine solche Position kommen!
Vonbrand
2
Das ist bei einem Ricardo zu viel der Fall. Oder zumindest so BOFH gesprochen ...
Deer Hunter

Antworten:

21

Ich vermute, dass ein solcher Angriff funktionieren würde, bei dem "something" ein Kernelmodul ist, das versucht, nach dem Laden von rootfs zu laden:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

Beachten Sie auch, dass Sie abhängig von den im Modul deklarierten Aliasnamen andere Namen verwenden können. Ich nehme an, es wird nicht geladen, bis depmod ausgeführt wird. Dies geschieht, wenn das nächste Mal ein Kernel-Update durchgeführt wird. Das mkdirwird also erst kürzlich im sudo-Protokoll angezeigt.

Es gibt viele Dinge in / etc, die alle Dateien in einem Verzeichnis lesen, manchmal rekursiv. Schlimmer noch, einige dieser Verzeichnisse existieren standardmäßig nicht und die einzige Möglichkeit, etwas über sie zu erfahren, besteht darin, die Manpage, Init-Skripte usw. für das Programm zu lesen, das sie verwendet. Einige, noch schlimmer, sind veraltete Abwärtskompatibilitätsprobleme und werden möglicherweise nicht mehr dokumentiert.

edit: Dachte an ein paar weitere Verzeichnisse, diese in /usr/local:

  • /usr/local/lib/perl/5.14.2(unterscheidet sich je nach Perl-Version, versuchen Sie perl -Ves herauszufinden). Erstellen Sie dort ein FileUnterverzeichnis und legen Sie ein Find.pmdarin ab. Wann immer jemand es benutzt File::Find, wird er die Version des Angreifers benutzen. Ähnlich verfahren Sie mit Getopt::Long. Systemdienstprogramme werden häufig in Perl geschrieben, daher gibt dies wahrscheinlich root. (Versuch ack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • Ich denke, Python, Ruby usw. haben ähnliche Verzeichnisse. System-Dienstprogramme sind ebenfalls in Python geschrieben.
  • Subvertiere viele Dinge, die jemand mit Unterverzeichnissen von kompiliert /usr/local/include.
derobert
quelle
Oh, aber wenn <böser Benutzer> Module dorthin kopieren kann, wo der Kernel sie laden wird, ist das Spiel vor dem Start beendet.
Vonbrand
1
@vonbrand <böser Benutzer> kann normalerweise nicht, aber er hat ihn verwendet sudo mkdir, um ein neues Verzeichnis zu erstellen, in dem er kann.
Derobert
20

Durch die Ausführung mkdirals root kann der Benutzer andere Prozesse / Benutzer daran hindern, neue Dateien und Verzeichnisse zu erstellen, indem er zuvor Verzeichnisse mit identischen Namen (und / oder falschen Rechten) erstellt.

Dies kann insbesondere bei Protokoll- und Sperrdateien sicherheitsrelevant sein .

Wie bereits erwähnt, kann auch die maximale Anzahl von Inodes aufgebraucht werden, wodurch das gesamte System blockiert werden kann.

Indem Sie den Benutzer bestimmten Gruppen hinzufügen (oder ACLs verwenden ), sollten Sie in der Lage sein, die Probleme zu lösen, ohne Rechte über zu erteilen sudo.

Jofel
quelle
Tolle Punkte. Ich werde wahrscheinlich mkdirdie Liste der Befehle weglassen, die Ricardo verwenden darf.
Ricardo Altamirano
Wenn es um die Erschöpfung von Inodes geht, reicht ein einfacher for((i = 0;; i++)); do touch $i; doneWille aus (Bashismus, sorry; aber Sie haben die Idee).
Vonbrand
@vonbrand Außer das ist nicht als root, also wird es durch eine Quote gestoppt. Natürlich können auch andere sudoBefehle, die OP in Betracht zieht, die Erschöpfung von Inodes ermöglichen. OP muss sich dieses DoS-Vektors bewusst sein.
Derobert
11

Sie sollten ihn in ein Chroot-Gefängnis umleiten. Oder noch besser, zu einer kleinen VM, dass er einmal pro Stunde abstürzen kann. Sie müssen lediglich eine neue Kopie bereitstellen.

ott--
quelle
Ich kann es nur empfehlen. Geben Sie ihm Root-Zugriff auf seine eigene VM.
Emory
zu einer chroot ^ H ^ H ^ H ^ H ^ Hounty Gefängnis ...
Deer Hunter
6

Es gibt Möglichkeiten, Verzeichnisse mit Schreibzugriff zu erstellen. Mit mkdir -m 777 blahdem ricardoUser kann man schreiben was man will in das neue Verzeichnis. Sie benötigen einen Prozess auf dem System, der bereits als anderer Benutzer ausgeführt wird und einen Verzeichnisbaum herunterfährt, um die Konfiguration, Skripte oder Module zu laden. Dann könnte der Benutzer möglicherweise seine eigenen Dinge hinzufügen, die geladen oder ausgeführt werden sollen. Das erste, woran ich denken kann, ist, wenn Sie einen Webserver betreiben, der PHP oder CGI ausführen kann. Sie könnten dann Skripte als dieser Benutzer ausführen. Ich habe Mühe, realistischere Beispiele zu finden, insbesondere rootsolche, aber ich bin mir sicher, dass es sich um solche handelt.

ssh ist ein Beispiel für einen Daemon, der diese Art von Szenario abfängt. Wenn Sie ein .sshVerzeichnis für einen Benutzer erstellt haben, der kein Verzeichnis hat, und Ihre eigene authorized_hostsDatei erstellt haben. sshdstellt fest, dass die Verzeichnisberechtigungen zu offen sind, und ignoriert den öffentlichen Schlüssel.

Sie könnten sich definitiv die Mühe machen, Verzeichnisse zu erstellen, in denen Dateien auftauchen sollen (wie temporäre Dateien oder Auslagerungsdateien), mit denen viele Programme nicht gut umgehen würden.

Sie könnten viele Gruppen erstellen, aber es sieht so aus, als würden Sie nichts damit anfangen. Möglicherweise können Sie ein System zumindest auf die Knie zwingen. Es dauerte ungefähr 10000 cgroups auf einer Box mit 256 M, bis der OOM-Killer sshd herausholte.

Wenn Sie die -mOption zu mkdirund die UMASK der sudoUmgebung steuern, denke ich, ist es nur ein Ärgernis.

Matt
quelle