2011-01-26 2 views
2

Итак, я делаю онлайн-приложение, в котором пользователь может отправить код, и результат будет показан пользователю. Я сделал Security главного приоритета и принял следующие шаги, чтобы убедиться, что код работает надежно:Запуск C++ в VM, безопасно

  • Выполнение кода на виртуальной машине, На VPS, что только использование для запуска этой ВМ. Эти виртуальные машины не позволяют подключиться к сети или файлам через рабочий каталог.
  • Используя следующие G ++ флаги:

    -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch 
    

Мой вопрос я думаю, на самом деле, как я могу сделать это любой более безопасным? Вы лично видите какие-либо проблемы с этим подходом?

+1

Там действительно нет смысла в предотвращении C++ 03. C++ 0x * возможно *, поскольку стандартная библиотека включает потоки, но в C++ 03 нет ничего плохого. – Puppy

ответ

9

Флаги компилятора не имеют большого значения. Программа C++ с этими флагами может выполнять те же действия, что и программа на C++, скомпилированная с любым другим набором флагов. В частности, существуют десятки способов снять неопределенное поведение и да, потенциально используя любые уязвимости безопасности, которые могут существовать в ОС.

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

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

Но это по-прежнему недоверенный код, и он может делать все, что может сделать ненадежный код. Лучшее, что вы можете сделать, это убедиться, что оно работает с минимальными привилегиями и что программное обеспечение ОС и виртуализации исправлено на 100%.

Конечно, с ограничениями, которые вы упомянули, мой первый вопрос: «есть ли что-нибудь, что помешает мне заполнить жесткий диск хламом?» Итак, я не могу писать за пределами рабочего каталога, но я все еще могу сделать диск исчерпанным. Или существует ли дисковая квота или что-либо принудительное? Как насчет ограничения количества процессорного времени, которое я использую? Смогу ли я использовать все ресурсы на машине, чтобы она не реагировала?

+0

+1 за хороший совет. –

+0

Единственный правильный ответ. Удивительно, но эта концепция, похоже, теряется на множестве людей, которые сообщают о проблемах безопасности. [Неудивительно, что вы можете запустить код] (http: //blogs.msdn.com/b/oldnewthing/archive/2010/12/08/10101773.aspx);) –

+0

В более общем плане я считаю, что помимо эксплойтов следует рассматривать любую форму отказа в обслуживании. Это также включает память, кстати :) –

0

Если вы используете Linux для запуска кода вы могли бы повысить безопасность вашей ВМ, пересматривая некоторые потенциально опасные функции, такие как: open(...), fopen(...), socket(...), и так далее, используя LD_PRELOAD.

+1

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

+0

Да, это возможно. Но я сказал, что это просто улучшит безопасность, а не сделает ее полной гарантией. И он сможет контролировать, будет ли кто-нибудь пытаться использовать определенные функции и блокировать учетные записи. – Elalfer

+0

Это пример метода, называемого «защита по глубине». Он предназначен для ограничения ущерба и всегда должен сочетаться с методами предотвращения повреждений. Использование броской ВМ является такой профилактикой (ее потеря ожидается, а не ущерб) – MSalters

0

AnВы можете использовать защиту на уровне пользователя. Вы используете собственный код, что означает, что ваш код может делать все, что может сделать пользователь. Таким образом, ограничьте то, что пользователь может сделать. Добавьте ограничение «отсутствие сети, без доступа к файлу за пределами рабочего каталога» и ограничения пользователей. Конечно, вы все равно сохраните правило виртуальной машины, но вы предпочтете поймать это раньше.

Поскольку вы упомянули GNU, я возьму систему linux. Тогда вам понадобится SELinux VM. Все, что вы добавляете в VM, может быть скомпрометировано, поэтому пропустите его. Вероятно, нет необходимости устанавливать X-сервер и т. Д.