Skip to content

Commit bd265fc

Browse files
authored
Merge commit from fork
Check message bytesize before Base64 validation
2 parents 6410b28 + f0d7941 commit bd265fc

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/onelogin/ruby-saml/saml_message.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,13 @@ def valid_saml?(document, soft = true, check_malformed_doc = true)
8484
# @return [String] The plain SAML Message
8585
#
8686
def decode_raw_saml(saml, settings = nil)
87-
return saml unless base64_encoded?(saml)
88-
8987
settings = OneLogin::RubySaml::Settings.new if settings.nil?
9088
if saml.bytesize > settings.message_max_bytesize
9189
raise ValidationError.new("Encoded SAML Message exceeds " + settings.message_max_bytesize.to_s + " bytes, so was rejected")
9290
end
9391

92+
return saml unless base64_encoded?(saml)
93+
9494
decoded = decode(saml)
9595
begin
9696
message = inflate(decoded)

test/saml_message_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,18 @@ class RubySamlTest < Minitest::Test
8282
end
8383
end
8484
end
85+
86+
describe "Prevent DOS attack via base64_encoded? validation" do
87+
let(:large_saml_message) { "A" * (OneLogin::RubySaml::Settings::DEFAULTS[:message_max_bytesize] + 100) }
88+
89+
it "rejects oversized payloads before attempting Base64 validation" do
90+
assert_raises(OneLogin::RubySaml::ValidationError, "Encoded SAML Message exceeds #{OneLogin::RubySaml::Settings::DEFAULTS[:message_max_bytesize]} bytes, so was rejected") do
91+
saml_message = OneLogin::RubySaml::SamlMessage.new
92+
saml_message.expects(:base64_encoded?).never
93+
94+
saml_message.send(:decode_raw_saml, large_saml_message)
95+
end
96+
end
97+
end
8598
end
8699
end

0 commit comments

Comments
 (0)