sup 0.14.1 → 0.14.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 0.14.1.1 / 2013-10-29
2
+
3
+ * SBU1: security release
4
+ * Tempfiles for attachments are persistent through the sup process to
5
+ ensure that spawned processes have access to them.
6
+
7
+ == 0.13.2.1 / 2013-10-29
8
+
9
+ * SBU1: security release
10
+
1
11
  == 0.14.1 / 2013-08-31
2
12
 
3
13
  * Various bugfixes.
data/ReleaseNotes CHANGED
@@ -1,3 +1,29 @@
1
+ Release 0.14.1.1:
2
+
3
+ See 0.13.2.1.
4
+
5
+ Release 0.13.2.1:
6
+
7
+ Security advisory (#SBU1) for Sup
8
+
9
+ We have been notified of an potential exploit in the somewhat careless
10
+ way Sup treats attachment metadata in received e-mails. The issues
11
+ should now be fixed and I have released Sup 0.13.2.1 and 0.14.1.1 which
12
+ incorporates these fixes. Please upgrade immediately and also ensure
13
+ that your mime-decode or mime-view hooks are secure [0], [1].
14
+
15
+ This is specifically related to using quotes (',") around filename or
16
+ content_type which is already escaped using Ruby Shellwords.escape -
17
+ this means that the string (content_type, filename) is intended to be
18
+ used _without_ any further quotes. Please make sure that if you use
19
+ .mailcap (non OSX systems), you do not quote the string.
20
+
21
+ Credit goes to: joernchen of Phenoelit (http://phenoelit.de) who
22
+ discovered and suggested fixes for these issues.
23
+
24
+ [0] https://github.com/sup-heliotrope/sup/wiki/Viewing-Attachments
25
+ [1] https://github.com/sup-heliotrope/sup/wiki/Secure-usage-of-Sup
26
+
1
27
  Release 0.14.1:
2
28
 
3
29
  Service release to 0.14.0 plus a predefined 'All mail' search.
@@ -1,5 +1,6 @@
1
1
  require 'tempfile'
2
2
  require 'rbconfig'
3
+ require 'shellwords'
3
4
 
4
5
  ## Here we define all the "chunks" that a message is parsed
5
6
  ## into. Chunks are used by ThreadViewMode to render a message. Chunks
@@ -59,6 +60,8 @@ end
59
60
  module Redwood
60
61
  module Chunk
61
62
  class Attachment
63
+ ## please see note in write_to_disk on important usage
64
+ ## of quotes to avoid remote command injection.
62
65
  HookManager.register "mime-decode", <<EOS
63
66
  Decodes a MIME attachment into text form. The text will be displayed
64
67
  directly in Sup. For attachments that you wish to use a separate program
@@ -75,6 +78,9 @@ Return value:
75
78
  The decoded text of the attachment, or nil if not decoded.
76
79
  EOS
77
80
 
81
+
82
+ ## please see note in write_to_disk on important usage
83
+ ## of quotes to avoid remote command injection.
78
84
  HookManager.register "mime-view", <<EOS
79
85
  Views a non-text MIME attachment. This hook allows you to run
80
86
  third-party programs for attachments that require such a thing (e.g.
@@ -100,8 +106,18 @@ EOS
100
106
  attr_reader :content_type, :filename, :lines, :raw_content
101
107
  bool_reader :quotable
102
108
 
109
+ ## store tempfile objects as class variables so that they
110
+ ## are not removed when the viewing process returns. they
111
+ ## should be garbage collected when the class variable is removed.
112
+ @@view_tempfiles = []
113
+
103
114
  def initialize content_type, filename, encoded_content, sibling_types
104
115
  @content_type = content_type.downcase
116
+ if Shellwords.escape(@content_type) != @content_type
117
+ warn "content_type #{@content_type} is not safe, changed to application/octet-stream"
118
+ @content_type = 'application/octet-stream'
119
+ end
120
+
105
121
  @filename = filename
106
122
  @quotable = false # changed to true if we can parse it through the
107
123
  # mime-decode hook, or if it's plain text
@@ -116,7 +132,9 @@ EOS
116
132
  when /^text\/plain\b/
117
133
  @raw_content
118
134
  else
119
- HookManager.run "mime-decode", :content_type => content_type,
135
+ ## please see note in write_to_disk on important usage
136
+ ## of quotes to avoid remote command injection.
137
+ HookManager.run "mime-decode", :content_type => @content_type,
120
138
  :filename => lambda { write_to_disk },
121
139
  :charset => encoded_content.charset,
122
140
  :sibling_types => sibling_types
@@ -125,7 +143,13 @@ EOS
125
143
  @lines = nil
126
144
  if text
127
145
  text = text.transcode(encoded_content.charset || $encoding, text.encoding)
128
- @lines = text.gsub("\r\n", "\n").gsub(/\t/, " ").gsub(/\r/, "").split("\n")
146
+ begin
147
+ @lines = text.gsub("\r\n", "\n").gsub(/\t/, " ").gsub(/\r/, "").split("\n")
148
+ rescue Encoding::CompatibilityError
149
+ @lines = text.fix_encoding!.gsub("\r\n", "\n").gsub(/\t/, " ").gsub(/\r/, "").split("\n")
150
+ debug "error while decoding message text, falling back to default encoding, expect errors in encoding: #{text.fix_encoding!}"
151
+ end
152
+
129
153
  @quotable = true
130
154
  end
131
155
  end
@@ -147,11 +171,13 @@ EOS
147
171
  def initial_state; :open end
148
172
  def viewable?; @lines.nil? end
149
173
  def view_default! path
174
+ ## please see note in write_to_disk on important usage
175
+ ## of quotes to avoid remote command injection.
150
176
  case RbConfig::CONFIG['arch']
151
177
  when /darwin/
152
- cmd = "open '#{path}'"
178
+ cmd = "open #{path}"
153
179
  else
154
- cmd = "/usr/bin/run-mailcap --action=view '#{@content_type}:#{path}'"
180
+ cmd = "/usr/bin/run-mailcap --action=view #{@content_type}:#{path}"
155
181
  end
156
182
  debug "running: #{cmd.inspect}"
157
183
  BufferManager.shell_out(cmd)
@@ -159,17 +185,31 @@ EOS
159
185
  end
160
186
 
161
187
  def view!
162
- path = write_to_disk
163
- ret = HookManager.run "mime-view", :content_type => @content_type,
164
- :filename => path
165
- ret || view_default!(path)
188
+ ## please see note in write_to_disk on important usage
189
+ ## of quotes to avoid remote command injection.
190
+ write_to_disk do |file|
191
+
192
+ @@view_tempfiles.push file # make sure the tempfile is not garbage collected before sup stops
193
+
194
+ ret = HookManager.run "mime-view", :content_type => @content_type,
195
+ :filename => file.path
196
+ ret || view_default!(file.path)
197
+ end
166
198
  end
167
199
 
200
+ ## note that the path returned from write_to_disk is
201
+ ## Shellwords.escaped and is intended to be used without single
202
+ ## or double quotes. the use of either opens sup up for remote
203
+ ## code injection through the file name.
168
204
  def write_to_disk
169
- file = Tempfile.new(["sup", @filename.gsub("/", "_") || "sup-attachment"])
170
- file.print @raw_content
171
- file.close
172
- file.path
205
+ begin
206
+ file = Tempfile.new(["sup", Shellwords.escape(@filename.gsub("/", "_")) || "sup-attachment"])
207
+ file.print @raw_content
208
+ yield file if block_given?
209
+ return file.path
210
+ ensure
211
+ file.close
212
+ end
173
213
  end
174
214
 
175
215
  ## used when viewing the attachment as text
@@ -229,7 +269,7 @@ EOS
229
269
  class EnclosedMessage
230
270
  attr_reader :lines
231
271
  def initialize from, to, cc, date, subj
232
- @from = from ? "unknown sender" : from.full_adress
272
+ @from = from ? "unknown sender" : from.full_address
233
273
  @to = to ? "" : to.map { |p| p.full_address }.join(", ")
234
274
  @cc = cc ? "" : cc.map { |p| p.full_address }.join(", ")
235
275
  if date
data/lib/sup/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Redwood
2
- VERSION = "0.14.1"
2
+ VERSION = "0.14.1.1"
3
3
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.1
4
+ version: 0.14.1.1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 14
9
9
  - 1
10
- hash: -2902532426715311422
10
+ - 1
11
+ hash: -295629968094096073
11
12
  platform: ruby
12
13
  authors:
13
14
  - William Morgan
@@ -17,7 +18,7 @@ authors:
17
18
  autorequire:
18
19
  bindir: bin
19
20
  cert_chain: []
20
- date: 2013-08-31 00:00:00.000000000 Z
21
+ date: 2013-10-29 00:00:00.000000000 Z
21
22
  dependencies:
22
23
  - !ruby/object:Gem::Dependency
23
24
  name: xapian-ruby