使用 YAML.load_file 时升级到 Ruby 3.1 会导致 Psych::DisallowedClass 异常

Obr*_*ios 54 ruby yaml activesupport

升级到 ruby​​ 3.1 时,我在使用时看到以下排序错误消息YAML.load_file some_file_name

 Psych::DisallowedClass:
   Tried to load unspecified class: Matrix
Run Code Online (Sandbox Code Playgroud)

其他加载语句会导致类似的错误,但引用不同的未指定类,例如 OpenStruct。看来最新版本的 YAML 只加载允许的白名单中的类,因此需要使用 allowed_class 关键字来允许其他类。我努力了

hsh = YAML.load_file some_file_name, permitted_classes: [Matrix, OpenStruct]
Run Code Online (Sandbox Code Playgroud)

但这给出了错误

 Psych::DisallowedClass:
   Tried to load unspecified class: Symbol
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

spi*_*ann 50

Symbol在 Ruby 中加载 YAML 时,默认情况下也是不允许的。因此,在读取 YAML 文件时,您还需要在您的情况下添加Symbolpermitted_classes

hash = YAML.load_file(
  some_file_name, 
  permitted_classes: [Matrix, OpenStruct, Symbol]
)
Run Code Online (Sandbox Code Playgroud)

permitted_classes请参阅Psych(Ruby 使用的 YAML 解析器)中的默认列表。

或者,在 Ruby on Rails 中使用时,您可以在config/application.rbRuby on Rails 应用程序读取 YAML 文件时允许哪些类作为允许的类进行全局配置:

config.active_record.yaml_column_permitted_classes += [Matrix, OpenStruct, Symbol]
Run Code Online (Sandbox Code Playgroud)

请注意,Ruby on Rails 中的内部 YAML 解析Symbol已经是active_record.yaml_column_permitted_classes.


Moh*_*ami 41

工作解决方案是将这一行添加到 config/application.rb

config.active_record.yaml_column_permitted_classes = [ActiveSupport::HashWithIndifferentAccess]
Run Code Online (Sandbox Code Playgroud)

您可以对任何类名执行相同的操作,例如

config.active_record.yaml_column_permitted_classes = [Symbol, Hash, Array, ActiveSupport::HashWithIndifferentAccess]
Run Code Online (Sandbox Code Playgroud)


小智 19

在 Rails 6.1 升级上有这个。如果您没有其他选择,也许这个解决方法会给您带来一些时间(application.rb):

config.active_record.use_yaml_unsafe_load = true
Run Code Online (Sandbox Code Playgroud)

  • 解释此更改的完整详细信息(包括其他解决方法)位于:https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record /81017 (2认同)