Вопрос

Я хотел бы иметь возможность обнаружить проблемы с десериализацией в коде Java. Что я должен искать? Например, как бы определить, пытается ли какой-то код Java для эксплуатации »Java Calendar Bug.«Обратите внимание, что я не программист Java, но я понимаю концепции за сериализацией и OOP Fine. Я пытаюсь осуществить некоторые проверки безопасности (что-то вроде инструмента предупреждения компилятора).

РЕДАКТИРОВАТЬ: Основываясь на комментариях, я хотел бы немного изменить вопрос: я считаю, что все код проанализированы «ненадежным», есть ли способ оценить потенциальную опасность? Я имею в виду, я могу сказать, что код A более опасен, чем B с учетом ошибки десериализации? Что я должен искать?

Это было полезно?

Решение

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

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

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

Если вы пишете библиотечный код, который используется менее доверенным кодом, то все становится интереснее:

В случае «календарной ошибки» (и аналогичного), то есть о десериалии произвольного потока с вредоносными данными и вредоносным кодом. Руководящие принципы защищенного кодирования Java предлагают выполнять проверки безопасности (используя «модель безопасности Java2») в рамках пользовательских readObject Методы, которые подразумевают, что вы не должны вызывать десериализацию с большим количеством доверия, чем код и данные.

С точки зрения бесполезных объектов, все более сложно. Объекты, предоставляемые ObjectInputStream через readObject, readUnshared, defaultReadObject, readFields Или просто десериализация по умолчанию может иметь ссылки, захваченные вредоносным кодом или, для нефинантных классов, быть злонамеренно подклассам. Объект также может быть использован во время десериализации, когда частично инициализирован. Десериализация не вызывает «реальный» конструктор десериализованного класса (readObject/readObjectNoData это своего рода psuedo-конструктор, который не может установить finals). Это все немного кошмара, поэтому вы, вероятно, не хотите делать ваши чувствительные занятия сериалами.

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

Другие советы

Хм ... Ваш вопрос немного генерал. Вы взглянули на это статья? Это о алгоритме сериализации Java, но из кэша Google, потому что главная страница, кажется, в данный момент.

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

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

(Если бы простых способов найти неизвестные отверстия безопасности в Java, вы можете поспорить, что солнце и другие исследователи безопасности уже использовали их.)

Если вы сериализуете свой объект Java, чтобы перенести его в отделенное приложение, почему бы не рассмотреть возможность подписания объекта с помощью клавиши совместно между приложениями? Достаточно, чтобы защитить себя от атаки человека в среднем.

Возвращаясь к ядру проблемы проверки, проверка чрезвычайно трудна для языков общего назначения. Вы должны искать научные публикации по этой теме. Я думаю, что наиболее часто применяемая техника песочница. Отказ Второй подход - ограничить язык и запретить выполнение опасных команд, например, Библиотека Yahoo Caja использует эту технику.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top