Jak bezpiecznie uruchamiać skrypty przesłane przez użytkownika w węźle.piaskownica js?

Jakie są opcje uruchamiania (prawdopodobnie złośliwych) skryptów przesyłanych przez użytkowników w węźle.js, bezpiecznie? Czyli w środowisku, które uniemożliwia kodowi dostęp do poufnych danych i interfejsów API?

vm.runInNewContext(userScript, {}) to kuszący punkt wyjścia... ale wydaje się, że istnieją Znane problemy tam.

Moduł piaskownicy wygląda ciekawie, ale używa również runInNewContext(), więc jestem trochę nieufny.

Author: broofa, 2011-09-16

2 answers

Należy zawsze uruchamiać niezaufany kod w osobnym procesie, co dokładnie robi moduł piaskownicy. Prosty powód jest taki, że vm.runInNewContext('while(true){}', {}) zamrozi węzeł.

Zaczyna się od wywołania oddzielnego procesu, który później wyśle wynik serializowany do JSON na jego stdout. Proces rodzic kontynuuje wykonywanie bez względu na to, co robi dziecko i może wywołać limit czasu.

Niezaufany kod jest następnie zawijany w Zamknięcie z strict mode (w zwykłym JavaScript, można możesz użyć arguments.callee.caller, Aby uzyskać dostęp do danych spoza twojego zakresu). Na koniec przekazywany jest bardzo ograniczony obiekt global, 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ż powinieneś przeczytać kod sandboxa jako inspirację, nie polecam używać go tak, jak jest:

  • kod starzeje się i nie jest aktualizowany od 7 miesięcy.
  • Moduł procesów potomnych w węźle zapewnia już większość funkcji, których potrzebujesz, szczególnie child_process.fork () .
  • kanał IPC dostarczany przez child_process.widelec ma chyba lepsze osiągi.

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 dostęp do systemu plików. Trzeba by stworzyć natywny moduł, ale ten przykład wydaje się prosty.

 35
Author: Laurent Perrin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-03 13:03:13

Istnieje nowszy moduł na GitHubie o nazwie vm2, który rozwiązuje niektóre z tych problemów, szczególnie w Node.Aplikacje JS. Może to pomoże innym go znaleźć, tak jak ja właśnie to zrobiłem.

 14
Author: Alan Mimms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 19:27:10