Sandkasten für C++-Programme (Einschränkung von Rechten)



  • Hallo C++ Gemeinde,
    zunächst einmal muss ich mich als Java-Programmierer outen, deswegen weiss ich nicht genau, ob die Frage totaler Blödsinn ist 😉

    In Java ist es ja möglich über den Security Manager die Rechte für ein Java-Programm zu steuern, Rechte zu vergeben etc. (Sandkasten-Modell). Beispielsweise ist es auf diese Weise möglich die Verwendung von Sockets zu unterbinden etc.
    In einem solchen Sandkasten führen wir bisher Java-Programme aus und das funktioniert auch einwandfrei. Nun stellt sich die Frage ob was ähnliches für C++ möglich ist?

    Also ist es möglich dass ich aus einem Programm heraus ein C++ Programm starte und für dieses Programm sage ich: Ok, du darfst keine Dateien schreiben, du darfst keine Sockets öffnen, du darfst aber xyz? Also kann ich auch für C++ Programme gezielt Rechte setzen/entfernen?
    Falls das so direkt nicht möglich ist, welche Möglichkeit hätte man das für C++ Programme zu machen?

    Vielen Dank im Voraus. Ich habe schon zum Thema Rechten und Sandkasten gesucht, aber leider habe ich nichts passendes gefunden. Falls es möglich wäre, wäre ich auch über eine kurze begründung dankbar. Sprich: falls es nicht geht würde mich dann auch interessieren warum nicht.



  • Ich denke nicht, dass es mit C++ nicht so einfach ist. Ein C++ Programm kann ja nicht unbedingt als ein solches erkannt werden.
    Auch was die Sperrung angeht gibt es ja sehr viele Möglichkeiten etwas zu bewerkstelligen. Am ehesten wirst du da wahrscheinlich mit Plattformspezifischen Funktionen weiterkommen.

    Vlt. hilft dir da ja Wikipedia weiter:
    http://en.wikipedia.org/wiki/Sandbox_(computer_security)

    Sandboxie ist auch so ein Programm. Das allerdings allgemeiner gehalten ist, als du dir das vortellst.



  • Hi,

    ich sehe da kein prinzipielles Problem ... aber ein praltisches: In Java programmiert man eben gegen die Java-VM, die ein derartiges Feature bietet. Wenn ich recht informiert bin, "codierst" Du diese Dinge auch nicht direkt in Dein Javaprogramm, sondern konfigurierst sie "von außen" (also in der Laufzeitumgebung).
    In C++ programmierst Du gegen das Betriebssystem. Wenn das OS dieses Feature bietet, dann kannst Du es ganz analog dafür konfigurieren (die Nutzerrechte unter Windows oder Linux sind ja ein wenig sowas) ... wenn Du genau die Abbildung der JavaVM-Mechanismen haben möchtest, musst Du eben eine entsprechende VM für C++ suchen bzw. selbst schreiben (entsprechenden Compiler und Runtime nicht vergessen) - das ist schon ein Haufen Arbeit.
    Mir ist jedenfalls eine derartige VM nicht bekannt (und ich wage auch zu bezweifeln, dass diese Arbeit sich lohnt).

    Gruß,

    Simon2.



  • Simon2 schrieb:

    In C++ programmierst Du gegen das Betriebssystem.

    Naja, im Grunde kompiliert er ja nur gegen das OS bzw. gegen dessen Schnittstelle. Der Compiler setzt bestimmte Funktionen in Aufrufe an das Betriebssystem um, meist Ressourcenanforderungen. Am OS vorbei wird wohl nichts gehen, es sei denn das OS liefert Handles auf tiefer liegende Schichten. Ich kann mir durchaus vorstellen dass es möglich ist, für ein gegebenes OS eine zusätzliche Sicherheitsschicht zu implementieren, die das OS selbst simuliert und einfach alle Aufrufe dorthin weiterleitet oder ablehnt, je nach Konfiguration.



  • Die ganzen Virtualisierungsgeschichten (VirtualBox, Virtual PC, Virtual Server, VM Ware) gehen ja diesen Weg.

    Simon



  • pumuckl schrieb:

    Simon2 schrieb:

    In C++ programmierst Du gegen das Betriebssystem.

    Naja, im Grunde kompiliert er ja nur gegen das OS bzw. gegen dessen Schnittstelle....

    😕
    Äh - ja.
    Ist das nun was Anderes, als ich schrob ?

    Na - egal, anscheinend sind wir uns einig. 🙂

    Gruß,

    Simon2.



  • Wie die meisten gesagt haben, hat ja Java als Sprache direkt keine Sandkastenfunktionen. Wenn du z.B. in einem Java-Applet auf das Dateisystem zugreifen willst, haut dir ja nicht die Java-Sprache auf die Finger. Sondern die JVM erlaubt es dir einfach nicht.

    ABER eine JVM, die nicht vollständig implementiert ist, könnte solche Features NICHT haben.

    Nun muß man bei C++ so denken, das ja das OS die "VM" ist. Also muß dir das OS auf die Finger hauen.

    Für WIndows kann man das hier empfehlen:
    http://www.sandboxie.com/
    Dabei ist es egal, ob das Programm in C++, Delphie usw. geschrieben ist.

    Es gibt auch Betriebssysteme, die sowas schon serienmäßig mitbrigen, z.B. hat FreeBSD seit Jahren das Jails-Feature:
    http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails.html
    Wie der Name sagt, kann man so Programme in einem "Gefängnis" laufen lassen.

    VMs wie VMware, Virtual PCs sind auch ein Ansatz, haben aber den Nachteil, das man immer ein OS pro VM installieren muß. Das ist bei Jails und Sandboxie natürlich nicht nötig.



  • Unter Linux könnte man mit vorgeladenen Bibliotheken arbeiten. Man bräuchte eine dynamische Bibliothek, die man mittels des Preload-Mechanismuses der GLibC zwischen GlibC und Programm lädt. In dieser Bibliothek kann man dann Zugriffe auf Funktionen wie open(), close(), write(), etc. abfangen. Bei electricfence wird dieses Verfahren z. B. genutzt, um die Aufrufe auf malloc(), free() und Konsorten umzuleiten, um Speicherlecks finden zu können.
    Wenn es nur darum geht, den Zugriff auf das Dateisystem einzuschränken, könnte ein chroot die Lösung sein.
    Aber, wie die Vorredner schon sagten, alles betriebssystemabhängig...



  • Simon2 schrieb:

    pumuckl schrieb:

    Simon2 schrieb:

    In C++ programmierst Du gegen das Betriebssystem.

    Naja, im Grunde kompiliert er ja nur gegen das OS bzw. gegen dessen Schnittstelle....

    😕
    Äh - ja.
    Ist das nun was Anderes, als ich schrob ?

    Äh - nee. Tut mir leid, hab da wohl was gelesen was du nicht geschroben hattest, der Kaffee war wohl noch nicht ganz durchgelaufen.



  • pumuckl schrieb:

    ... Äh - nee. Tut mir leid, hab da wohl was gelesen was du nicht geschroben hattest, der Kaffee war wohl noch nicht ganz durchgelaufen.

    💡 OK, danke für die Aufklärung,

    Simon2. 😋


Log in to reply