rubygems-update 2.6.12 → 2.6.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44c39a40585bfd8c3d906bdc7bae896a7a0c335a
4
- data.tar.gz: 6ca4daf88142d1426d98f45a2f8c7e95a743b40e
3
+ metadata.gz: c355e9814c4bd683190f6d71b5451fc9c7299aa4
4
+ data.tar.gz: 5086e33f6dbf1c20876379c2d31feed694c7f2ba
5
5
  SHA512:
6
- metadata.gz: 144d483fedfaa9c66bfaeb41a6380d790b093086a9e754cf9d1979f8bbce1aff61338459c644405ebf2018122335c3fe1f01f6a7b8695ea80c6fcc3de34a2e72
7
- data.tar.gz: 03a3dc90d9d15e3d827f2e55486e2ccc44d8dcae5a0f5b9a02ba1d832bdb3c574c4a0c4e798beff3c2e8d344533a686480dfd8392872ed8473d9ccfca36c2a8f
6
+ metadata.gz: 6fc702c906ba6bca4b5495934b856487c35aed3eb45037be622019074aa1b415dced89750e0329b63471d6428088162ff96341367c999fdd6274b2617ffe8c38
7
+ data.tar.gz: ad369475ea2d97b69940858dbd0e864fc57220c0472b0c7e4b68bc2c703debcb559efbd5c37af9b562607b180233fd97af6a36c076d4722254d26d9106227693
@@ -1,5 +1,19 @@
1
1
  # coding: UTF-8
2
2
 
3
+ === 2.6.13 / 2017-08-27
4
+
5
+ Security fixes:
6
+
7
+ * Fix a DNS request hijacking vulnerability.
8
+ Fix by Samuel Giddins.
9
+ * Fix an ANSI escape sequence vulnerability.
10
+ Fix by Evan Phoenix.
11
+ * Fix a DOS vulernerability in the `query` command.
12
+ Fix by Samuel Giddins.
13
+ * Fix a vulnerability in the gem installer that allowed
14
+ a malicious gem to overwrite arbitrary files.
15
+ Fix by Samuel Giddins.
16
+
3
17
  === 2.6.12 / 2017-04-30
4
18
 
5
19
  Bug fixes:
@@ -10,7 +10,7 @@ require 'rbconfig'
10
10
  require 'thread'
11
11
 
12
12
  module Gem
13
- VERSION = "2.6.12"
13
+ VERSION = "2.6.13"
14
14
  end
15
15
 
16
16
  # Must be first since it unloads the prelude from 1.9.2
@@ -226,7 +226,7 @@ is too hard to use.
226
226
  end
227
227
  end
228
228
 
229
- output << make_entry(matching_tuples, platforms)
229
+ output << clean_text(make_entry(matching_tuples, platforms))
230
230
  end
231
231
  end
232
232
 
@@ -353,7 +353,8 @@ is too hard to use.
353
353
  end
354
354
 
355
355
  def spec_summary entry, spec
356
- entry << "\n\n" << format_text(spec.summary, 68, 4)
356
+ summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
357
+ entry << "\n\n" << format_text(summary, 68, 4)
357
358
  end
358
359
 
359
360
  end
@@ -697,6 +697,11 @@ class Gem::Installer
697
697
  unpack or File.writable?(gem_home)
698
698
  end
699
699
 
700
+ def verify_spec_name
701
+ return if spec.name =~ Gem::Specification::VALID_NAME_PATTERN
702
+ raise Gem::InstallError, "#{spec} has an invalid name"
703
+ end
704
+
700
705
  ##
701
706
  # Return the text for an application file.
702
707
 
@@ -823,6 +828,8 @@ TEXT
823
828
 
824
829
  ensure_loadable_spec
825
830
 
831
+ verify_spec_name
832
+
826
833
  if options[:install_as_default]
827
834
  Gem.ensure_default_gem_subdirectories gem_home
828
835
  else
@@ -110,7 +110,7 @@ class Gem::RemoteFetcher
110
110
  else
111
111
  target = res.target.to_s.strip
112
112
 
113
- if /\.#{Regexp.quote(host)}\z/ =~ target
113
+ if URI("http://" + target).host.end_with?(".#{host}")
114
114
  return URI.parse "#{uri.scheme}://#{target}#{uri.path}"
115
115
  end
116
116
 
@@ -108,6 +108,8 @@ class Gem::Specification < Gem::BasicSpecification
108
108
 
109
109
  private_constant :LOAD_CACHE if defined? private_constant
110
110
 
111
+ VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
112
+
111
113
  # :startdoc:
112
114
 
113
115
  ##
@@ -2668,9 +2670,15 @@ class Gem::Specification < Gem::BasicSpecification
2668
2670
  end
2669
2671
  end
2670
2672
 
2671
- unless String === name then
2673
+ if !name.is_a?(String) then
2674
+ raise Gem::InvalidSpecificationException,
2675
+ "invalid value for attribute name: \"#{name.inspect}\" must be a string"
2676
+ elsif name !~ /[a-zA-Z]/ then
2677
+ raise Gem::InvalidSpecificationException,
2678
+ "invalid value for attribute name: #{name.dump} must include at least one letter"
2679
+ elsif name !~ VALID_NAME_PATTERN then
2672
2680
  raise Gem::InvalidSpecificationException,
2673
- "invalid value for attribute name: \"#{name.inspect}\""
2681
+ "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores"
2674
2682
  end
2675
2683
 
2676
2684
  if raw_require_paths.empty? then
@@ -6,13 +6,26 @@ require 'rubygems'
6
6
 
7
7
  module Gem::Text
8
8
 
9
+ ##
10
+ # Remove any non-printable characters and make the text suitable for
11
+ # printing.
12
+ def clean_text(text)
13
+ text.gsub(/[\000-\b\v-\f\016-\037\177]/, ".".freeze)
14
+ end
15
+
16
+ def truncate_text(text, description, max_length = 100_000)
17
+ raise ArgumentError, "max_length must be positive" unless max_length > 0
18
+ return text if text.size <= max_length
19
+ "Truncating #{description} to #{max_length.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse} characters:\n" + text[0, max_length]
20
+ end
21
+
9
22
  ##
10
23
  # Wraps +text+ to +wrap+ characters and optionally indents by +indent+
11
24
  # characters
12
25
 
13
26
  def format_text(text, wrap, indent=0)
14
27
  result = []
15
- work = text.dup
28
+ work = clean_text(text)
16
29
 
17
30
  while work.length > wrap do
18
31
  if work =~ /^(.{0,#{wrap}})[ \n]/ then
@@ -116,6 +116,86 @@ a (2)
116
116
  This is a lot of text. This is a lot of text. This is a lot of text.
117
117
  This is a lot of text.
118
118
 
119
+ pl (1)
120
+ Platform: i386-linux
121
+ Author: A User
122
+ Homepage: http://example.com
123
+
124
+ this is a summary
125
+ EOF
126
+
127
+ assert_equal expected, @ui.output
128
+ assert_equal '', @ui.error
129
+ end
130
+
131
+ def test_execute_details_cleans_text
132
+ spec_fetcher do |fetcher|
133
+ fetcher.spec 'a', 2 do |s|
134
+ s.summary = 'This is a lot of text. ' * 4
135
+ s.authors = ["Abraham Lincoln \x01", "\x02 Hirohito"]
136
+ s.homepage = "http://a.example.com/\x03"
137
+ end
138
+
139
+ fetcher.legacy_platform
140
+ end
141
+
142
+ @cmd.handle_options %w[-r -d]
143
+
144
+ use_ui @ui do
145
+ @cmd.execute
146
+ end
147
+
148
+ expected = <<-EOF
149
+
150
+ *** REMOTE GEMS ***
151
+
152
+ a (2)
153
+ Authors: Abraham Lincoln ., . Hirohito
154
+ Homepage: http://a.example.com/.
155
+
156
+ This is a lot of text. This is a lot of text. This is a lot of text.
157
+ This is a lot of text.
158
+
159
+ pl (1)
160
+ Platform: i386-linux
161
+ Author: A User
162
+ Homepage: http://example.com
163
+
164
+ this is a summary
165
+ EOF
166
+
167
+ assert_equal expected, @ui.output
168
+ assert_equal '', @ui.error
169
+ end
170
+
171
+ def test_execute_details_truncates_summary
172
+ spec_fetcher do |fetcher|
173
+ fetcher.spec 'a', 2 do |s|
174
+ s.summary = 'This is a lot of text. ' * 10_000
175
+ s.authors = ["Abraham Lincoln \x01", "\x02 Hirohito"]
176
+ s.homepage = "http://a.example.com/\x03"
177
+ end
178
+
179
+ fetcher.legacy_platform
180
+ end
181
+
182
+ @cmd.handle_options %w[-r -d]
183
+
184
+ use_ui @ui do
185
+ @cmd.execute
186
+ end
187
+
188
+ expected = <<-EOF
189
+
190
+ *** REMOTE GEMS ***
191
+
192
+ a (2)
193
+ Authors: Abraham Lincoln ., . Hirohito
194
+ Homepage: http://a.example.com/.
195
+
196
+ Truncating the summary for a-2 to 100,000 characters:
197
+ #{" This is a lot of text. This is a lot of text. This is a lot of text.\n" * 1449} This is a lot of te
198
+
119
199
  pl (1)
120
200
  Platform: i386-linux
121
201
  Author: A User
@@ -1448,6 +1448,26 @@ gem 'other', version
1448
1448
  end
1449
1449
  end
1450
1450
 
1451
+ def test_pre_install_checks_malicious_name
1452
+ spec = util_spec '../malicious', '1'
1453
+ def spec.full_name # so the spec is buildable
1454
+ "malicious-1"
1455
+ end
1456
+ def spec.validate; end
1457
+
1458
+ util_build_gem spec
1459
+
1460
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1461
+
1462
+ use_ui @ui do
1463
+ @installer = Gem::Installer.at gem
1464
+ e = assert_raises Gem::InstallError do
1465
+ @installer.pre_install_checks
1466
+ end
1467
+ assert_equal '#<Gem::Specification name=../malicious version=1> has an invalid name', e.message
1468
+ end
1469
+ end
1470
+
1451
1471
  def test_shebang
1452
1472
  util_make_exec @spec, "#!/usr/bin/ruby"
1453
1473
 
@@ -241,6 +241,21 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
241
241
  dns.verify
242
242
  end
243
243
 
244
+ def test_api_endpoint_ignores_trans_domain_values_that_end_with_original_in_path
245
+ uri = URI.parse "http://example.com/foo"
246
+ target = MiniTest::Mock.new
247
+ target.expect :target, "evil.com/a.example.com"
248
+
249
+ dns = MiniTest::Mock.new
250
+ dns.expect :getresource, target, [String, Object]
251
+
252
+ fetch = Gem::RemoteFetcher.new nil, dns
253
+ assert_equal URI.parse("http://example.com/foo"), fetch.api_endpoint(uri)
254
+
255
+ target.verify
256
+ dns.verify
257
+ end
258
+
244
259
  def test_api_endpoint_timeout_warning
245
260
  uri = URI.parse "http://gems.example.com/foo"
246
261
 
@@ -2985,7 +2985,37 @@ Did you mean 'Ruby'?
2985
2985
  @a1.validate
2986
2986
  end
2987
2987
 
2988
- assert_equal 'invalid value for attribute name: ":json"', e.message
2988
+ assert_equal 'invalid value for attribute name: ":json" must be a string', e.message
2989
+
2990
+ @a1.name = []
2991
+ e = assert_raises Gem::InvalidSpecificationException do
2992
+ @a1.validate
2993
+ end
2994
+ assert_equal "invalid value for attribute name: \"[]\" must be a string", e.message
2995
+
2996
+ @a1.name = ""
2997
+ e = assert_raises Gem::InvalidSpecificationException do
2998
+ @a1.validate
2999
+ end
3000
+ assert_equal "invalid value for attribute name: \"\" must include at least one letter", e.message
3001
+
3002
+ @a1.name = "12345"
3003
+ e = assert_raises Gem::InvalidSpecificationException do
3004
+ @a1.validate
3005
+ end
3006
+ assert_equal "invalid value for attribute name: \"12345\" must include at least one letter", e.message
3007
+
3008
+ @a1.name = "../malicious"
3009
+ e = assert_raises Gem::InvalidSpecificationException do
3010
+ @a1.validate
3011
+ end
3012
+ assert_equal "invalid value for attribute name: \"../malicious\" can only include letters, numbers, dashes, and underscores", e.message
3013
+
3014
+ @a1.name = "\ba\t"
3015
+ e = assert_raises Gem::InvalidSpecificationException do
3016
+ @a1.validate
3017
+ end
3018
+ assert_equal "invalid value for attribute name: \"\\ba\\t\" can only include letters, numbers, dashes, and underscores", e.message
2989
3019
  end
2990
3020
 
2991
3021
  def test_validate_non_nil
@@ -36,6 +36,10 @@ Without the wrapping, the text might not look good in the RSS feed.
36
36
  assert_equal expected, format_text(text, 78)
37
37
  end
38
38
 
39
+ def test_format_removes_nonprintable_characters
40
+ assert_equal "text with weird .. stuff .", format_text("text with weird \x1b\x02 stuff \x7f", 40)
41
+ end
42
+
39
43
  def test_min3
40
44
  assert_equal 1, min3(1, 1, 1)
41
45
  assert_equal 1, min3(1, 1, 2)
@@ -74,4 +78,11 @@ Without the wrapping, the text might not look good in the RSS feed.
74
78
  assert_equal 7, levenshtein_distance("xxxxxxx", "ZenTest")
75
79
  assert_equal 7, levenshtein_distance("zentest", "xxxxxxx")
76
80
  end
81
+
82
+ def test_truncate_text
83
+ assert_equal "abc", truncate_text("abc", "desc")
84
+ assert_equal "Truncating desc to 2 characters:\nab", truncate_text("abc", "desc", 2)
85
+ s = "ab" * 500_001
86
+ assert_equal "Truncating desc to 1,000,000 characters:\n#{s[0, 1_000_000]}", truncate_text(s, "desc", 1_000_000)
87
+ end
77
88
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubygems-update
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.12
4
+ version: 2.6.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Weirich
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-04-30 00:00:00.000000000 Z
13
+ date: 2017-08-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: builder
@@ -800,7 +800,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
800
800
  version: '0'
801
801
  requirements: []
802
802
  rubyforge_project:
803
- rubygems_version: 2.6.11
803
+ rubygems_version: 2.6.12
804
804
  signing_key:
805
805
  specification_version: 4
806
806
  summary: RubyGems is a package management framework for Ruby