Frage

Eine Anwendung will eine Datei analysieren und „Ausführen“, und will ausführbare die Datei aus Sicherheitsgründen geltend zu machen.

Eine Moment gedacht, und Sie erkennen dieser anfängliche Code hat eine Race-Bedingung, dass das Sicherheitsschema unwirksam macht:

import os

class ExecutionError (Exception):
    pass

def execute_file(filepath):
    """Execute serialized command inside @filepath

    The file must be executable (comparable to a shell script)
    >>> execute_file(__file__)  # doctest: +ELLIPSIS
    Traceback (most recent call last):
        ...
    ExecutionError: ... (not executable)
    """
    if not os.path.exists(filepath):
        raise IOError('"%s" does not exist' % (filepath, ))
    if not os.access(filepath, os.X_OK):
        raise ExecutionError('No permission to run "%s" (not executable)' %
                filepath)

    data = open(filepath).read()

    print '"Dummy execute"'
    print data

Die Race-Bedingung existiert zwischen

os.access(filepath, os.X_OK)

und

data = open(filepath).read()

Da gibt es eine Möglichkeit, die Datei mit einer nicht-ausführbaren Datei von verschiedenen Inhalten zwischen diesen beiden Systemaufrufen überschrieben werden.

Die erste Lösung, die ich habe, ist die Reihenfolge der kritischen Anrufe zu ändern (und überspringt die jetzt redundante existance Prüfung):

fobj = open(filepath, "rb")
if not os.access(filepath, os.X_OK):
    raise ExecutionError('No permission to run "%s" (not executable)' %
            filepath)

data = fobj.read()

Ist dies die Race-Bedingung lösen? Wie kann ich es richtig lösen?

Sicherheitsschema Begründung, kurz (dachte ich)

wird die Datei der Lage sein, beliebige Befehle auszuführen, in seinem Umwelt, so ist es ein Shell-Skript vergleichbar.

Es gab eine Sicherheitslücke auf freien Desktops mit .desktop-Dateien, die definieren, Anwendungen: Die Datei beliebige ausführbare Dateien mit Argumenten angeben können, und es kann ein eigenes Symbol und Namen wählen. So eine zufällig heruntergeladene Datei konnte verstecken hinter jedem Namen oder Symbol und tut nichts. Das war schlecht.

wurde dies dadurch gelöst, dass die .desktop-Dateien die ausführbaren Bit haben Set, sonst werden sie nicht mit dem Namen / Symbol und dem freien Desktop gemacht werden wird der Benutzer gefragt, ob er das Programm starten vor Beginn will.

Vergleichen Sie dies mit Mac OS X sehr guten Design: „Dieses Programm aus dem Internet heruntergeladen wurde, sind Sie sicher, dass Sie es öffnen?“.

So in Allegorie mit diesem, und die Tatsache, dass Sie sich chmod +x Schale Skripte, die Sie herunterladen, dachte ich über das Design in der Frage oben.

Schlusswort

Vielleicht abschließend, vielleicht sollten wir es einfach halten: Wenn die Datei ausführbar sein muss, machen es ausführbar und lassen Sie den Kernel es ausführen, wenn sie vom Benutzer aufgerufen. Delegation der Aufgabe zu, wo es hingehört.

War es hilfreich?

Lösung

Die Ausführbarkeit wird an die Datei angehängt Sie öffnen, gibt es nichts zu stoppen mehrere Dateien von zeigte auf den inode die Daten enthält, die Sie lesen möchten. Mit anderen Worten können die gleichen Daten aus einer nicht-ausführbaren Datei an anderen Stelle im gleichen Dateisystem lesbar sein. Darüber hinaus auch nach dem Öffnen der Datei können Sie nicht die Ausführbarkeit derselben Datei verhindern, dass zu ändern, ist es auch nicht verknüpft werden könnten.

Die „best effort“ zur Verfügung wie ich es sehe seine Kontrolle täte os.fstat mit auf der geöffnete Datei und Überprüfung Schutzmodus und Änderungszeit vor und nach, sondern bestenfalls wird dies nur die Möglichkeit reduzieren, dass Änderungen unentdeckt während Sie die Datei.

lesen

Am zweiten Gedanken, wenn Sie der ursprüngliche Schöpfer der Daten in dieser Datei sind, könnten Sie erwägen, eine Inode zu schreiben, die nie über Dateien auf das Dateisystem in erster Linie, diese eine gemeinsame Technik im Speicher-Sharing verknüpft ist. Alternativ, wenn die schließlich enthaltenen Daten öffentlich zu anderen Benutzern gemacht müssen Sie das Sperren von Dateien verwenden könnte, und dann schrittweise die Schutzbits auf die Benutzer erweitern, die sie benötigen.

Schließlich müssen Sie böswillige Benutzer sicherzustellen, haben einfach nicht den Schreibzugriff auf die Datei.

Andere Tipps

Sie können nicht ganz diese Racebedingung lösen - zum Beispiel in der Version, wo Sie zum ersten Mal öffnen, dann Berechtigungen überprüfen, es ist möglich , dass die Berechtigungen erhalten geändert nur, nachdem Sie die Datei geöffnet haben und nur bevor Sie die Berechtigungen geändert haben.

Wenn Sie atomar die Datei in ein Verzeichnis verschieben können, wo die potenziellen Bösewichte nicht erreichen können, dann können Sie sicher sein, dass nichts über die Datei aus unter der Nase verändert werden, während Sie mit ihr zu tun haben. Wenn die potenziellen Bösewichte erreichen überall , oder Sie nicht auf die Datei bewegen, wo sie nicht erreichen können, gibt es keine Verteidigung.

BTW, es ist mir nicht klar, wie dieses System, auch wenn es an der Arbeit gemacht werden könnte, würde jede Sicherheit tatsächlich hinzufügen - sicher, wenn die Bösewichte Inhalt in der Datei vergiftet setzen können, es ist jenseits von ihnen nicht, es zu chmod +x als gut?

Das Beste, was Sie tun können, ist:

  • Speichern Erlaubnis.
  • ändern Sie es in Ihren eigenen einzigartigen Benutzer (etwas mit dem Programmnamen) und andere verbietet es auszuführen.
  • machen Sie Schecks (auf die gespeicherte Erlaubnis, wenn erforderlich).
  • laufen Ihren Prozess.
  • die Erlaubnis zu den Geretteten zurückwerfen.

Natürlich gibt es Nachteile, aber wenn Ihr Anwendungsfall ist so einfach, wie Sie scheinen zu sagen, es könnte den Trick tun.

Sie sollten die Eigentums Dateien ändern, so dass ein Angreifer nicht darauf zugreifen kann „chown root: root file_name“. Führen Sie eine „chmod 700 file_name“, so dass keine anderen Konten lesen / schreiben / Ausführen der Datei. Dies vermeidet das Problem eines TOCTOU alle zusammen und das ist, wie die Menschen verhindern, dass Dateien von einem Angreifer geändert werden, die über ein Benutzerkonto auf Ihrem System.

Eine andere Möglichkeit, es zu tun ist, um die Dateinamen unerwartet etwas zu ändern oder sogar die gesamte Datei kopieren - wenn es nicht zu groß ist - in ein temporäres Verzeichnis (verschlüsselt, falls erforderlich), machen prüft Sie, dann umbenennen / kopieren Sie die Datei zurück.

Natürlich ist es ein sehr schwerer Prozess.

Aber Sie am Ende mit, dass, weil das System von Anfang an nicht gesetzt worden ist für die Sicherheit. Ein sicheres Programm unterzeichnen oder verschlüsseln Daten, die er will sicher halten. In Ihrem Fall ist es nicht möglich.

Wenn Sie nicht wirklich auf schwere Verschlüsselungs-, gibt es nicht Art und Weise 100 Sicherheit auf einer Maschine, um sicherzustellen, Sie kontrollieren nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top