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

Wie kann man feststellen, ob eine Binärdatei sicher ist, um einem nicht vertrauenswürdigen Benutzer sudo-Berechtigungen zu erteilen?

Im Allgemeinen ist es unmöglich, es mit Sicherheit zu wissen – selbst ein scheinbar absolut sicheres Programm könnte Schwachstellen aufweisen, die bedeuten, dass es für willkürliche Aktionen verwendet werden kann – aber hier sind einige Dinge, auf die Sie prüfen sollten:

Führt das Programm Folgendes aus?

  • Enthüllen Sie den Inhalt beliebiger Dateien oder Geräte.
  • Kopieren, verschieben, schreiben oder löschen Sie beliebige Dateien.
  • Setzen / ändern Sie beliebige Umgebungsvariablen (die von anderen privilegierten Prozessen übernommen werden) oder nehmen Sie beliebige Änderungen an bestimmten vor.
  • Rufen Sie IOCTLs auf oder interagieren Sie anderweitig mit beliebigen Geräten.
  • Eigentümer oder Berechtigungen für beliebige Dateien ändern.
  • Mounten Sie beliebige Dateisysteme oder ändern Sie Mount-Optionen auf bestehenden.
  • Direkten Zugriff auf den Speicher des Systems oder eines beliebigen Prozesses (z. B. eines Debuggers) erlauben.
  • Starten beliebiger Programme zulassen.

Jedes Programm, das eines davon tut, ist nicht sicher, einem Benutzer mit geringen Berechtigungen sudo zu gewähren Zugriff auf. Dies schließt beispielsweise jedes Programm aus, das die Möglichkeit hat, eine Ausgabedatei anzugeben (normalerweise über eine -o oder -f Parameter), verarbeiten eine Eingabedatei in irgendeiner Weise, die ihren Inhalt preisgibt (sogar nur über eine ausreichend informative Fehlermeldung, dass das Eingabeformat falsch ist), und die überwiegende Mehrheit der Skriptlaufzeiten (einschließlich Shells).

Wenn Sie willkürlich ersetzen in diesen Kontrollen mit begrenzt oder spezifisch , dann haben Sie das Problem um einen (oder mehrere) Schritt nach unten geschoben:Führen Sie alle Dinge aus, zu denen das Programm führen kann solche willkürlichen Geschehnisse, möglicherweise durch mehrere indirekte Ebenen? Wenn Ihr Programm beispielsweise dem Benutzer erlaubt, eine eindeutige Umgebungsvariable festzulegen, wird ein privilegiertes Programm eine andere Datei als erwartet lesen, und diese andere Datei wird das System veranlassen, Benutzern zu erlauben, eine Image-Datei ihrer Wahl als zu mounten ein Dateisystem mit dem setuid etwas respektiert, dann dürfen Sie nicht vertrauenswürdigen Benutzern nicht erlauben, dieses Programm auszuführen.

Nur weil ein Programm all diese Prüfungen besteht, heißt das noch lange nicht, dass es wirklich sicher ist. Wenn es beispielsweise bestimmte Netzwerkaktionen ausführt (z. B. das Abhören eingeschränkter Ports oder das Senden von Rohpaketen), kann es unsicher sein, da möglicherweise ein anderes Programm im Netzwerk (oder auf demselben Computer) vorhanden ist, vorausgesetzt, dass jeder Prozess dazu in der Lage ist Dinge gehören einem vertrauenswürdigen Benutzer - schließlich erfordern diese Aktionen root - und Sie haben diese Annahme gebrochen. Darüber hinaus ist die Liste der Aufzählungspunkte oben nur Dinge, an die ich in ein paar Minuten gedacht habe; Es gibt mit ziemlicher Sicherheit einige Wege zur Rechteausweitung, die ich nicht erwähnt habe.

Schließlich hängt es, wie bei allen Sicherheitsfragen, von Ihrem Bedrohungsmodell ab.

  • Ist der Angreifer (nicht vertrauenswürdiger Benutzer) lokal auf dem Computer mit physischem Zugriff oder entfernt? Es ist äußerst schwierig, einen entschlossenen Angreifer mit physischem Zugriff daran zu hindern, root zu werden, insbesondere wenn er in der Lage sein muss, den Computer ohne Hilfe (neu) zu starten. Überlegen Sie also, welche Risiken Sie bereit sind zu akzeptieren.
  • Wird die Maschine von Benutzern gemeinsam genutzt? Dann müssen Sie zusätzliche benutzerübergreifende Angriffe in Betracht ziehen, wie z. B. Denial-of-Service (indem übermäßig viele Ressourcen verbraucht oder der Computer unbrauchbar gemacht werden).
  • Benötigen Sie Unleugbarkeit (die Fähigkeit zu beweisen, wer etwas getan hat)? Dann müssen Sie sicherstellen, dass Sie alle Aktionen verknüpfen können, die über sudo ausgeführt werden an den Benutzer, der sie erstellt hat.
  • Müssen Sie den Benutzer daran hindern, einige Dinge zu tun, die selbst ein Nicht-Root-Benutzer normalerweise tun kann (z Verbindungen zu beliebigen Hosts und Ports)? Dann müssen Sie zusätzlich die Mittel in Betracht ziehen, mit denen Sie diese Einschränkung durchsetzen, und verhindern, dass Programme als sudo ausgeführt werden, die dem Benutzer eine Möglichkeit bieten könnten, die Einschränkung zu umgehen.

Etc. Eine wirklich umfassende Antwort wird hier nicht möglich sein; es hängt von zu vielen dingen ab. Ich sage jedoch Folgendes:Es ist sehr schwer um sicherzustellen, dass ein nicht vertrauenswürdiger Benutzer, der die Möglichkeit hat, jedes nicht-triviale Programm (das nicht ausdrücklich für eine sichere Ausführung auf diese Weise entwickelt wurde) als root ausführen kann, nichts Unerwartetes tun kann. Selbst wenn eines dieser Programme nichts zulässt, was Sie unbedingt verhindern möchten, ist es möglicherweise möglich, mehrere solcher Programme miteinander zu verketten, um das Ziel des Angreifers zu erreichen.


Es läuft im Wesentlichen auf das Stopping-Problem hinaus, Sie können den Code prüfen oder die Binärdatei zurückentwickeln, aber selbst wenn es keine "Funktionen" gibt, mit denen Sie beliebige Befehle ausführen können, könnten immer noch Schwachstellen in der Binärdatei oder sudo selbst vorhanden sein, die dazu führen könnten beliebige Befehlsausführung als root für die aktivierten Benutzer.


Linux
  1. So richten Sie passwortloses Sudo für einen bestimmten Benutzer ein

  2. Wie kann ich als anderer Benutzer mit sudo eine Reihe von Befehlen in einer Bash-Subshell ausführen?

  3. Wie kann ich nach Dateien suchen und sie in einer Zip-Datei komprimieren?

  4. Wie kann ich eine nicht vertrauenswürdige ausführbare Datei sicher unter Linux ausführen?

  5. Wie funktionieren Dateiberechtigungen für den Root-Benutzer?

So richten Sie Sudo-Berechtigungen für Benutzer in Linux ein

So aktivieren Sie passwortloses Sudo für Benutzer in Linux

Wie kann ich feststellen, auf welches Benutzerlimit ich stoße?

Wie kann ein Dateimanager ein Laufwerk ohne Root mounten?

Wie kann ich einen Benutzer nur für sftp erstellen?

Kann ein Programm erkennen, dass es unter sudo ausgeführt wird?