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

Каков риск безопасности отражения объекта?

Итак, после нескольких часов обходного ограничения ограничение отражения в настоящее время отключено в Google App Engine, мне было интересно, может ли кто-нибудь помочь мне понять, почему отражение объекта может представлять угрозу. Это потому, что я могу проверить частные переменные класса или какие-либо другие более глубокие причины?

4b9b3361

Ответ 1

1 - Отражение (как концепция) действительно ортогонально безопасности/безопасности.

В дизайне Java был сделан большой упор на создание безопасной платформы: статическая типизация, менеджер безопасности, дисциплинированное использование класса loader, и нет возможности вставлять указатели / память. Вы можете прочитать интервью Джеймса Гослинга в "Умениях программирования" , что интересно об этом.

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

Но возможны и более тонкие вещи. Например, загрузчики классов, которые можно рассматривать как отражающий крючок в системе, были неправильно разработаны в ранней версии Java, что привело к потенциальной замене типа. Статья Динамическая загрузка классов в JVM, от Gilad Bracha, проницательна по таким вопросам.

Отражение нельзя полностью отключить; всегда можно задуматься о своих собственных общественных полях/методах. Однако отражение в частных структурах с AccessibleObject.setAccessible может быть отключено, поскольку оно разбивает инкапсуляцию. Доступ к закрытым полям и т.д. Возможен осмотр и изменение внутренних данных. Это может привести к различным злоумышленникам, например.

  • strings больше не являются неизменяемыми и могут быть изменены (см. question)
  • вы можете выявить разумную информацию об объектах, которыми вы не владеете.
  • ... другие подвиги...

Наконец, есть другой механизм, который ставит под угрозу безопасность, особенно sun.misc.Unsafe, которая дает прямой доступ к указателям памяти.

2 - Теперь вопрос заключается в том, ведет ли размышление (на практике) к тому, что многие риски.

Я прочитал ссылку, указанную @dbyrne, но это в основном о .net. Также я точно не знаю, что отключено для приложения Google. Это только ReflectPermission или другое разрешение диспетчера безопасности? Одна опасность заключается в том, чтобы получить доступ к файловой системе и беспорядок.

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

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

В общедоступной/размещенной среде защита относительна. На уровне языка вы можете, например, не помешать модульной форме, потребляющей 100% процессора, или потребляющей всю память до OutOfMemoryException. Такие проблемы необходимо решать другими средствами, обычно на уровне ОС, с виртуализацией и квотами.

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

Ответ 2

Приложение может использовать API отражения Java для доступа и обновления полей и выполнять методы, которые запрещены нормальными правилами доступа/видимости Java. С некоторой изобретательностью этого достаточно:

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

При определенных обстоятельствах он может даже позволить впрыскивать вредоносный код.

Ответ 3

Прежде всего, если вы не установили SecurityManager, тогда вы все равно не защищены.

Во-вторых, отражение не открывает значительных отверстий, если setAccessible(), и что сам подлежит проверке безопасности (управляется setAccessChecks разрешение отражения). Без этого, хотя вы можете знать, что существует личное поле или метод (хотя для этого требуется accessDeclaredMembers разрешение времени выполнения), вы не можете ничего сделать с этими знаниями. Лучше всего атаковать может быть работа с сериализованными объектами, но это цельный "шарик воска".

Обратите внимание, что запись безопасного администратора безопасности и загрузчика классов является нетривиальной. Лучше оставить их другим, если вы не стремитесь к мега-гуру-дому (или, скорее, смущающим уровням неудач).

Ответ 4

GAE - это общедоступная среда размещения и содержит файлы WAR от нескольких пользователей. Очень вероятно, что несколько файлов WAR размещены в одной JVM, потому что нереста процесса на WAR просто смешно. Таким образом, единственный способ для песочницы каждого файла войны - использовать пользовательский загрузчик классов для каждого файла WAR.

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

Ответ 5

Моя теория - это то, что Google пытается что-то скрыть. Отключив Reflection Google может скрыть имена переменных, вызовы функций и даже полный API. Если Google скрывает что-то вроде API, то они точно не расскажут вам об этом.

Я знаю, что Reflection играет очень важную роль в тестировании безопасности. Например, вы можете автоматически генерировать тесты Fuzz с использованием отражения. AxMan использует TypeLib для идентификации всех классов и вызовов их методов, которые составляют COM-объект. Используя эту информацию, AxMan создаст экземпляр каждого класса и вызовет каждый метод с перестановками длинных строк и больших чисел. Аналогичное тестирование проводится SOAP Fuzzers с использованием файла WSDL для отражения.