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.
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.
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.
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