rubygems-update 2.7.8 → 2.7.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dbf7de0c963b5bf9055a784b43d108a717fdd65fce7a3d97068e1c774b50b3d2
4
- data.tar.gz: 21713c44bed6a5050127ce97e6398d905677384772c4703a035bd27b22df48dd
3
+ metadata.gz: 6736c355ae1a7a8a8818d475210864d02a45fa719d077fa0fbdb3364f66516a8
4
+ data.tar.gz: d1e05cf09f69a1138e938415d01efe56899cbd01566d7ec00e012d91435aa21e
5
5
  SHA512:
6
- metadata.gz: daa83b745513df1295b194d70fc0a1e1e3aed8619b1ad7c4542342dc1f4b8a4d3deb1c1ffa660aaea10ff1bda3045bc421101d58f2b5b78257ddad6877e8b2e4
7
- data.tar.gz: 547b225a05641f1fb5456813945c14fc05a8e67fab01b2d07cd96335d77574b4c5618e96b7b94b1829e4fdcefee85f151fd82b382aa8e8183af611d8fd895d02
6
+ metadata.gz: baefafb2d473d18a0261483e5210052a01a89be4332fd2329530d0f0340f6e9bf7c1c902d6e519d9212a33d3f942f6c905a685c61480cb06833df0773b4cfef5
7
+ data.tar.gz: 9f3c018f865fbe4cf5f11efba601c40cd5b6bc470f1e782cfa7b9fdfa2a2f3b9e2df3bf563a0f857906f9757691cd335224358fb67e2b037097f711f3da5023e
@@ -1,11 +1,21 @@
1
1
  # coding: UTF-8
2
2
 
3
+ === 2.7.9 / 2019-03-05
4
+
5
+ Security fixes:
6
+
7
+ * Fixed following vulnerabilities:
8
+ * CVE-2019-8320: Delete directory using symlink when decompressing tar
9
+ * CVE-2019-8321: Escape sequence injection vulnerability in `verbose`
10
+ * CVE-2019-8322: Escape sequence injection vulnerability in `gem owner`
11
+ * CVE-2019-8323: Escape sequence injection vulnerability in API response handling
12
+ * CVE-2019-8324: Installing a malicious gem may lead to arbitrary code execution
13
+ * CVE-2019-8325: Escape sequence injection vulnerability in errors
14
+
3
15
  === 2.7.8 / 2018-11-02
4
16
 
5
17
  Minor enhancements:
6
18
 
7
- * Improve invalid proxy error message. Pull request #2217 by Luis
8
- Sagastume.
9
19
  * [Requirement] Treat requirements with == versions as equal. Pull
10
20
  request #2230 by Samuel Giddins.
11
21
  * Fix exec_name documentation. Pull request #2239 by Luis Sagastume.
@@ -13,16 +23,9 @@ Minor enhancements:
13
23
  by Samuel Giddins.
14
24
  * Simplify the code that lets us call the original, non-monkeypatched
15
25
  Kernel#require. Pull request #2267 by Leon Miller-Out.
16
- * Support IO.copy_stream. Pull request #2303 by okkez.
17
- * Add error message when trying to open a default gem. Pull request #2307
18
- by Luis Sagastume.
19
26
  * Add install alias documentation. Pull request #2320 by ota42y.
20
- * Removed explicitly declaration of thread library. Pull request #2324 by
21
- SHIBATA Hiroshi.
22
27
  * [Rakefile] Set bundler build metadata when doing a release. Pull request
23
28
  #2335 by Samuel Giddins.
24
- * Speed up globbing relative to given directories. Pull request #2336 by
25
- Samuel Giddins.
26
29
  * Backport commits from ruby core . Pull request #2347 by SHIBATA Hiroshi.
27
30
  * Sign in to the correct host before push. Pull request #2366 by Luis
28
31
  Sagastume.
@@ -32,24 +35,16 @@ Minor enhancements:
32
35
 
33
36
  Bug fixes:
34
37
 
35
- * Frozen string fix - lib/rubygems/bundler_version_finder.rb. Pull request
36
- #2115 by MSP-Greg.
37
- * Fixed no assignment variables about default gems installation. Pull
38
- request #2181 by SHIBATA Hiroshi.
39
38
  * Fix #1470: generate documentation when --install-dir is present. Pull
40
39
  request #2229 by Elias Hernandis.
40
+ * Fix no proxy checking. Pull request #2249 by Luis Sagastume.
41
41
  * Validate SPDX license exceptions. Pull request #2257 by Mikit.
42
- * Keep feature names loaded in the block. Pull request #2261 by Nobuyoshi
43
- Nakada.
44
42
  * Retry api specification spec with original platform. Pull request #2275
45
43
  by Luis Sagastume.
46
44
  * Fix approximate recommendation with prereleases. Pull request #2345 by
47
45
  David Rodríguez.
48
- * Expand symlinks in gem path. Pull request #2352 by Benoit Daloze.
49
46
  * Gem::Version should handle nil like it used to before. Pull request
50
47
  #2363 by Luis Sagastume.
51
- * Fix auto resign expired certificate. Pull request #2380 by Luis
52
- Sagastume.
53
48
 
54
49
  === 2.7.7 / 2018-05-08
55
50
 
@@ -4,7 +4,7 @@ module Bundler
4
4
  # Represents metadata from when the Bundler gem was built.
5
5
  module BuildMetadata
6
6
  # begin ivars
7
- @built_at = "2018-11-02".freeze
7
+ @built_at = "2019-03-04".freeze
8
8
  @git_commit_sha = "8a789f00b".freeze
9
9
  @release = false
10
10
  # end ivars
@@ -10,7 +10,7 @@ require 'rbconfig'
10
10
  require 'thread'
11
11
 
12
12
  module Gem
13
- VERSION = "2.7.8"
13
+ VERSION = "2.7.9"
14
14
  end
15
15
 
16
16
  # Must be first since it unloads the prelude from 1.9.2
@@ -7,6 +7,7 @@
7
7
 
8
8
  require 'rubygems/command'
9
9
  require 'rubygems/user_interaction'
10
+ require 'rubygems/text'
10
11
 
11
12
  ##
12
13
  # The command manager registers and installs all the individual sub-commands
@@ -32,6 +33,7 @@ require 'rubygems/user_interaction'
32
33
 
33
34
  class Gem::CommandManager
34
35
 
36
+ include Gem::Text
35
37
  include Gem::UserInteraction
36
38
 
37
39
  BUILTIN_COMMANDS = [ # :nodoc:
@@ -140,12 +142,12 @@ class Gem::CommandManager
140
142
  def run(args, build_args=nil)
141
143
  process_args(args, build_args)
142
144
  rescue StandardError, Timeout::Error => ex
143
- alert_error "While executing gem ... (#{ex.class})\n #{ex}"
145
+ alert_error clean_text("While executing gem ... (#{ex.class})\n #{ex}")
144
146
  ui.backtrace ex
145
147
 
146
148
  terminate_interaction(1)
147
149
  rescue Interrupt
148
- alert_error "Interrupted"
150
+ alert_error clean_text("Interrupted")
149
151
  terminate_interaction(1)
150
152
  end
151
153
 
@@ -163,7 +165,7 @@ class Gem::CommandManager
163
165
  say Gem::VERSION
164
166
  terminate_interaction 0
165
167
  when /^-/ then
166
- alert_error "Invalid option: #{args.first}. See 'gem --help'."
168
+ alert_error clean_text("Invalid option: #{args.first}. See 'gem --help'.")
167
169
  terminate_interaction 1
168
170
  else
169
171
  cmd_name = args.shift.downcase
@@ -212,7 +214,7 @@ class Gem::CommandManager
212
214
  rescue Exception => e
213
215
  e = load_error if load_error
214
216
 
215
- alert_error "Loading command: #{command_name} (#{e.class})\n\t#{e}"
217
+ alert_error clean_text("Loading command: #{command_name} (#{e.class})\n\t#{e}")
216
218
  ui.backtrace e
217
219
  end
218
220
  end
@@ -2,8 +2,11 @@
2
2
  require 'rubygems/command'
3
3
  require 'rubygems/local_remote_options'
4
4
  require 'rubygems/gemcutter_utilities'
5
+ require 'rubygems/text'
5
6
 
6
7
  class Gem::Commands::OwnerCommand < Gem::Command
8
+
9
+ include Gem::Text
7
10
  include Gem::LocalRemoteOptions
8
11
  include Gem::GemcutterUtilities
9
12
 
@@ -64,7 +67,7 @@ permission to.
64
67
  end
65
68
 
66
69
  with_response response do |resp|
67
- owners = Gem::SafeYAML.load resp.body
70
+ owners = Gem::SafeYAML.load clean_text(resp.body)
68
71
 
69
72
  say "Owners for gem: #{name}"
70
73
  owners.each do |owner|
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems/remote_fetcher'
3
+ require 'rubygems/text'
3
4
 
4
5
  ##
5
6
  # Utility methods for using the RubyGems API.
6
7
 
7
8
  module Gem::GemcutterUtilities
8
9
 
10
+ include Gem::Text
11
+
9
12
  # TODO: move to Gem::Command
10
13
  OptionParser.accept Symbol do |value|
11
14
  value.to_sym
@@ -145,13 +148,13 @@ module Gem::GemcutterUtilities
145
148
  if block_given? then
146
149
  yield response
147
150
  else
148
- say response.body
151
+ say clean_text(response.body)
149
152
  end
150
153
  else
151
154
  message = response.body
152
155
  message = "#{error_prefix}: #{message}" if error_prefix
153
156
 
154
- say message
157
+ say clean_text(message)
155
158
  terminate_interaction 1 # TODO: question this
156
159
  end
157
160
  end
@@ -710,9 +710,26 @@ class Gem::Installer
710
710
  unpack or File.writable?(gem_home)
711
711
  end
712
712
 
713
- def verify_spec_name
714
- return if spec.name =~ Gem::Specification::VALID_NAME_PATTERN
715
- raise Gem::InstallError, "#{spec} has an invalid name"
713
+ def verify_spec
714
+ unless spec.name =~ Gem::Specification::VALID_NAME_PATTERN
715
+ raise Gem::InstallError, "#{spec} has an invalid name"
716
+ end
717
+
718
+ if spec.raw_require_paths.any?{|path| path =~ /\r\n|\r|\n/ }
719
+ raise Gem::InstallError, "#{spec} has an invalid require_paths"
720
+ end
721
+
722
+ if spec.extensions.any?{|ext| ext =~ /\r\n|\r|\n/ }
723
+ raise Gem::InstallError, "#{spec} has an invalid extensions"
724
+ end
725
+
726
+ unless spec.specification_version.to_s =~ /\A\d+\z/
727
+ raise Gem::InstallError, "#{spec} has an invalid specification_version"
728
+ end
729
+
730
+ if spec.dependencies.any? {|dep| dep.type =~ /\r\n|\r|\n/ || dep.name =~ /\r\n|\r|\n/ }
731
+ raise Gem::InstallError, "#{spec} has an invalid dependencies"
732
+ end
716
733
  end
717
734
 
718
735
  ##
@@ -840,9 +857,11 @@ TEXT
840
857
  def pre_install_checks
841
858
  verify_gem_home options[:unpack]
842
859
 
843
- ensure_loadable_spec
860
+ # The name and require_paths must be verified first, since it could contain
861
+ # ruby code that would be eval'ed in #ensure_loadable_spec
862
+ verify_spec
844
863
 
845
- verify_spec_name
864
+ ensure_loadable_spec
846
865
 
847
866
  if options[:install_as_default]
848
867
  Gem.ensure_default_gem_subdirectories gem_home
@@ -425,6 +425,16 @@ EOM
425
425
  raise Gem::Package::PathError.new(destination, destination_dir) unless
426
426
  destination.start_with? destination_dir + '/'
427
427
 
428
+ begin
429
+ real_destination = File.expand_path(File.realpath(destination))
430
+ rescue
431
+ # it's fine if the destination doesn't exist, because rm -rf'ing it can't cause any damage
432
+ nil
433
+ else
434
+ raise Gem::Package::PathError.new(real_destination, destination_dir) unless
435
+ real_destination.start_with? destination_dir + '/'
436
+ end
437
+
428
438
  destination.untaint
429
439
  destination
430
440
  end
@@ -7,6 +7,7 @@
7
7
 
8
8
  require 'rubygems/util'
9
9
  require 'rubygems/deprecate'
10
+ require 'rubygems/text'
10
11
 
11
12
  ##
12
13
  # Module that defines the default UserInteraction. Any class including this
@@ -14,6 +15,8 @@ require 'rubygems/deprecate'
14
15
 
15
16
  module Gem::DefaultUserInteraction
16
17
 
18
+ include Gem::Text
19
+
17
20
  ##
18
21
  # The default UI is a class variable of the singleton class for this
19
22
  # module.
@@ -161,8 +164,8 @@ module Gem::UserInteraction
161
164
  # Calls +say+ with +msg+ or the results of the block if really_verbose
162
165
  # is true.
163
166
 
164
- def verbose msg = nil
165
- say(msg || yield) if Gem.configuration.really_verbose
167
+ def verbose(msg = nil)
168
+ say(clean_text(msg || yield)) if Gem.configuration.really_verbose
166
169
  end
167
170
  end
168
171
 
@@ -1474,6 +1474,112 @@ gem 'other', version
1474
1474
  end
1475
1475
  end
1476
1476
 
1477
+ def test_pre_install_checks_malicious_name_before_eval
1478
+ spec = util_spec "malicious\n::Object.const_set(:FROM_EVAL, true)#", '1'
1479
+ def spec.full_name # so the spec is buildable
1480
+ "malicious-1"
1481
+ end
1482
+ def spec.validate(*args); end
1483
+
1484
+ util_build_gem spec
1485
+
1486
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1487
+
1488
+ use_ui @ui do
1489
+ @installer = Gem::Installer.at gem
1490
+ e = assert_raises Gem::InstallError do
1491
+ @installer.pre_install_checks
1492
+ end
1493
+ assert_equal "#<Gem::Specification name=malicious\n::Object.const_set(:FROM_EVAL, true)# version=1> has an invalid name", e.message
1494
+ end
1495
+ refute defined?(::Object::FROM_EVAL)
1496
+ end
1497
+
1498
+ def test_pre_install_checks_malicious_require_paths_before_eval
1499
+ spec = util_spec "malicious", '1'
1500
+ def spec.full_name # so the spec is buildable
1501
+ "malicious-1"
1502
+ end
1503
+ def spec.validate(*args); end
1504
+ spec.require_paths = ["malicious\n``"]
1505
+
1506
+ util_build_gem spec
1507
+
1508
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1509
+
1510
+ use_ui @ui do
1511
+ @installer = Gem::Installer.at gem
1512
+ e = assert_raises Gem::InstallError do
1513
+ @installer.pre_install_checks
1514
+ end
1515
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid require_paths", e.message
1516
+ end
1517
+ end
1518
+
1519
+ def test_pre_install_checks_malicious_extensions_before_eval
1520
+ spec = util_spec "malicious", '1'
1521
+ def spec.full_name # so the spec is buildable
1522
+ "malicious-1"
1523
+ end
1524
+ def spec.validate(*args); end
1525
+ spec.extensions = ["malicious\n``"]
1526
+
1527
+ util_build_gem spec
1528
+
1529
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1530
+
1531
+ use_ui @ui do
1532
+ @installer = Gem::Installer.at gem
1533
+ e = assert_raises Gem::InstallError do
1534
+ @installer.pre_install_checks
1535
+ end
1536
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid extensions", e.message
1537
+ end
1538
+ end
1539
+
1540
+ def test_pre_install_checks_malicious_specification_version_before_eval
1541
+ spec = util_spec "malicious", '1'
1542
+ def spec.full_name # so the spec is buildable
1543
+ "malicious-1"
1544
+ end
1545
+ def spec.validate(*args); end
1546
+ spec.specification_version = "malicious\n``"
1547
+
1548
+ util_build_gem spec
1549
+
1550
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1551
+
1552
+ use_ui @ui do
1553
+ @installer = Gem::Installer.at gem
1554
+ e = assert_raises Gem::InstallError do
1555
+ @installer.pre_install_checks
1556
+ end
1557
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid specification_version", e.message
1558
+ end
1559
+ end
1560
+
1561
+ def test_pre_install_checks_malicious_dependencies_before_eval
1562
+ spec = util_spec "malicious", '1'
1563
+ def spec.full_name # so the spec is buildable
1564
+ "malicious-1"
1565
+ end
1566
+ def spec.validate(*args); end
1567
+ spec.add_dependency "b\nfoo", '> 5'
1568
+
1569
+ util_build_gem spec
1570
+
1571
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1572
+
1573
+ use_ui @ui do
1574
+ @installer = Gem::Installer.at gem
1575
+ @installer.ignore_dependencies = true
1576
+ e = assert_raises Gem::InstallError do
1577
+ @installer.pre_install_checks
1578
+ end
1579
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid dependencies", e.message
1580
+ end
1581
+ end
1582
+
1477
1583
  def test_shebang
1478
1584
  util_make_exec @spec, "#!/usr/bin/ruby"
1479
1585
 
@@ -480,6 +480,42 @@ class TestGemPackage < Gem::Package::TarTestCase
480
480
  "#{destination_subdir} is not allowed", e.message)
481
481
  end
482
482
 
483
+ def test_extract_symlink_parent_doesnt_delete_user_dir
484
+ skip if RUBY_VERSION <= "1.8.7"
485
+
486
+ package = Gem::Package.new @gem
487
+
488
+ # Extract into a subdirectory of @destination; if this test fails it writes
489
+ # a file outside destination_subdir, but we want the file to remain inside
490
+ # @destination so it will be cleaned up.
491
+ destination_subdir = File.join @destination, 'subdir'
492
+ FileUtils.mkdir_p destination_subdir
493
+
494
+ destination_user_dir = File.join @destination, 'user'
495
+ destination_user_subdir = File.join destination_user_dir, 'dir'
496
+ FileUtils.mkdir_p destination_user_subdir
497
+
498
+ tgz_io = util_tar_gz do |tar|
499
+ tar.add_symlink 'link', destination_user_dir, 16877
500
+ tar.add_symlink 'link/dir', '.', 16877
501
+ end
502
+
503
+ e = assert_raises(Gem::Package::PathError, Errno::EACCES) do
504
+ package.extract_tar_gz tgz_io, destination_subdir
505
+ end
506
+
507
+ assert_path_exists destination_user_subdir
508
+
509
+ if Gem::Package::PathError === e
510
+ assert_equal("installing into parent path #{destination_user_subdir} of " +
511
+ "#{destination_subdir} is not allowed", e.message)
512
+ elsif win_platform?
513
+ skip "symlink - must be admin with no UAC on Windows"
514
+ else
515
+ raise e
516
+ end
517
+ end
518
+
483
519
  def test_extract_tar_gz_directory
484
520
  package = Gem::Package.new @gem
485
521
 
@@ -85,4 +85,9 @@ Without the wrapping, the text might not look good in the RSS feed.
85
85
  s = "ab" * 500_001
86
86
  assert_equal "Truncating desc to 1,000,000 characters:\n#{s[0, 1_000_000]}", truncate_text(s, "desc", 1_000_000)
87
87
  end
88
+
89
+ def test_clean_text
90
+ assert_equal ".]2;nyan.", clean_text("\e]2;nyan\a")
91
+ end
92
+
88
93
  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.7.8
4
+ version: 2.7.9
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: 2018-11-02 00:00:00.000000000 Z
13
+ date: 2019-03-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: builder