GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden Sie find sicher mit sudo

Gemäß man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Das hat bei mir funktioniert. (Zeilen, die mit '#' beginnen, sind root, die mit '$' sind non-root) in diesem Fall befindet sich der non-root-Benutzer in wheel Gruppe.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

In Anbetracht dessen, was die Fähigkeit gewährt, passt es genau zu dem, was Sie wollen. Ich habe nicht erschöpfend überprüft, ob find hat eine Funktion, mit der Sie Bytes in Dateien lesen können, aber offensichtliche Dinge wie LD_PRELOAD und Bibliotheks-Shim-Angriffe sollten aufgrund der Natur von setuid-Prüfungen in Linux nicht funktionieren, und die Capability-Bits werden auch nicht von untergeordneten Prozessen geerbt (im Gegensatz zu raw setuid), also ist das ein weiterer Bonus.

Denken Sie daran, dass das, was Sie tun möchten, mögliche Datenschutzbedenken in Bezug auf die Erstellung oder den Zugriff auf temporäre Dateien aufwirft und dass das Programm als Grundlage für die Durchführung einer Race-Condition / eines Privilegien-Eskalationsversuchs verwendet werden könnte (gegen Programme, die bekannte Dateinamen erstellen aber führen Sie keine korrekten Sicherheitsüberprüfungen durch).

Außerdem verlassen sich einige schlecht geschriebene Anwendungen möglicherweise auf Dateimetadaten oder eine Baumstruktur, um Bedeutung zu vermitteln oder Daten zu verbergen. Dies kann dazu führen, dass eingeschränkte Informationen preisgegeben oder privilegierte Dokumente preisgegeben werden, von denen sonst nichts bekannt ist (Sicherheit durch Verschleierung, ich weiß, aber das ist eine Sache, die insbesondere Closed-Source-Anbieter leider gerne tun).

Seien Sie daher vorsichtig und seien Sie vorsichtig, wenn Sie dies tun, und verstehen Sie, dass damit immer noch ein Risiko verbunden ist, selbst wenn die offensichtlichen Dinge nicht funktionieren.

Oh, und mich würde interessieren, ob jemand einen Proof-of-Concept-Angriff hat, der diesen Mechanismus als Grundlage für die Privilegien-Eskalation in den Kommentaren verwendet!


Wie sieht es mit dem Suchen aus?

locate liest eine oder mehrere Datenbanken, die von updatedb(8) vorbereitet wurden, und schreibt Dateinamen, die mit mindestens einem der PATTERNs übereinstimmen, auf die Standardausgabe, einen pro Zeile. Wenn --regex nicht angegeben ist, können PATTERNs Globbing-Zeichen enthalten. Wenn irgendein PATTERN keine Globbing-Zeichen enthält, verhält sich Locate so, als wäre das Muster PATTERN .

Standardmäßig überprüft locate nicht, ob in der Datenbank gefundene Dateien noch vorhanden sind. locate kann niemals Dateien melden, die nach der letzten Aktualisierung der relevanten Datenbank erstellt wurden.

Oder vielleicht sogar slocate:

Secure Locate bietet eine sichere Methode zum Indizieren und schnellen Suchen nach Dateien auf Ihrem System. Es verwendet eine inkrementelle Codierung, genau wie GNU Locate, um seine Datenbank zu komprimieren, um die Suche zu beschleunigen, aber es speichert auch Dateiberechtigungen und Eigentumsrechte, sodass Benutzer keine Dateien sehen, auf die sie keinen Zugriff haben.

Diese Handbuchseite dokumentiert die GNU-Version von slocate. slocateermöglicht Systembenutzern, ganze Dateisysteme zu durchsuchen, ohne nicht autorisierte Dateien anzuzeigen.


Ich würde den Benutzern die richtigen Berechtigungen geben.

Standardmäßig, wenn die umask 022 ist , werden Verzeichnisse erstellt, damit jeder die darin enthaltenen Dateien auflisten und statisieren kann. Wenn nicht, können Sie die Berechtigung des Verzeichnisses manuell auf bitweise oder auf seine alten Berechtigungen und 0555 ändern :

chmod +0555 foo

Und wenn diese Benutzer keine Ausführungsberechtigung für alle übergeordneten Verzeichnisse dieses Verzeichnisses haben (z. B. das Home-Verzeichnis eines anderen Benutzers), bedeutet dies wahrscheinlich, dass Sie das erste Verzeichnis woanders ablegen sollten.

Wenn Sie nur einigen Benutzern erlauben möchten, dieses Verzeichnis zu lesen und auszuführen, können Sie seinen Modus auf 0750 ändern , ordnen Sie diese Benutzer einer Gruppe zu und ändern Sie den Gruppeneigentümer des Verzeichnisses in diese Gruppe:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo

Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Bash =~ Regex und Https://regex101.com/?

  3. Wie führe ich einen Befehl aus, der Umleitung oder Piping mit Sudo beinhaltet?

  4. Wann sollte /dev/random vs. /dev/urandom verwendet werden?

  5. Wie man einen Cronjob komplett zum Schweigen bringt /dev/null/?

Fügen Sie einen Linux-Benutzer mit Dokument-Root-Berechtigungen hinzu

Verwenden Sie iptables mit CentOS 7

Installieren Sie Binärdateien in /bin, /sbin, /usr/bin und /usr/sbin, Interaktionen mit --prefix und DESTDIR

Führt ein Shell-Skript in der aktuellen Shell mit sudo-Berechtigung aus

Verwenden Sie ein Git-Repository auf /var/www/html/

Warum sind < oder > erforderlich, um /dev/tcp