2013-12-25 2 views
2

Если есть система, в которой клиент записывает Java-код (* .java-файлы) и отправляет их на сервер, работающий на Java, как я могу сделать переданный код ненужными и вредоносными?Песочница Java-код перед компиляцией?

Для получения дополнительной информации: клиент будет писать текстовый Java-код (их классы), и код будет отправлен на сервер. На сервере код будет проверен, чтобы убедиться, что он разрешает действия. Если он проходит тест, он скомпилируется в файл .class, где затем загружается загрузчиком классов Java. Наконец, используя Reflection, методы затем можно вызывать и передавать параметры.

Я думаю, что могу видеть, как это сделать, но как я могу убедиться, что код, который скомпилирован, «безопасен»? Например, я бы не хотел, чтобы он порождал потоки или выполнял файл IO или взаимодействовал с системой, в которой он работает. Я думал, что могу сканировать входной файл для импорта, а если он не в белом списке, отбросьте файл. Кроме того, я думал, что если бы я хотел что-то ограничить, например, количество потоков, я мог бы позволить импортировать прокси-класс, который будет отслеживать потоки для каждого пользователя.

Будет ли это работать, или если нет пути?

+2

Это может быть полезно для вас. http://stackoverflow.com/questions/502218/sandbox-against-malicious-code-in-a-java-application?rq=1 – Syd

+0

Посмотрите на менеджера Securiy –

+0

@Syd Спасибо за это. Я посмотрел вокруг с Google и на SO, но любая комбинация Java и плагина, который я использовал, как будто давала мне результаты о плагинах веб-браузера. Еще раз спасибо. – contrapsych

ответ

1

Java имеет некоторые механизмы песочниц, но те имеют такую ​​плохую репутацию безопасности, что многие рекомендуют отключать Java в браузере полностью.

Вы можете попробовать изолировать виртуальную машину VM в своей виртуальной ОС с ограниченными привилегиями.

В качестве альтернативы вы можете потребовать, чтобы код запускался на языке, таком как Joe-E, который предназначен для того, чтобы позволить программам Java выполнять ненадежный код.

Джо-E является подмножеством Java, что облегчает архитектор и осуществлять программы с сильными свойствами безопасности, которые могут быть проверены в ходе проверки безопасности. Это позволяет программистам применять принцип наименьших привилегий к своим программам; применять контрольные мониторы для конкретных приложений, которые нельзя обойти; внедрение и использование абстракций безопасности домена; безопасно выполнять и взаимодействовать с ненадежным кодом; и создавать безопасные, расширяемые системы. Joe-E демонстрирует, как можно достичь сильных свойств безопасности языка объектов, сохраняя при этом функции и ощущения основного объектно-ориентированного языка.

Степень, в которой дизайнеры Джо-E пришлось отойти от стандартного Java должен дать вам представление о том, насколько велика задаче это предотвратить ненадежный код Java от злоупотребления ambient authority доступного изнутри виртуальной машины Java.


Хотя некоторые из этих подходов могут защитить вас от злоупотребления власти (особенно, если слоистый вместе), никто не помешает denial of service. Если вы пытаетесь запустить код других людей вместе с кодом, и он решает попытаться взять весь процессор и никогда не вернуть его, ваш единственный вариант - это часто убивать весь процесс.

+0

Может ли Joe-E быть включен в программу Java и вызван и снабжен кодом для проверки? Или он может использоваться только в затмении? Кроме того, хорошо ли он работает с Java 7, поскольку он говорит, что в настоящее время он предназначен для Java 6? Благодарю. – contrapsych

+0

Поскольку он проверяет исходный код вместо байтового кода, я считаю, что изменения в байт-коде Java 7 не повлияют на него, хотя он, вероятно, не распознает новые синтаксические конструкции, такие как '<>'. Java 7 вводит новые API, и поскольку API-интерфейсы Joe-E «приручают», эти изменения не повлияют на безопасность, но эти новые API не будут доступны для ненадежного кода. Re Eclipse, я считаю, что это можно запустить программно. Вы должны спросить об этом в электронном списке. –

2

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

http://securesoftwaredev.com/2012/11/12/sandboxing-java-code/

Резюмируя

  • По умолчанию Java работает без SecurityManager, так что вы должны добавить код в приложение, чтобы включить один:

    System.setSecurityManager(new SecurityManager()); 
    
  • A представляет собой доступ к системе re источник.

  • Используйте код подписания

Чтобы собрать части в песочнице:

  1. Установите SecurityManager
  2. Подпишите заявление банки
  3. Grant весь код, подписанный нами AllPermission
  4. Добавить проверки разрешений в местах, где Код может позвонить
  5. Выполните код после проверки прав доступа в doPrivileged() блоке
+0

Из прочтения документации Security Manager, похоже, что она работает только в потоке, который вызывает функцию (которую я считаю хорошим). Означает ли это, что использование диспетчера безопасности не повлияет на остальную часть системы, которая не имеет никакого отношения к тому, что я пытаюсь сделать? – contrapsych

+0

@ JAKE6459, [«Сравнение безопасности Java и .NET»] (http://web.eecs.utk.edu/~pauln/papers/computers_and_security-net-java.pdf) отображает частоту эксплойтов против SecurityManager. Многие предлагают отключить Java в браузерах, потому что SecurityManager не успешно защитил браузер от Java-кода, поэтому SecurityManager Java широко считается сбоем. –

+0

Насколько я понимаю, менеджер безопасности может быть как для JVM, так и для всех JVM. Так как @Mike предлагает, запуск этого кода в JVM в собственной VM может быть осмотрительным. Майк также продолжает упоминать браузер, но я не уверен в вашем оригинальном вопросе, действительно ли это будет работать в браузере? –

0

Онлайн судьи делают это. Некоторые из них с открытым исходным кодом. Посмотрите, можете ли вы использовать любой из них или код, который был разработан. Googling, this product является открытым исходным кодом и говорит, что бэкэнд находится в bash, что может помочь вам с безопасностью OS-интерфейса.

This judge выглядит как какой-то случайный проект, который может или не может работать или осуществлять безопасность, но это Java. Держите гуглинг.

1

Белый список - это вариант. с черным списком злоумышленники найдут что-то злонамеренное, которое не является черным.

SecurityManager делает то же самое, указав разрешения. Это путь.

сканирования кода может достичь того же на другом уровне, но вы будете изобретать колесо (SecurityManager)

+0

На самом деле SecurityManager отображается только в разрешениях белого списка. Под капотом каждая функция, которая делает что-то опасное, должна будет проверить, что у вызывающего есть правильное разрешение.Это, как известно, несколько раз терпело неудачу. – user1657170

0

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

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

Другая проблема с этим подходом заключается в том, что проверка нарушений безопасности в каждом вызове API довольно дорогостоящая. В прошлом у Java были другие проблемы с производительностью, которые сделали этот довольно низкий приоритет. Например, стоимость вызова JNI, как правило, такая дорогостоящая, что ее упаковка в код безопасности, вероятно, очень мало для снижения производительности. Но современные JVM: s настолько быстры, что это, вероятно, становится одним из оставшихся узких мест в мэре.

Я не знаю, как .NET реализует песочницу в современных версиях. Но я знаю, как это делает Mono и Native Client. Вместо использования песочницы в рамках кода рамки они используют проверку кода перед выполнением.Затем они могут создать класс, который использует только безопасный API: s перед ним: s передается JIT. Это, конечно, небольшая задержка для загрузки классов, но в конечном итоге более безопасна, чем модель безопасности Java, и в качестве бонуса есть выигрыш в производительности, который теперь запускает безопасный класс без какой-либо песочницы.

Есть Java библиотеки, которые могут быть использованы для реализации что-то подобное в Java, такие ASM и BCEL

Единственная попытка я могу найти использовать анализ кода в безопасности Java являются Mobile Code Security Through Java Byte-Code Modification, которая использует BECL для этого.

Смежные вопросы