理解 Ruby 项目中的不安全反序列化漏洞 - Blockchain.News

理解 Ruby 项目中的不安全反序列化漏洞

realtime news Jun 21, 2024 01:10

了解不安全反序列化漏洞如何允许攻击者在 Ruby 项目上执行命令以及如何检测和防止这些漏洞。

理解 Ruby 项目中的不安全反序列化漏洞

Ruby 项目中的不安全反序列化漏洞可以使攻击者通过发送 JSON 数据在远程服务器上执行任意命令。根据 GitHub 博客,这些漏洞的产生是因为反序列化过程允许实例化序列化数据中指定的任意类或类结构。

不安全反序列化的工作原理

在 Ruby 中,不安全反序列化漏洞通常通过支持多态的库被利用,如 Oj JSON 序列化库。攻击者可以将多个类结合在一起,在被攻击系统上执行代码。这些类被称为小工具,并组合成小工具链以形成更大的漏洞利用。

例如,当使用 Oj 库来反序列化 JSON 时,如果项目包含类似于以下内容的构造,可能会容易受到攻击:

data = Oj.load(untrusted_json)

默认情况下,Oj 库支持 JSON 中指定类的实例化,这可以通过使用 Oj.safe_load 来禁用。

为了演示其工作原理,考虑一个名为 SimpleClass 的类,其 hash 方法执行一个命令:

class SimpleClass
  def initialize(cmd)
    @cmd = cmd
  end

  def hash
    system(@cmd)
  end
end

用于实例化此类的 JSON 负载可能如下所示:

{
    "^o": "SimpleClass",
    "cmd": "open -a calculator"
}

使用 Oj.load 载入此 JSON 不会直接触发 hash 方法,但将类作为键放入一个哈希表中可以触发该方法:

Oj.load(json_payload)

这将执行在 @cmd 成员变量中指定的命令。

构建检测工具

为了检测不安全反序列化漏洞,可以构建一个检测工具链。例如,可以使用具有 hash 方法的 Gem::Requirement 类,该方法会对内部成员调用 to_s。通过创建合适的 JSON 有效负载,可以触发该链来检测漏洞。

检测工具还可以扩展为完整的远程代码执行 (RCE) 链。这涉及使用 Ruby 或其依赖项的一部分类和方法来执行任意命令。

防止不安全反序列化

为了防止这些漏洞,使用安全的反序列化方法至关重要。例如,使用 Oj.safe_load 而不是 Oj.load 可以防止实例化任意类。此外,像 CodeQL 这样的工具可以通过分析源代码中的漏洞模式来帮助检测不安全反序列化。

对于有源代码访问权限的开发人员,GitHub 的 CodeQL 代码扫描可以识别不安全反序列化的漏洞点。如果无法访问源代码,可以使用检测工具来远程识别漏洞。

理解不安全反序列化的工作原理并实施安全编码实践可以避免这些漏洞。有关更详细的示例和检测方法,请参阅 GitHub 博客中 原始博文

Image source: Shutterstock