passenger 4.0.4 → 4.0.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data.tar.gz.asc +7 -7
- data/NEWS +34 -1
- data/bin/passenger-install-nginx-module +3 -4
- data/build/common_library.rb +2 -1
- data/ext/common/Constants.h +1 -1
- data/lib/phusion_passenger.rb +1 -1
- data/lib/phusion_passenger/admin_tools/server_instance.rb +1 -1
- data/lib/phusion_passenger/constants.rb +3 -1
- data/lib/phusion_passenger/platform_info.rb +14 -14
- data/lib/phusion_passenger/platform_info/apache.rb +2 -10
- data/lib/phusion_passenger/standalone/command.rb +9 -6
- data/lib/phusion_passenger/standalone/runtime_installer.rb +3 -4
- data/lib/phusion_passenger/standalone/start_command.rb +1 -1
- data/lib/phusion_passenger/utils/tmpio.rb +35 -0
- data/resources/templates/standalone/config.erb +7 -5
- metadata +2 -2
- metadata.gz.asc +7 -7
data.tar.gz.asc
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
|
3
3
|
Comment: GPGTools - http://gpgtools.org
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
=
|
5
|
+
iQEcBAABAgAGBQJRpgpHAAoJECrHRaUKISqMmNkIAIbfyHTRn7w8hubsVIbNhaTn
|
6
|
+
wbgIkDW2N7y9RQXCtjiCp8niJB5J0nguVsrU+vykoEPcQ8YVsDeo2OMrnWqZOQ3Y
|
7
|
+
k94g/ZDDXg+g9FkaQ/6U1B0au48qqwJVquBz6rL8awkgWd8yve6UAO9i5Oum3YWz
|
8
|
+
tuj1abiJxxZOOKhu6lGSe51nephHG35BUh0eNtO/PQCDptfjNBnEmDTmZL1xs3GM
|
9
|
+
W/lwx8q4AQJU4gpA31qtRDDP7GSL/2OKE0rBUfXSaMF88X3SotNr+ohZSUm6siHG
|
10
|
+
4R2m469J8+RBNOnjNY6xILrrC+/WYM5G5GTKtjP8lwL6RD5xJ9JtyEOuYT0UrAc=
|
11
|
+
=TDNl
|
12
12
|
-----END PGP SIGNATURE-----
|
data/NEWS
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
Release 4.0.5
|
2
|
+
-------------
|
3
|
+
|
4
|
+
* [Standalone] Fixed a regression that prevented Passenger Standalone
|
5
|
+
from starting. Fixes issue #899.
|
6
|
+
* Fixed security vulnerability CVE-2013-2119.
|
7
|
+
|
8
|
+
Urgency: low
|
9
|
+
Scope: local exploit
|
10
|
+
Summary: denial of service and arbitrary code execution by hijacking temp files
|
11
|
+
Affected versions: all versions
|
12
|
+
Fixed versions: 3.0.21 and 4.0.5
|
13
|
+
|
14
|
+
Description:
|
15
|
+
Phusion Passenger's code did not always create temporary files and directories in a secure manner. Temporary files and directories were sometimes created with a predictable filename. A local attacker can pre-create temporary files, resulting in a denial of service. In addition, this vulnerability allows a local attacker to run arbitrary code as another user, by hijacking temporary files.
|
16
|
+
|
17
|
+
By pre-creating certain temporary files with certain permissions, attackers can prevent Passenger Standalone from starting (denial of service).
|
18
|
+
|
19
|
+
By pre-creating certain temporary files with certain other permissions, attackers can trick `passenger start` and the build system (which is invoked by `passenger-install-apache2-module`/`passenger-install-nginx-module`) to run arbitrary code. The user that the code is run as, is equal to the user that ran `passenger start` or the build system. Attacks of this nature have to be timed exactly right. The attacker must overwrite the file contents right after Phusion Passenger has created the file contents, but right before the file is used. In the context of `passenger start`, the vulnerable window begins right after Passenger Standalone has created the Nginx config file, and ends when Nginx has read the config file. Once Nginx has started and initialized, the system is no longer vulnerable. `passenger stop` and other Passenger Standalone commands besides `start` are not vulnerable. In the context of the build system, the vulnerable window begins when `passenger-install-apache2-module`/`passenger-install-nginx-module` prints its first dependency checking message, and ends when it prints the first compiler command.
|
20
|
+
|
21
|
+
Only the `passenger start` command, the `passenger-install-apache2-module` command and the `passenger-install-nginx-module` commands are vulnerable. Phusion Passenger for Apache and Phusion Passenger for Nginx (once they are installed) are not vulnerable.
|
22
|
+
|
23
|
+
Fixed versions:
|
24
|
+
3.0.21 and 4.0.5 have been released to address this issue.
|
25
|
+
|
26
|
+
Workaround:
|
27
|
+
You can use this workaround if you are unable to upgrade. Before invoking any Phusion Passenger command, set the `TMPDIR` environment variable to a directory that is not world-writable. Special care must be taken when you use sudo: sudo resets all environment variables, so you should either invoke sudo with `-E`, or you must set the environment variable after gaining root privileges with sudo.
|
28
|
+
|
29
|
+
|
1
30
|
Release 4.0.4
|
2
31
|
-------------
|
3
32
|
|
@@ -221,12 +250,16 @@ This is the first beta of Phusion Passenger 4. The changes are numerous.
|
|
221
250
|
* Better relocatability without wasting space.
|
222
251
|
|
223
252
|
|
224
|
-
Release 3.0.
|
253
|
+
Release 3.0.21
|
225
254
|
--------------
|
226
255
|
|
227
256
|
* Rebootstrapped the libev configure to fix compilation problems on Solaris 11.
|
228
257
|
* Fixed support for RVM mixed mode installations. Fixes issue #828.
|
229
258
|
* Fixed encoding problems in Phusion Passenger Standalone.
|
259
|
+
* Changed preferred Nginx version to 1.2.9.
|
260
|
+
* Catch exceptions raised by Rack application objects.
|
261
|
+
* Fix for CVE-2013-2119. Details can be found in the announcement for version 4.0.5.
|
262
|
+
* Version 3.0.20 was pulled because its fixes were incomplete.
|
230
263
|
|
231
264
|
|
232
265
|
Release 3.0.19
|
@@ -32,6 +32,7 @@ require 'optparse'
|
|
32
32
|
require 'fileutils'
|
33
33
|
require 'phusion_passenger/platform_info/ruby'
|
34
34
|
require 'phusion_passenger/abstract_installer'
|
35
|
+
require 'phusion_passenger/utils/tmpio'
|
35
36
|
|
36
37
|
class Installer < PhusionPassenger::AbstractInstaller
|
37
38
|
include PhusionPassenger
|
@@ -122,14 +123,12 @@ class Installer < PhusionPassenger::AbstractInstaller
|
|
122
123
|
def before_install
|
123
124
|
super
|
124
125
|
myself = `whoami`.strip
|
125
|
-
@working_dir = "
|
126
|
-
FileUtils.rm_rf(@working_dir)
|
127
|
-
FileUtils.mkdir_p(@working_dir)
|
126
|
+
@working_dir = PhusionPassenger::Utils.mktmpdir("passenger.", PlatformInfo.tmpexedir)
|
128
127
|
end
|
129
128
|
|
130
129
|
def after_install
|
131
130
|
super
|
132
|
-
FileUtils.
|
131
|
+
FileUtils.remove_entry_secure(@working_dir) if @working_dir
|
133
132
|
end
|
134
133
|
|
135
134
|
private
|
data/build/common_library.rb
CHANGED
@@ -207,7 +207,8 @@ end
|
|
207
207
|
# If you add a new shared definition file, don't forget to update
|
208
208
|
# lib/phusion_passenger/packaging.rb!
|
209
209
|
|
210
|
-
|
210
|
+
dependencies = ['ext/common/Constants.h.erb', 'lib/phusion_passenger.rb', 'lib/phusion_passenger/constants.rb']
|
211
|
+
file 'ext/common/Constants.h' => dependencies do
|
211
212
|
require 'phusion_passenger/constants'
|
212
213
|
template = TemplateRenderer.new('ext/common/Constants.h.erb')
|
213
214
|
template.render_to('ext/common/Constants.h')
|
data/ext/common/Constants.h
CHANGED
data/lib/phusion_passenger.rb
CHANGED
@@ -29,7 +29,7 @@ module PhusionPassenger
|
|
29
29
|
###### Version numbers ######
|
30
30
|
|
31
31
|
PACKAGE_NAME = 'passenger'
|
32
|
-
VERSION_STRING = '4.0.
|
32
|
+
VERSION_STRING = '4.0.5'
|
33
33
|
|
34
34
|
PREFERRED_NGINX_VERSION = '1.4.1'
|
35
35
|
NGINX_SHA256_CHECKSUM = 'bca5d1e89751ba29406185e1736c390412603a7e6b604f5b4575281f6565d119'
|
@@ -111,7 +111,7 @@ class ServerInstance
|
|
111
111
|
instances = []
|
112
112
|
|
113
113
|
Dir["#{AdminTools.tmpdir}/passenger.*"].each do |dir|
|
114
|
-
next if File.basename(dir) !~ /passenger\.#{PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION}\.(\d+)\.(
|
114
|
+
next if File.basename(dir) !~ /passenger\.#{PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION}\.(\d+)\.(.+)\Z/
|
115
115
|
minor = $1
|
116
116
|
next if minor.to_i > PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MINOR_VERSION
|
117
117
|
|
@@ -21,6 +21,8 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
22
|
# THE SOFTWARE.
|
23
23
|
|
24
|
+
require 'phusion_passenger/utils/tmpio'
|
25
|
+
|
24
26
|
module PhusionPassenger
|
25
27
|
|
26
28
|
# This module autodetects various platform-specific information, and
|
@@ -149,20 +151,18 @@ private
|
|
149
151
|
private_class_method :reindent
|
150
152
|
|
151
153
|
def self.create_temp_file(name, dir = tmpdir)
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
f.close if !f.closed?
|
165
|
-
File.unlink(filename) if File.exist?(filename)
|
154
|
+
# This function is mostly used for compiling C programs to autodetect
|
155
|
+
# system properties. We create a secure temp subdirectory to prevent
|
156
|
+
# TOCTU attacks, especially because we don't know how the compiler
|
157
|
+
# handles this.
|
158
|
+
PhusionPassenger::Utils.mktmpdir("passenger.", dir) do |subdir|
|
159
|
+
filename = "#{subdir}/#{name}"
|
160
|
+
f = File.open(filename, "w")
|
161
|
+
begin
|
162
|
+
yield(filename, f)
|
163
|
+
ensure
|
164
|
+
f.close if !f.closed?
|
165
|
+
end
|
166
166
|
end
|
167
167
|
end
|
168
168
|
private_class_method :create_temp_file
|
@@ -279,16 +279,8 @@ module PlatformInfo
|
|
279
279
|
# headers are placed into the same directory as the Apache headers,
|
280
280
|
# and so 'apr-config' and 'apu-config' won't be necessary in that case.
|
281
281
|
def self.apr_config_needed_for_building_apache_modules?
|
282
|
-
|
283
|
-
|
284
|
-
f.puts("#include <apr.h>")
|
285
|
-
end
|
286
|
-
begin
|
287
|
-
return !system("(gcc #{apache2_module_cflags(false)} -c '#{filename}' -o '#{filename}.o') >/dev/null 2>/dev/null")
|
288
|
-
ensure
|
289
|
-
File.unlink(filename) rescue nil
|
290
|
-
File.unlink("#{filename}.o") rescue nil
|
291
|
-
end
|
282
|
+
return !try_compile("whether APR is needed for building Apache modules",
|
283
|
+
:c, "#include <apr.h>\n", apache2_module_cflags(false))
|
292
284
|
end
|
293
285
|
memoize :apr_config_needed_for_building_apache_modules?
|
294
286
|
|
@@ -180,9 +180,15 @@ private
|
|
180
180
|
|
181
181
|
def write_nginx_config_file
|
182
182
|
require 'phusion_passenger/platform_info/ruby'
|
183
|
-
|
183
|
+
require 'phusion_passenger/utils/tmpio'
|
184
|
+
@temp_dir = PhusionPassenger::Utils.mktmpdir(
|
185
|
+
"passenger.#{SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION}.#{SERVER_INSTANCE_DIR_STRUCTURE_MINOR_VERSION}.",
|
186
|
+
"/tmp")
|
187
|
+
@config_filename = "#{@temp_dir}/config"
|
188
|
+
location_config_filename = "#{@temp_dir}/locations.ini"
|
189
|
+
File.chmod(0755, @temp_dir)
|
184
190
|
|
185
|
-
File.open(
|
191
|
+
File.open(location_config_filename, 'w') do |f|
|
186
192
|
f.puts '[locations]'
|
187
193
|
f.puts "natively_packaged=false"
|
188
194
|
f.puts "bin=#{PhusionPassenger.bin_dir}"
|
@@ -200,7 +206,7 @@ private
|
|
200
206
|
f.puts "apache2_module=#{PhusionPassenger.apache2_module_path}"
|
201
207
|
f.puts "ruby_extension_source=#{PhusionPassenger.ruby_extension_source_dir}"
|
202
208
|
end
|
203
|
-
puts File.read(
|
209
|
+
puts File.read(location_config_filename) if debugging?
|
204
210
|
|
205
211
|
File.open(@config_filename, 'w') do |f|
|
206
212
|
f.chmod(0644)
|
@@ -238,9 +244,6 @@ private
|
|
238
244
|
def create_nginx_controller(extra_options = {})
|
239
245
|
require_daemon_controller
|
240
246
|
require 'socket' unless defined?(UNIXSocket)
|
241
|
-
@temp_dir = "/tmp/passenger.#{SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION}.#{SERVER_INSTANCE_DIR_STRUCTURE_MINOR_VERSION}.#{$$}"
|
242
|
-
@config_filename = "#{@temp_dir}/config"
|
243
|
-
@location_config_filename = "#{@temp_dir}/locations.ini"
|
244
247
|
if @options[:socket_file]
|
245
248
|
ping_spec = [:unix, @options[:socket_file]]
|
246
249
|
else
|
@@ -30,6 +30,7 @@ require 'phusion_passenger/common_library'
|
|
30
30
|
require 'phusion_passenger/platform_info/ruby'
|
31
31
|
require 'phusion_passenger/platform_info/binary_compatibility'
|
32
32
|
require 'phusion_passenger/standalone/utils'
|
33
|
+
require 'phusion_passenger/utils/tmpio'
|
33
34
|
|
34
35
|
module PhusionPassenger
|
35
36
|
module Standalone
|
@@ -199,16 +200,14 @@ protected
|
|
199
200
|
def before_install
|
200
201
|
super
|
201
202
|
@plugin.call_hook(:runtime_installer_start, self) if @plugin
|
202
|
-
@working_dir = "
|
203
|
-
FileUtils.rm_rf(@working_dir)
|
204
|
-
FileUtils.mkdir_p(@working_dir)
|
203
|
+
@working_dir = PhusionPassenger::Utils.mktmpdir("passenger.", PlatformInfo.tmpexedir)
|
205
204
|
@download_binaries = true if !defined?(@download_binaries)
|
206
205
|
@binaries_url_root ||= STANDALONE_BINARIES_URL_ROOT
|
207
206
|
end
|
208
207
|
|
209
208
|
def after_install
|
210
209
|
super
|
211
|
-
FileUtils.
|
210
|
+
FileUtils.remove_entry_secure(@working_dir) if @working_dir
|
212
211
|
@plugin.call_hook(:runtime_installer_cleanup) if @plugin
|
213
212
|
end
|
214
213
|
|
@@ -29,5 +29,40 @@ class TmpIO < File
|
|
29
29
|
end unless File.method_defined?(:size)
|
30
30
|
end
|
31
31
|
|
32
|
+
# Like Dir.mktmpdir, but creates shorter filenames.
|
33
|
+
def self.mktmpdir(prefix_suffix=nil, tmpdir=nil)
|
34
|
+
case prefix_suffix
|
35
|
+
when nil
|
36
|
+
prefix = "d"
|
37
|
+
suffix = ""
|
38
|
+
when String
|
39
|
+
prefix = prefix_suffix
|
40
|
+
suffix = ""
|
41
|
+
when Array
|
42
|
+
prefix = prefix_suffix[0]
|
43
|
+
suffix = prefix_suffix[1]
|
44
|
+
else
|
45
|
+
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
|
46
|
+
end
|
47
|
+
tmpdir ||= Dir.tmpdir
|
48
|
+
begin
|
49
|
+
path = "#{tmpdir}/#{prefix}#{rand(0x100000000).to_s(36)}"
|
50
|
+
path << suffix
|
51
|
+
Dir.mkdir(path, 0700)
|
52
|
+
rescue Errno::EEXIST
|
53
|
+
retry
|
54
|
+
end
|
55
|
+
|
56
|
+
if block_given?
|
57
|
+
begin
|
58
|
+
yield path
|
59
|
+
ensure
|
60
|
+
FileUtils.remove_entry_secure path
|
61
|
+
end
|
62
|
+
else
|
63
|
+
path
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
32
67
|
end # module Utils
|
33
68
|
end # module PhusionPassenger
|
@@ -10,10 +10,12 @@ worker_processes 1;
|
|
10
10
|
daemon on;
|
11
11
|
error_log '<%= @options[:log_file] %>' <% if debugging? %>info<% end %>;
|
12
12
|
pid '<%= @options[:pid_file] %>';
|
13
|
-
<% if
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
<% if Process.euid == 0 %>
|
14
|
+
<% if @options[:user] %>
|
15
|
+
user <%= @options[:user] %> <%= default_group_for(@options[:user]) %>;
|
16
|
+
<% else %>
|
17
|
+
user <%= current_user %> <%= default_group_for(current_user) %>;
|
18
|
+
<% end %>
|
17
19
|
<% end %>
|
18
20
|
|
19
21
|
events {
|
@@ -24,7 +26,7 @@ http {
|
|
24
26
|
log_format debug '[$time_local] $msec "$request" $status conn=$connection sent=$bytes_sent body_sent=$body_bytes_sent';
|
25
27
|
include '<%= PhusionPassenger.resources_dir %>/mime.types';
|
26
28
|
passenger_ruby <%= PlatformInfo.ruby_command %>;
|
27
|
-
passenger_root '<%=
|
29
|
+
passenger_root '<%= location_config_filename %>';
|
28
30
|
passenger_ctl server_instance_dir '<%= @temp_dir %>';
|
29
31
|
passenger_abort_on_startup_error on;
|
30
32
|
passenger_user_switching off;
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passenger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
metadata.gz.asc
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
|
3
3
|
Comment: GPGTools - http://gpgtools.org
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
=
|
5
|
+
iQEcBAABAgAGBQJRpgpHAAoJECrHRaUKISqMaUsH/36pNJGxryARsxpddPgRmhUh
|
6
|
+
iilOVBDcfD8kun8/OUdfaAdabr3AXsRJsTzYAeac7SM+6FQ2h7rPKOK4eyQCICPm
|
7
|
+
bgJ82TXu/TGbiSvzXrNGTg8Lx+xg0p+kv8jhbLN5zZoXFVPbFv0O6A6T8ExU7Fbr
|
8
|
+
qNJPFAMdnIN2X4qx6wbCz8mcUDuq8LrQ7wp85+WrsvTam9t6H3MHEnrewC25DTrD
|
9
|
+
hlay1dc7o1rb98Skz16rLdoPMiAO7VpBHzxpRBnarnnS0okHNLKzmNEyLGEwuUwj
|
10
|
+
WTptq1vvism04T/tY0+m0RZvc8Ev58ydWH6O2ZsI3M6Zu5iZkWqtBj+jU0oZcZQ=
|
11
|
+
=nU+e
|
12
12
|
-----END PGP SIGNATURE-----
|