2010-07-22 8 views
5

Ich möchte node.js (oder andere SSJS-Lösung) verwenden, meinen eigenen Code + extern geschriebenen Code innerhalb (nicht vertrauenswürdig) ausführen.Sichern von SSJS gegen nicht verifizierten Code

Jede Möglichkeit, meinen eigenen Code zu trennen und zu schützen? Könnte ich die Module und den Systemeffekt des nicht vertrauenswürdigen Codes begrenzen (den Zugriff auf Dateien beschränken, nicht HTTP-Ports usw.)?

+0

Wow Sie serverseitige js nicht sehr oft sehen. ; – rook

Antwort

1

Sie können dieses Projekt überprüfen, so scheint es sehr viel versprechend:

http://github.com/gf3/node-sandbox

Ich persönlich nicht Knoten verwenden willkürliche SSJS Ausführung zu tun. Sie werden wahrscheinlich nicht diese Lösung mögen, aber es hat gut für mich seit etwa einem Jahr funktioniert:

Es gibt eine Perl-Implementierung von Spidermonkey API (Spidermonkey ist Firefox JS-Engine) that's available. Ich habe das mit Hilfe von CGI angehängt. Sie können darin genau angeben, welche Funktionen Sie anzeigen möchten (gewährt, es ist in Perl ... blech) und führen Sie den Code aus, den Sie mögen. Es besteht keine Gefahr von Sicherheitslücken, da das gesamte Setup vollständig sandboxed ist. Es simuliert nicht das DOM.

Die Art und Weise, wie ich dies auf meinem Server implementierte (um Missbrauch zu verhindern), war die Ausgabe von Token, die einen einmaligen Zugriff durch eine REST-API auf einem anderen Server gewährleisteten. Es ist eine einfache HMAC-Implementierung, die einen Zeitstempel enthält, um die Legitimität des Tokens durchzusetzen. Wenn das Perl-Skript eine Anforderung empfängt, überprüft es das Token und verarbeitet das Skript (das Skript sollte nur Teil einer POST-Anfrage sein). Das Perl-Skript schreibt dann einfach die Ergebnisse. Mein Server ist so eingestellt, dass er eine Zeitüberschreitung von etwa 10 Sekunden verursacht.

Hoffe, das hilft!

+0

@Rook Eigentlich liegst du falsch. Es ist nicht einmal Verschlüsselung, es ist Authentifizierung. Es ist die gleiche Technik, die Amazon AWS verwendet. Technisch gesehen handelt es sich nicht um einen "Krypto-Zauberstab", sondern um ein legitimes Mittel, um eine nach vorne gerichtete REST-API abzusichern. Es spielt keine Rolle, was als HMAC-Geheimnis verwendet wird. Gehe auf irgendeinen zufälligen Textgenerator und verwende die ersten 30 Zeichen oder so, es spielt keine Rolle. Sie haben jedoch deutlich gemacht, dass Sie nicht viel über Sicherheit verstehen. – mattbasta

+0

@mattbasta Crypto ist die Abkürzung für Kryptographie und eine kryptographische Hash-Funktion wie sha256 fällt unter diese Kategorie. Sicher ist Sicherheit ein sehr tiefgründiges Thema und jeder hat mehr zu lernen. Kurz gesagt, ich mag diesen Ansatz zur Verwaltung einer Sicherheitsanfälligkeit bezüglich Remotecodeausführung nicht. Es gibt ein gutes Zitat "Wenn eval() die Antwort ist, dann stellen Sie die falsche Frage". Es gibt absolut keinen guten Grund dafür, dass jemand Code wie diesen ausführt. Es ist wahrscheinlich, dass das OP eine Abkürzung nimmt und er wird durch diese teilweise Antwort verbrannt werden. – rook

+0

@Rook Zum letzten Mal ist es keine Sicherheitslücke. Es gibt kein "eval", da der Code in einer Umgebung läuft, in der buchstäblich nichts zu brechen ist. Es gibt buchstäblich keine Möglichkeit, vertrauliche Informationen zu ändern, auf die Festplatte zuzugreifen oder ausgehende Anfragen zu stellen. Das ist die Idee hinter einer Sandbox: Offensichtlich ein Thema, das Ihr Sicherheitsprofessor überflogen haben muss. Sicher, das Ausführen von Code in einer 'eval'-Anweisung ist schlecht, aber wenn das OP den JS eines Benutzers ausführen möchte, dann ist es das sicherste und effektivste Mittel, dieses Ziel zu erreichen, wenn es in einer Sandbox-Umgebung ausgeführt wird. Benennen Sie eine Sicherheitsanfälligkeit, die von einer Sandbox offengelegt wird. – mattbasta

0

Werfen Sie einen Blick auf Caja. Es übersetzt Drittanbietercode in ein Formular, in dem der Code nur Zugriff auf die Objekte hat, die Sie explizit gewähren.

+0

Caja ist auch cool, du musst nur die Mühe machen, es zu beschwatzen und zu verstehen, was du machst (und Java brauchen, etc.) –

1

Schauen Sie sich diese von der node.js Dokumentation

script.runInNewContext ([Sandbox])

Ähnlich Script.runInNewContext (beachten Sie Kapital 'S'), aber jetzt ein Verfahren sein eines vorkompilierten Skriptobjekts. script.runInNewContext führt den Skriptcode mit Sandbox als globales Objekt aus und gibt das Ergebnis zurück. Der laufende Code hat keinen Zugriff auf den lokalen Bereich. Sandbox ist optional.

http://nodejs.org/api.html#script-runinnewcontext-105

+1

Sei vorsichtig, aus der aktuellen Dokumentation: Beachte, dass nicht vertrauenswürdiger Code läuft ein heikles Geschäft, das große Sorgfalt erfordert. Um einen versehentlichen globalen Variablenverlust zu verhindern, ist script.runInNewContext sehr nützlich **, aber das Ausführen von nicht vertrauenswürdigem Code erfordert einen separaten Prozess **. –

+0

Yup, aber es hängt wirklich davon ab, wie privilegiert der aktuelle Prozess ist. Dies bedeutet wahrscheinlich, dass Sie einen neuen Prozess mit geringeren Rechten erstellen, der mehr Rechte erfordert, um damit zu beginnen (d. H. Den Daemon als root zu starten). Also, ja, Sandboxing einer globalen Ausführung zu einem neuen Prozess ist gut, aber wenn Sie als nicht-privilegierter Benutzer ausgeführt werden, sind Sie wahrscheinlich in Ordnung. Es hängt auch davon ab, wie wichtig dies ist. Wenn es der Blog Ihrer Katze ist, sind Sie wahrscheinlich in Ordnung, was auch immer Sie tun. Wenn es eine transaktionale PCI-kompatible Site ist, wäre es ein bisschen diff. Nicht wirklich in Frage gestellt ... –

Verwandte Themen