Безопасность Nashorn / jjs: выполнение пользовательского скрипта на стороне сервера

#javascript #java #security #nashorn #jjs

#javascript #java #Безопасность #nashorn #jjs

Вопрос:

Я пишу приложение, в котором пользователь может предоставить пользовательскую функцию javascript для фильтрации файла на стороне сервера с использованием nashorn / jjs:

 cat /etc/js/library.js user.js > tmp.js amp;amp; 
cat /path/to/input.txt | jjs --language=es6 -doe -J-Djava.security.manager tmp.js > /path/to/output.txt amp;amp;
rm tmp.js
  

Я знаю, что пользователь мог бы написать бесконечный цикл, чтобы заполнить мой диск:

 for(;;) print("#####);
  

Но -J-Djava.security.manager достаточно ли этого, чтобы помешать ему прочитать / записать файл в файловой системе?

Спасибо.

Комментарии:

1. Вы нашли способ запретить пользователю писать бесконечный цикл?

Ответ №1:

Вы правы. Как только вы установите java security manager, ваши скрипты будут «изолированы». Если вы не напишете явную политику безопасности, в которой вы предоставляете конкретные разрешения определенным сценариям, скриптам будут предоставлены только разрешения изолированной среды. Вы можете безопасно запускать незащищенные скрипты. Чтобы предоставить определенные разрешения определенным скриптам, вам необходимо загрузить скрипт с доверенных URL-адресов и использовать эти URL-адреса в политике безопасности:

Смотрите также: https://wiki.openjdk.java.net/display/Nashorn/Nashorn script security permissions

Комментарии:

1. Спасибо, но разве не парадоксально, что jjs все еще может читать файл скрипта tmp.js ? (или защита активирована после чтения этого js-файла?)

2. Нет, самому коду jjs по умолчанию предоставляется AllPermission. Именно код jjs считывает начальный набор файлов, указанных в командной строке, и поэтому он является согласованным. Если ваш скрипт вызывает примитив «load» для загрузки дальнейших скриптов, права безопасности вашего скрипта (сценария загрузки) также вступят в действие.