Обновление до Rails 6.1.6.1 приводит к тому, что Psych::DisallowedClass: Пытался загрузить неуказанный класс: Symbol

При обновлении до Rails 6.1.6.1 я начал получать следующую ошибку в приложении:

Psych::DisallowedClass:
        Tried to load unspecified class: Symbol

Это вызвано использованием сериализатора Hash в столбце ActiveRecord, который использует символы в качестве ключей или значений:

serialize :parameters, Hash
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
2 291
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ошибка возникает из-за следующего обновления безопасности в Rails: https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017

Сериализатор Hash, по-видимому, загружал данные с помощью YAML.unsafe_load, который теперь изменился на YAML.safe_load. Этот новый метод по умолчанию не обрабатывает такие типы данных, как Symbol или Time, из соображений безопасности.

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

Однако есть два настраиваемых быстрых обходных пути:

config.active_record.use_yaml_unsafe_load

Это не рекомендуется, так как в основном возвращается к старому поведению.

ИЛИ ЖЕ

config.active_record.yaml_column_permitted_classes = [Symbol]

Что позволяет сериализовать символы или другие неподдерживаемые (или небезопасные) типы данных.

Мне интересно, почему ActiveSupport::TimeWithZone не включен по умолчанию в список разрешенных классов. Не уверен, что это может быть небезопасно

Nikita Fedyashev 16.07.2022 00:17

Я должен был сделать config.active_record.use_yaml_unsafe_load = true, чтобы это сработало

ryan2johnson9 19.07.2022 06:25

поэтому, если я использую этот: config.active_record.yaml_column_permitted_classes = [Symbol] и добавлю кучу других классов, таких как DateTimeHashWithIndifferentAccessMyCustomClass Это все еще большая дыра в безопасности или нет?

ryan2johnson9 19.07.2022 07:51

@ ryan2johnson9 Я точно не знаю, какие типы могут быть подвержены проблемам с RCE из-за внедрения SQL, но пока это поле не содержит пользовательский контент, все должно быть в порядке. В противном случае я бы точно перешел на JSON

mrstif 19.07.2022 14:01

спасибо @mrstif. Он содержит пользовательский контент. Но он очищается Rails::Html::SafeListSanitizer перед сохранением в БД. вот думаю хорошо это или нет..

ryan2johnson9 20.07.2022 04:57

что, если я использую ActiveRecord без приложения rails?

Mathieu J. 16.08.2022 12:22

На случай, если кто-то еще застрянет на этом, ни одно из двух исправлений, предложенных выше и в обновлении безопасности Rails, не сработало для меня на Rails 5.2.8.1, у меня продолжалась одна и та же ошибка (Tried to load unspecified class: Symbol), несмотря на то, что я разрешил ее с config.active_record.yaml_column_permitted_classes = [Symbol] в application.rb. В конце концов мне пришлось настроить параметр unsafe_load в соответствии с первым комментарием @ryan2johnson9, чтобы он работал:

config.active_record.use_yaml_unsafe_load = true

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