Skip to content

Commit ee2c59e

Browse files
byrootjhawthorn
authored andcommitted
NumberConverter: reject scientific notation
BigDecimal support scientific notation, which allow expressing extremly large numbers with just a few bytes of input. This could be exploited to DOS a service if somehow user input is passed to number converter. [CVE-2026-33176] [GHSA-2j26-frm8-cmj9]
1 parent d7da4ef commit ee2c59e

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

activesupport/lib/active_support/number_helper/number_converter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def valid_bigdecimal
180180
when Float, Rational
181181
number.to_d(0)
182182
when String
183-
BigDecimal(number, exception: false)
183+
BigDecimal(number, exception: false) unless number.to_s.match?(/[de]/i)
184184
else
185185
number.to_d rescue nil
186186
end

activesupport/test/number_helper_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,18 @@ def test_number_helpers_should_return_non_numeric_param_unchanged
456456
assert_equal "x", number_helper.number_to_human("x")
457457
end
458458
end
459+
460+
def test_number_helpers_with_scientific_notation
461+
[@instance_with_helpers, TestClassWithClassNumberHelpers, ActiveSupport::NumberHelper].each do |number_helper|
462+
assert_equal "$123481223d98989", number_helper.number_to_currency("123481223d98989")
463+
assert_equal "$11288E822220222", number_helper.number_to_currency("11288E822220222")
464+
assert_equal "-$888E89789", number_helper.number_to_currency("-888E89789")
465+
466+
assert_equal "123481223d98989%", number_helper.number_to_percentage("123481223d98989")
467+
assert_equal "11288E822220222%", number_helper.number_to_percentage("11288E822220222")
468+
assert_equal "-888E89789%", number_helper.number_to_percentage("-888E89789")
469+
end
470+
end
459471
end
460472
end
461473
end

0 commit comments

Comments
 (0)