summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFrancisco Javier López <fjlopez@gitlab.com>2019-07-02 18:38:23 +0200
committerFrancisco Javier López <fjlopez@gitlab.com>2019-07-15 09:21:20 +0200
commitf5c1cd489834e824c83f2ae909cd0dd41fb95dab (patch)
treebfbf073fae7b2a5dedb63118cc3865036a92c847 /lib
parente674a9d97822553c930062b9c5f4d4a349d39c11 (diff)
downloadgitlab-ce-f5c1cd489834e824c83f2ae909cd0dd41fb95dab.tar.gz
Fix Server Side Request Forgery mitigation bypass
When we can't resolve the hostname or it is invalid, we shouldn't even perform the request. This fix also fixes the problem the SSRF rebinding attack. We can't stub feature flags outside example blocks. Nevertheless, there are some actions that calls the UrlBlocker, that are performed outside example blocks, ie: `set` instruction. That's why we have to use some signalign mechanism outside the scope of the specs.
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/url_blocker.rb13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/gitlab/url_blocker.rb b/lib/gitlab/url_blocker.rb
index f6b2e2acf16..cc937cbb3cf 100644
--- a/lib/gitlab/url_blocker.rb
+++ b/lib/gitlab/url_blocker.rb
@@ -85,9 +85,9 @@ module Gitlab
# we'll be making the request to the IP address, instead of using the hostname.
def enforce_uri_hostname(addrs_info, uri, hostname, dns_rebind_protection)
address = addrs_info.first
- ip_address = address&.ip_address
+ ip_address = address.ip_address
- return [uri, nil] unless dns_rebind_protection && ip_address && ip_address != hostname
+ return [uri, nil] unless dns_rebind_protection && ip_address != hostname
uri = uri.dup
uri.hostname = ip_address
@@ -111,6 +111,15 @@ module Gitlab
addr.ipv6_v4mapped? ? addr.ipv6_to_ipv4 : addr
end
rescue SocketError
+ # In the test suite we use a lot of mocked urls that are either invalid or
+ # don't exist. In order to avoid modifying a ton of tests and factories
+ # we allow invalid urls unless the environment variable RSPEC_ALLOW_INVALID_URLS
+ # is not true
+ return if Rails.env.test? && ENV['RSPEC_ALLOW_INVALID_URLS'] == 'true'
+
+ # If the addr can't be resolved or the url is invalid (i.e http://1.1.1.1.1)
+ # we block the url
+ raise BlockedUrlError, "Host cannot be resolved or invalid"
end
def validate_local_request(address_info:, allow_localhost:, allow_local_network:)