Насколько безопасно использовать execFile для сценариев Bash?

У меня есть приложение node.js, которое использует команду child_process.execFile для запуска утилиты командной строки.

Я беспокоюсь, что пользователь сможет запускать команды локально (на ум приходит rm / -rf ужасный сценарий).

Насколько безопасно использовать execFile для сценариев Bash? Любые советы, чтобы убедиться, что флаги, которые я передаю в execFile, экранируются блоком unix, на котором размещен сервер?

Редактировать

Чтобы быть более точным, мне больше интересно, могут ли аргументы, отправляемые в файл, интерпретироваться как команда и выполняться.

Другая проблема связана с самим сценарием bash, что технически выходит за рамки этого вопроса.


person AlbertEngelB    schedule 01.03.2013    source источник
comment
Конечно, это возможно, контролируйте безопасность с помощью разрешений. Это настолько безопасно, насколько вы это сделаете.   -  person Chad    schedule 02.03.2013
comment
Я просто добавлю это в качестве комментария, но я бы посоветовал никогда не использовать пользовательский ввод для чего-то подобного. Если число опций ограничено, возьмите входные данные, а затем выберите флаг для вставки в команду, но не вводите данные пользователей напрямую в команду.   -  person travis    schedule 02.03.2013
comment
что вы подразумеваете под флагами, которые я передаю в execFile, экранируются блоком unix, на котором размещен сервер?   -  person Pascal Belloncle    schedule 02.03.2013
comment
Единственные аргументы, которые я ввожу в команду, — это имена файлов с полными путями ( __dirname + '/' + filename ). Имена файлов задаются через случайный UUID. Таким образом, технически пользовательский ввод или данные не используются в командной строке.   -  person AlbertEngelB    schedule 02.03.2013
comment
Фактически исполняемый файл статически устанавливается в коде, я просто не знал, можно ли экранировать флаги, передаваемые в скрипт.   -  person AlbertEngelB    schedule 02.03.2013


Ответы (2)


Использование child_process.execFile само по себе совершенно безопасно, пока пользователь не может указать имя команды.

Он не запускает команду в оболочке (как это делает child_process.exec), поэтому нет необходимости ничего экранировать.

person that other guy    schedule 01.03.2013
comment
Ааа, так что запущенная команда будет интерпретировать аргументы, отправленные из кода сервера узла, как фактические аргументы. Тогда действительно безопасность находится в руках самого скрипта и команд, которые он выполняет. - person AlbertEngelB; 02.03.2013
comment
Верно. Главное, на что следует обратить внимание в самом скрипте, — это внедрение кода в sed, awk или find, а также на то, чтобы вы обрабатывали (или игнорировали) аргументы с помощью пробелов и переводов строк. - person that other guy; 02.03.2013
comment
Отлично, это именно то, о чем я беспокоился. Я думаю, что лучший способ позаботиться об этом (для меня) — удалить все пробелы и новые строки в аргументах, передаваемых в сценарий Bash. Я могу сделать это непосредственно перед добавлением __dirname в строку, просто чтобы убедиться, что если в абсолютном пути есть пробел, проблем не возникнет. Еще раз спасибо, жаль, что я не мог проголосовать дважды! - person AlbertEngelB; 02.03.2013

child_process.execFile будет выполнять команды с идентификатором пользователя процесса узла, поэтому он может делать все, что может делать пользователь, включая удаление всех файлов сервера.

Не рекомендуется позволять пользователю передавать команду, как вы, кажется, подразумеваете своим вопросом.

Вы можете запустить сценарий в песочнице, используя chroot, и ограничить команды и то, что находится в доступной файловой системе, но это может быть завершено в спешке.

Команда, которую вы передаете, будет выполняться напрямую через какой-либо вариант exec, поэтому, если вы пытаетесь выполнить не сценарий, его не нужно каким-либо образом экранировать.

person Pascal Belloncle    schedule 01.03.2013
comment
Я не разрешаю пользователю устанавливать, какой файл выполняется. Меня больше беспокоит, что аргументы, передаваемые в команду, могут быть интерпретированы как команда. - person AlbertEngelB; 02.03.2013
comment
Я бы тогда так не волновался. Использование абсолютного пути для команды также гарантирует, что вы знаете, что выполняется. - person Pascal Belloncle; 02.03.2013
comment
Вам не нужно ничего экранировать, если вы выполняете скрипт. - person that other guy; 02.03.2013