При обновлении до Rails 6.1.6.1 я начал получать следующую ошибку в приложении:
Psych::DisallowedClass:
Tried to load unspecified class: Symbol
Это вызвано использованием сериализатора Hash
в столбце ActiveRecord, который использует символы в качестве ключей или значений:
serialize :parameters, Hash
Ошибка возникает из-за следующего обновления безопасности в 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]
Что позволяет сериализовать символы или другие неподдерживаемые (или небезопасные) типы данных.
Я должен был сделать config.active_record.use_yaml_unsafe_load = true
, чтобы это сработало
поэтому, если я использую этот: config.active_record.yaml_column_permitted_classes = [Symbol]
и добавлю кучу других классов, таких как Date
Time
HashWithIndifferentAccess
MyCustomClass
Это все еще большая дыра в безопасности или нет?
@ ryan2johnson9 Я точно не знаю, какие типы могут быть подвержены проблемам с RCE из-за внедрения SQL, но пока это поле не содержит пользовательский контент, все должно быть в порядке. В противном случае я бы точно перешел на JSON
спасибо @mrstif. Он содержит пользовательский контент. Но он очищается Rails::Html::SafeListSanitizer
перед сохранением в БД. вот думаю хорошо это или нет..
что, если я использую ActiveRecord без приложения rails?
На случай, если кто-то еще застрянет на этом, ни одно из двух исправлений, предложенных выше и в обновлении безопасности 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
Мне интересно, почему
ActiveSupport::TimeWithZone
не включен по умолчанию в список разрешенных классов. Не уверен, что это может быть небезопасно