GitHub Advisoryadvisory · RubyGems

GHSA-rrqh-93c8-j966 Ruby SAML DOS vulnerability with large SAML response

MEDIUM Published 2025-07-30 Modified 2025-11-03 Official page ↗
Aliases
CVE-2025-54572
Ecosystem
RubyGems
Packages
ruby-saml
Severity
Moderate
CVSS vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weaknesses
CWE-400, CWE-770
Reviewed
2025-07-30

Affected packages

• RubyGems ruby-saml: < 1.18.1 → fixed in 1.18.1

Description

Summary A denial-of-service vulnerability exists in ruby-saml even with the message_max_bytesize setting configured. The vulnerability occurs because the SAML response is validated for Base64 format prior to checking the message size, leading to potential resource exhaustion. Details `ruby-saml` includes a `message_max_bytesize` setting intended to prevent DOS attacks and decompression bombs. However, this protection is ineffective in some cases due to the order of operations in the code: https://github.com/SAML-Toolkits/ruby-saml/blob/fbbedc978300deb9355a8e505849666974ef2e67/lib/onelogin/ruby-saml/saml_message.rb ```ruby def decode_raw_saml(saml, settings = nil) return saml unless base64_encoded?(saml) # settings.message_max_bytesize raise ValidationError.new("Encoded SAML Message exceeds " + settings.message_max_bytesize.to_s + " bytes, so was rejected") end decoded = decode(saml) ... end ``` The vulnerability is in the execution order. Prior to checking bytesize the `base64_encoded?` function performs regex matching on the entire input string: ```ruby !!string.gsub(/[\r\n]|\\r|\\n|\s/, "").match(BASE64_FORMAT) ``` Impact _What kind of vulnerability is it? Who is impacted?_ When successfully exploited, this vulnerability can lead to: • Excessive memory consumption • High CPU utilization • Application slowdown or unresponsiveness • Complete application crash in severe cases • Potential denial of service for legitimate users All applications using `ruby-saml` with SAML configured and enabled are vulnerable. Potential Solution Reorder the validation steps to ensure max bytesize is checked first ```ruby def decode_raw_saml(saml, settings = nil) settings = OneLogin::RubySaml::Settings.new if settings.nil? if saml.bytesize > settings.message_max_bytesize raise ValidationError.new("Encoded SAML Message exceeds " + settings.message_max_bytesize.to_s + " bytes, so was rejected") end return saml unless base64_encoded?(saml) decoded = decode(saml) ... end ```

Related

Alias · CVE (1)

  • CVE-2025-54572 The Ruby SAML library is for implementing the client side of a SAML authorization. vulnerability

Weakness · CWE (2)

  • CWE-400 Uncontrolled Resource Consumption weakness
  • CWE-770 Allocation of Resources Without Limits or Throttling weakness

References