Запустите C ++ в ВМ, Безопасно - PullRequest
2 голосов
/ 27 января 2011

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

  • Запуск кода на виртуальной машине, на 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
    

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

Ответы [ 4 ]

9 голосов
/ 27 января 2011

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

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

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

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

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

0 голосов
/ 27 января 2011
0 голосов
/ 27 января 2011

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

Поскольку вы упомянули GNU, я предположу систему Linux.Затем вы захотите виртуальную машину SELinux.Все, что вы добавляете в ВМ, может быть скомпрометировано, поэтому пропустите это.Вероятно, нет необходимости устанавливать X-сервер и так далее.

0 голосов
/ 27 января 2011

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

...