2011-09-16 12 views
33

Jakie są opcje bezpiecznego uruchamiania uruchomionych (prawdopodobnie szkodliwych) skryptów użytkownika w węźle node.js? To znaczy. w środowisku, które uniemożliwia kod dostępu do poufnych danych i interfejsów API?Jak bezpiecznie uruchamiać skrypty użytkownika w piaskownicy node.js?

vm.runInNewContext(userScript, {}) to kuszący punkt wyjścia ... ale wygląda na to, że jest tam known issues.

Wygląda interesująco, ale używa runInNewContext(), więc jestem trochę nieufny.

+0

Polecam użycie 'vm', ponieważ jest to część rdzenia węzła. A ponieważ rdzeń węzła ma tendencję do naprawiania błędów, wystarczy założyć, że problem zostanie naprawiony. – Raynos

+0

@Raynos to nie jest błąd. Dokumenty mówią, że jest przeznaczony tylko dla dobrze znanego kodu. – thejh

+0

@thejh - prawda, ale API nadaje się do całkiem uzasadnionego przekonania, że ​​kod wykonuje się w całkowicie innym kontekście, co oznacza, że ​​wspomniany kod nie powinien mieć dostępu do bieżącego kontekstu. I spodziewam się, że * zamiar * interfejsu API jest dokładnie taki - aby zapewnić piaskownicę do uruchamiania skryptów. Więc ... sądzę, że można dość silnie stwierdzić, że jest to po prostu dobrze udokumentowany błąd. :) – broofa

Odpowiedz

29

Powinieneś zawsze uruchamiać niezaufany kod w oddzielnym procesie, który jest dokładnie tym, co robi moduł piaskownicy. Prostym powodem jest to, że zamrozi węzeł.

Rozpoczyna się od utworzenia osobnego procesu, który później wyśle ​​wynik serializowany do JSON na jego standardowym wyjściu. Proces nadrzędny kontynuuje wykonywanie niezależnie od tego, co robi dziecko i może wywołać limit czasu.

Niezaufany kod jest następnie zapakowany w zamknięcie z strict mode (w zwykłym kodzie JavaScript można użyć arguments.callee.caller, aby uzyskać dostęp do danych spoza zakresu). W końcu, bardzo ograniczony obiekt global jest przekazywany, aby uniemożliwić dostęp do API węzła. Niezaufany kod może wykonywać tylko podstawowe obliczenia i nie ma dostępu do plików ani gniazd.

Chociaż należy odczytać kod piaskownicy jako źródło inspiracji, nie polecam go używać jak:

  • Kod jest już stary i nie zostały zaktualizowane przez 7 miesięcy.
  • Moduł przetwarzania podrzędnego w węźle zawiera już większość potrzebnych funkcji, szczególnie child_process.fork().
  • Kanał IPC zapewniony przez child_process.fork prawdopodobnie ma lepszą wydajność.

Dla zwiększenia bezpieczeństwa można również rozważyć użycie setuid-sandbox. Jest to kod używany przez Google Chrome, aby uniemożliwić procesom kart uzyskanie dostępu do systemu plików. Będziesz musiał utworzyć moduł natywny, ale ten example wydaje się prosty.

+3

Metody w module 'vm' teraz obsługują parametr' timeout', który pozwala bezpiecznie wykonać 'while (true) {}'. Oczywiście nie rozwiązuje problemów związanych z bezpieczeństwem, ale dotyczy nieskończonych pętli. –

+0

@AndrewPaprocki Czy możesz linkować do dokumentów, w których wyświetlany jest limit czasu? –

+0

@RobFox to jest w wersji v0.11, http://nodejs.org/docs/v0.11.13/api/vm.html –

8

Istnieje a newer module on github called vm2, który rozwiązuje niektóre z tych problemów, szczególnie w aplikacjach Node.JS. Może to pomoże innym znaleźć to, co właśnie zrobiłem.

Powiązane problemy