Skip to content

Commit 5cec76b

Browse files
nobuhsbt
authored andcommitted
Clear user info totally at setting any of authority info
Fix CVE-2025-27221. https://hackerone.com/reports/3221142
1 parent 3213f4a commit 5cec76b

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

lib/uri/generic.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,18 +186,18 @@ def initialize(scheme,
186186

187187
if arg_check
188188
self.scheme = scheme
189-
self.userinfo = userinfo
190189
self.hostname = host
191190
self.port = port
191+
self.userinfo = userinfo
192192
self.path = path
193193
self.query = query
194194
self.opaque = opaque
195195
self.fragment = fragment
196196
else
197197
self.set_scheme(scheme)
198-
self.set_userinfo(userinfo)
199198
self.set_host(host)
200199
self.set_port(port)
200+
self.set_userinfo(userinfo)
201201
self.set_path(path)
202202
self.query = query
203203
self.set_opaque(opaque)
@@ -511,7 +511,7 @@ def set_userinfo(user, password = nil)
511511
user, password = split_userinfo(user)
512512
end
513513
@user = user
514-
@password = password if password
514+
@password = password
515515

516516
[@user, @password]
517517
end
@@ -522,7 +522,7 @@ def set_userinfo(user, password = nil)
522522
# See also URI::Generic.user=.
523523
#
524524
def set_user(v)
525-
set_userinfo(v, @password)
525+
set_userinfo(v, nil)
526526
v
527527
end
528528
protected :set_user
@@ -639,6 +639,7 @@ def set_host(v)
639639
def host=(v)
640640
check_host(v)
641641
set_host(v)
642+
set_userinfo(nil)
642643
v
643644
end
644645

@@ -729,6 +730,7 @@ def set_port(v)
729730
def port=(v)
730731
check_port(v)
731732
set_port(v)
733+
set_userinfo(nil)
732734
port
733735
end
734736

test/uri/test_generic.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ def test_merge_authority
283283
u0 = URI.parse('http://new.example.org/path')
284284
u1 = u.merge('//new.example.org/path')
285285
assert_equal(u0, u1)
286+
u0 = URI.parse('http://other@example.net')
287+
u1 = u.merge('//other@example.net')
288+
assert_equal(u0, u1)
286289
end
287290

288291
def test_route
@@ -748,17 +751,18 @@ def test_join
748751
def test_set_component
749752
uri = URI.parse('http://foo:bar@baz')
750753
assert_equal('oof', uri.user = 'oof')
751-
assert_equal('http://oof:bar@baz', uri.to_s)
754+
assert_equal('http://oof@baz', uri.to_s)
752755
assert_equal('rab', uri.password = 'rab')
753756
assert_equal('http://oof:rab@baz', uri.to_s)
754757
assert_equal('foo', uri.userinfo = 'foo')
755-
assert_equal('http://foo:rab@baz', uri.to_s)
758+
assert_equal('http://foo@baz', uri.to_s)
756759
assert_equal(['foo', 'bar'], uri.userinfo = ['foo', 'bar'])
757760
assert_equal('http://foo:bar@baz', uri.to_s)
758761
assert_equal(['foo'], uri.userinfo = ['foo'])
759-
assert_equal('http://foo:bar@baz', uri.to_s)
762+
assert_equal('http://foo@baz', uri.to_s)
760763
assert_equal('zab', uri.host = 'zab')
761-
assert_equal('http://foo:bar@zab', uri.to_s)
764+
assert_equal('http://zab', uri.to_s)
765+
uri.userinfo = ['foo', 'bar']
762766
uri.port = ""
763767
assert_nil(uri.port)
764768
uri.port = "80"
@@ -768,7 +772,8 @@ def test_set_component
768772
uri.port = " 080 "
769773
assert_equal(80, uri.port)
770774
assert_equal(8080, uri.port = 8080)
771-
assert_equal('http://foo:bar@zab:8080', uri.to_s)
775+
assert_equal('http://zab:8080', uri.to_s)
776+
uri = URI.parse('http://foo:bar@zab:8080')
772777
assert_equal('/', uri.path = '/')
773778
assert_equal('http://foo:bar@zab:8080/', uri.to_s)
774779
assert_equal('a=1', uri.query = 'a=1')

0 commit comments

Comments
 (0)