* SECURITY: Fix XSS in full name composer reply We are using htmlSafe when rendering the name field so we need to escape any html being passed in. * SECURITY: Monkey-patch web-push gem to use safer HTTP client `FinalDestination::HTTP` is our patch of `Net::HTTP` which defend us against SSRF and DNS rebinding attacks. * SECURITY: SSRF protection bypass with IPv4-mapped IPv6 addresses As part of this commit, we've also expanded our list of private IP ranges based on https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml and https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml * SECURITY: XSS on chat excerpts Non-markdown tags weren't being escaped in chat excerpts. This could be triggered by editing a chat message containing a tag (self XSS), or by replying to a chat message with a tag (XSS). Co-authored-by: Jan Cernik <jancernik12@gmail.com> * FIX: Escaped mentions in chat excerpts Mentions are now displayed as using the non-cooked message which fixes the problem. This is not ideal. I think we might want to rework how these excerpts are created and rendered in the near future. Co-authored-by: Jan Cernik <jancernik12@gmail.com> * SECURITY: Add FinalDestination::FastImage that's SSRF safe --------- Co-authored-by: Alan Guo Xiang Tan <gxtan1990@gmail.com> Co-authored-by: Jan Cernik <jancernik12@gmail.com> Co-authored-by: Ted Johansson <ted@discourse.org>
28 lines
1.0 KiB
Ruby
28 lines
1.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# This is a patch to avoid the direct use of `Net::HTTP` in the `webpush` gem and instead rely on `FinalDestination::HTTP`
|
|
# which protects us from DNS rebinding attacks as well as server side forgery requests.
|
|
#
|
|
# This patch is considered temporary until we can decide on a longer term solution. In the meantime, we need to patch
|
|
# the SSRF vulnerability being exposed by this gem.
|
|
module WebPushPatch
|
|
def perform
|
|
http = FinalDestination::HTTP.new(uri.host, uri.port, *proxy_options)
|
|
http.use_ssl = true
|
|
http.ssl_timeout = @options[:ssl_timeout] unless @options[:ssl_timeout].nil?
|
|
http.open_timeout = @options[:open_timeout] unless @options[:open_timeout].nil?
|
|
http.read_timeout = @options[:read_timeout] unless @options[:read_timeout].nil?
|
|
|
|
req = FinalDestination::HTTP::Post.new(uri.request_uri, headers)
|
|
req.body = body
|
|
|
|
resp = http.request(req)
|
|
verify_response(resp)
|
|
|
|
resp
|
|
end
|
|
end
|
|
|
|
klass = defined?(WebPush) ? WebPush : Webpush
|
|
klass::Request.prepend(WebPushPatch)
|