Подтвердить что ты не робот

Как запустить ненадежный код serveride?

Я пытаюсь запустить ненадежный код javascript в linux + node.js с модулем песочницы, но он сломан, все, что мне нужно, это позволить пользователям писать javascript-программы, которые распечатывают некоторый текст. Никаких других операций ввода-вывода не допускается, и должен использоваться только один javascript, никаких других модулей node. Если это действительно невозможно сделать, какой другой язык вы предлагаете для такого рода задач? Минимальный набор функций, который мне нужен, - это математика, регулярные выражения, строковые манипуляции и основные функции JSON. Скрипты будут работать, пусть говорят 5 секунд, а затем процесс будет убит, как я могу это достичь?

4b9b3361

Ответ 1

Недавно я создал библиотеку для песочницы ненадежного кода, она, похоже, соответствует требованиям (выполняет код в ограниченном процессе в случае Node.js, а в Worker внутри изолированного iframe для веб-сайта -browser):

https://github.com/asvd/jailed

Есть возможность экспортировать заданный набор методов из основного приложения в песочницу, таким образом предоставляя любой пользовательский API и набор привилегий (эта функция была на самом деле причиной того, почему я решил создать библиотеку с нуля). Указанные математические, регулярные выражения и связанные с строкой материалы предоставляются самим JavaScript, все, что может быть явно экспортировано извне (например, некоторая функция для связи с основным приложением).

Ответ 2

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

Сначала замените deny require() или замените его на что-то контролируемое. не забывайте о процессе и "глобальном" a.k.a "root", сложная вещь - ничего не забыть, вот почему его хорошо полагаться на кого-то, кто построил песочницу; -)

Ответ 3

Задайте себе следующие вопросы:

  • Вы один из самых умных людей на планете?
  • Вы обычно отказываетесь от предложений по работе с Google, Mozilla и "Лабораторией Касперского", потому что это вас утомляло?
  • Существует ли "ненадежный код" от людей, работающих в той же компании, что и вы, или от преступников и скучных компьютерных детей по всему миру?
  • Вы уверены, что node.js не имеет отверстий для защиты, которые могут протекать через вашу песочницу?
  • Можете ли вы написать идеальный 100% -ный код ошибки?
  • Вы знаете все о JavaScript?

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

Тем не менее, простые песочницы довольно легко сделать. Во-первых, вам нужно написать свой собственный интерпретатор JavaScript, потому что вы не можете использовать один из node.js из-за eval() и require() (оба разрешат взломщикам сбежать из вашей песочницы).

Интерпретатор должен убедиться, что интерпретируемый код не может получить доступ к чему-либо, кроме нескольких глобальных символов, которые вы предоставляете. Это означает, что, например, не может быть функция eval() (или вы должны убедиться, что эта функция оценивается только в контексте вашего собственного интерпретатора JavaScript).

Недостаток этого подхода: много работы, и если вы ошибаетесь в своем интерпретаторе, крекеры могут оставить песочницу.

Другой подход - очистить код и запустить его с помощью node.js eval(). Вы можете очистить существующий код, запустив кучу регулярного выражения, например /eval\s*[(]//g, чтобы удалить части вредоносного кода.

Недостаток этого подхода: легко сделать ошибку, которая оставит вас уязвимыми для атаки. Например, может быть несоответствие между тем, что regexp и что node.js считают "пробелом". Некоторые неясные пробелы в unicode могут быть приняты интерпретатором, но не с помощью регулярного выражения, которое позволило бы злоумышленнику запустить eval().

Мое предложение: напишите небольшой демонстрационный пример, который показывает, как сломанный модуль сломан и исправлен. Это сэкономит вам много времени и усилий, и если в песочнице будет ошибка, это не будет вашей ошибкой (ну, не совсем так).

Ответ 4

Если вы можете позволить себе поразить производительность, вы можете запустить JS в альтернативной виртуальной машине с соответствующими ограничениями на процессор и память.

Конечно, тогда вы доверяете безопасности решения VM. Используя его вместе с обычной песочницей JS, у вас будет два уровня безопасности.

Для дополнительного слоя поместите песочницу на другую физическую машину, нежели основное приложение.

Ответ 5

Docker.io Является удивительным новым ребенком на блоке, который использует LXC и CGroups для создания песочниц.

Вот одна из реализаций онлайн-версия (аналогично codepad.org), используя Docker и Перейти Lang

Это просто показывает, что можно безопасно запустить ненадежный код, написанный на многих языках программирования внутри Docker Containers, включая node.js

Ответ 6

Я столкнулся с аналогичной проблемой прямо сейчас, и я читаю только плохие вещи о модуле sandbox.

Если вам не нужна какая-либо особенность для среды node, я считаю, что лучшим вариантом будет использование безгласного браузера, такого как PhantomJS или Chimera, для использования в качестве среды песочницы.

Ответ 7

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

Попытка реализовать подобный прецедент. После прохождения веб-ресурсов https://www.npmjs.com/package/vm2, похоже, довольно хорошо обрабатывает среду песочницы (nodejs).

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