Commit b067dc7f authored by Arturo Herrero's avatar Arturo Herrero Committed by Bob Van Landuyt

HTTP connection adapter with proxy settings

This updates the HTTPConnectionAdapter to prevent any SSRF protection
bypass when using the proxy settings.
parent de3c64af
...@@ -11,13 +11,18 @@ ...@@ -11,13 +11,18 @@
# This option will take precedence over the global setting. # This option will take precedence over the global setting.
module Gitlab module Gitlab
class HTTPConnectionAdapter < HTTParty::ConnectionAdapter class HTTPConnectionAdapter < HTTParty::ConnectionAdapter
extend ::Gitlab::Utils::Override
override :connection
def connection def connection
begin @uri, hostname = validate_url!(uri)
@uri, hostname = Gitlab::UrlBlocker.validate!(uri, allow_local_network: allow_local_requests?,
allow_localhost: allow_local_requests?, if options.key?(:http_proxyaddr)
dns_rebind_protection: dns_rebind_protection?) proxy_uri_with_port = uri_with_port(options[:http_proxyaddr], options[:http_proxyport])
rescue Gitlab::UrlBlocker::BlockedUrlError => e proxy_uri_validated = validate_url!(proxy_uri_with_port).first
raise Gitlab::HTTP::BlockedUrlError, "URL '#{uri}' is blocked: #{e.message}"
@options[:http_proxyaddr] = proxy_uri_validated.omit(:port).to_s
@options[:http_proxyport] = proxy_uri_validated.port
end end
super.tap do |http| super.tap do |http|
...@@ -27,6 +32,14 @@ module Gitlab ...@@ -27,6 +32,14 @@ module Gitlab
private private
def validate_url!(url)
Gitlab::UrlBlocker.validate!(url, allow_local_network: allow_local_requests?,
allow_localhost: allow_local_requests?,
dns_rebind_protection: dns_rebind_protection?)
rescue Gitlab::UrlBlocker::BlockedUrlError => e
raise Gitlab::HTTP::BlockedUrlError, "URL '#{url}' is blocked: #{e.message}"
end
def allow_local_requests? def allow_local_requests?
options.fetch(:allow_local_requests, allow_settings_local_requests?) options.fetch(:allow_local_requests, allow_settings_local_requests?)
end end
...@@ -40,5 +53,11 @@ module Gitlab ...@@ -40,5 +53,11 @@ module Gitlab
def allow_settings_local_requests? def allow_settings_local_requests?
Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services? Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services?
end end
def uri_with_port(address, port)
uri = Addressable::URI.parse(address)
uri.port = port if port.present?
uri
end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment