У нас есть приложение Node в качестве внешнего интерфейса для инструмента песочницы C ++, который компилирует код с помощью gcc и выводит результат в браузер.
например
exec("gcc -o /tmp/test /tmp/test.cpp",
function (error, stdout, stderr) {
if(!stderr) {
execFile('/tmp/test', function(error, stdout, stderr) {});
}
}
);
Это прекрасно работает.
Однако, как вы понимаете, это кошмар для системы безопасности, если его обнародовать, поэтому я думал о двух вариантах защиты своего стека:
Итак, мой вопрос в том, как я могу защитить свой стек от любых неприятностей, которые могут исходить от:
A) Компиляция неизвестного кода с использованием gcc
Б) Выполнение скомпилированного кода
Это полностью зависит от того, сколько поставлено на карту и чем вы готовы пожертвовать ради этого.
Chroot jail, вероятно, будет предлагать только низкий уровень защиты и, в частности, оставит потенциальному злоумышленнику доступ к сети и всем вычислительным ресурсам вашего хост-компьютера, а также возможность повышения уровня локальных эксплойтов повышения привилегий (которые случайно обнаруживаются довольно часто во всех типах программных пакетов, даже в ядре Linux).
Решение MAC (SELinux, AppArmor, TOMOYO) обеспечит более тонкий уровень контроля, особенно включая доступ к сети, но MAC не так уж и надежны.
Другой уровень песочницы может включать в себя перехват всех системных вызовов - в значительной степени то, что вы видите с Seccomp. Но очевидно, что создание здесь полезного профиля потребовало бы огромных усилий.
Вы можете пойти еще дальше и выделить виртуальную машину или контейнер для каждого экземпляра выполняемого кода - именно здесь у вас, вероятно, будет самый высокий уровень контроля над использованием ресурсов и отделением от данных хоста - но это, вероятно, стать дорогим для чего угодно, кроме тривиального случая с горсткой пользователей.