@@ -60,6 +60,21 @@ def test_app_script_text
6060 end
6161 end
6262
63+ def test_app_script_text_escapes_executable_name
64+ installer = setup_base_installer
65+
66+ malicious = "evil');system('id');#"
67+ @spec . bindir = "bin"
68+ write_file @spec . bin_file ( malicious ) do |io |
69+ io . puts "#!/usr/bin/ruby"
70+ end
71+
72+ wrapper = installer . app_script_text malicious
73+
74+ assert_includes wrapper , %q{Gem.activate_and_load_bin_path('a', 'evil\');system(\'id\');#', version)}
75+ assert_includes wrapper , %q{load Gem.activate_bin_path('a', 'evil\');system(\'id\');#', version)}
76+ end
77+
6378 def test_check_executable_overwrite
6479 installer = setup_base_installer
6580
@@ -1954,6 +1969,82 @@ def spec.validate(*args); end
19541969 end
19551970 end
19561971
1972+ def test_pre_install_checks_malicious_executables_before_eval
1973+ spec = util_spec "malicious" , "1"
1974+ def spec . full_name # so the spec is buildable
1975+ "malicious-1"
1976+ end
1977+
1978+ def spec . validate ( *args ) ; end
1979+ spec . executables = [ "../../../tmp/malicious" ]
1980+
1981+ util_build_gem spec
1982+
1983+ gem = File . join ( @gemhome , "cache" , spec . file_name )
1984+
1985+ use_ui @ui do
1986+ installer = Gem ::Installer . at gem
1987+ e = assert_raise Gem ::InstallError do
1988+ installer . pre_install_checks
1989+ end
1990+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid executable" , e . message
1991+ end
1992+ end
1993+
1994+ def test_pre_install_checks_malicious_bindir_before_eval
1995+ spec = util_spec "malicious" , "1"
1996+ def spec . full_name # so the spec is buildable
1997+ "malicious-1"
1998+ end
1999+
2000+ def spec . validate ( *args ) ; end
2001+ spec . bindir = "../../../tmp/malicious"
2002+
2003+ util_build_gem spec
2004+
2005+ gem = File . join ( @gemhome , "cache" , spec . file_name )
2006+
2007+ use_ui @ui do
2008+ installer = Gem ::Installer . at gem
2009+ e = assert_raise Gem ::InstallError do
2010+ installer . pre_install_checks
2011+ end
2012+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid bindir" , e . message
2013+ end
2014+ end
2015+
2016+ def test_pre_install_checks_non_string_executable
2017+ spec = util_spec "malicious" , "1"
2018+ def spec . validate ( *args ) ; end
2019+ spec . executables = [ nil ]
2020+
2021+ installer = Gem ::Installer . for_spec spec
2022+ installer . gem_home = @gemhome
2023+
2024+ use_ui @ui do
2025+ e = assert_raise Gem ::InstallError do
2026+ installer . pre_install_checks
2027+ end
2028+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid executable" , e . message
2029+ end
2030+ end
2031+
2032+ def test_pre_install_checks_non_string_bindir
2033+ spec = util_spec "malicious" , "1"
2034+ def spec . validate ( *args ) ; end
2035+ spec . bindir = true
2036+
2037+ installer = Gem ::Installer . for_spec spec
2038+ installer . gem_home = @gemhome
2039+
2040+ use_ui @ui do
2041+ e = assert_raise Gem ::InstallError do
2042+ installer . pre_install_checks
2043+ end
2044+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid bindir" , e . message
2045+ end
2046+ end
2047+
19572048 def test_pre_install_checks_malicious_platform_before_eval
19582049 gem_with_ill_formatted_platform = File . expand_path ( "packages/ill-formatted-platform-1.0.0.10.gem" , __dir__ )
19592050
0 commit comments