Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
D
django
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
django
Commits
7fe2d8d9
Kaydet (Commit)
7fe2d8d9
authored
Eki 17, 2016
tarafından
Tim Graham
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Fixed CVE-2016-9014 -- Validated Host header when DEBUG=True.
This is a security fix.
üst
da7910d4
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
95 additions
and
21 deletions
+95
-21
request.py
django/http/request.py
+5
-4
settings.txt
docs/ref/settings.txt
+8
-2
1.10.3.txt
docs/releases/1.10.3.txt
+22
-0
1.8.16.txt
docs/releases/1.8.16.txt
+22
-0
1.9.11.txt
docs/releases/1.9.11.txt
+22
-0
tests.py
tests/csrf_tests/tests.py
+1
-1
tests.py
tests/requests/tests.py
+15
-14
No files found.
django/http/request.py
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -96,12 +96,13 @@ class HttpRequest(object):
"""Return the HTTP host using the environment or request headers."""
host
=
self
.
_get_raw_host
()
# There is no hostname validation when DEBUG=True
if
settings
.
DEBUG
:
return
host
# Allow variants of localhost if ALLOWED_HOSTS is empty and DEBUG=True.
allowed_hosts
=
settings
.
ALLOWED_HOSTS
if
settings
.
DEBUG
and
not
allowed_hosts
:
allowed_hosts
=
[
'localhost'
,
'127.0.0.1'
,
'[::1]'
]
domain
,
port
=
split_domain_port
(
host
)
if
domain
and
validate_host
(
domain
,
settings
.
ALLOWED_HOSTS
):
if
domain
and
validate_host
(
domain
,
allowed_hosts
):
return
host
else
:
msg
=
"Invalid HTTP_HOST header:
%
r."
%
host
...
...
docs/ref/settings.txt
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -90,8 +90,10 @@ If the ``Host`` header (or ``X-Forwarded-Host`` if
list, the :meth:`django.http.HttpRequest.get_host()` method will raise
:exc:`~django.core.exceptions.SuspiciousOperation`.
When :setting:`DEBUG` is ``True``, host validation is disabled; any host will
be accepted. ``ALLOWED_HOSTS`` is :ref:`checked when running tests
When :setting:`DEBUG` is ``True`` and ``ALLOWED_HOSTS`` is empty, the host
is validated against ``['localhost', '127.0.0.1', '[::1]']``.
``ALLOWED_HOSTS`` is also :ref:`checked when running tests
<topics-testing-advanced-multiple-hosts>`.
This validation only applies via :meth:`~django.http.HttpRequest.get_host()`;
...
...
@@ -102,6 +104,10 @@ are bypassing this security protection.
In older versions, ``ALLOWED_HOSTS`` wasn't checked when running tests.
In older versions, ``ALLOWED_HOSTS`` wasn't checked if ``DEBUG=True``.
This was also changed in Django 1.10.3, 1.9.11, and 1.8.16 to prevent a
DNS rebinding attack.
.. setting:: APPEND_SLASH
``APPEND_SLASH``
...
...
docs/releases/1.10.3.txt
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -20,6 +20,28 @@ the ``manage.py test --keepdb`` option or if the user has an active session
A randomly generated password is now used for each test run.
DNS rebinding vulnerability when ``DEBUG=True``
===============================================
Older versions of Django don't validate the ``Host`` header against
``settings.ALLOWED_HOSTS`` when ``settings.DEBUG=True``. This makes them
vulnerable to a `DNS rebinding attack
<http://benmmurphy.github.io/blog/2016/07/11/rails-webconsole-dns-rebinding/>`_.
While Django doesn't ship a module that allows remote code execution, this is
at least a cross-site scripting vector, which could be quite serious if
developers load a copy of the production database in development or connect to
some production services for which there's no development instance, for
example. If a project uses a package like the ``django-debug-toolbar``, then
the attacker could execute arbitrary SQL, which could be especially bad if the
developers connect to the database with a superuser account.
``settings.ALLOWED_HOSTS`` is now validated regardless of ``DEBUG``. For
convenience, if ``ALLOWED_HOSTS`` is empty and ``DEBUG=True``, the following
variations of localhost are allowed ``['localhost', '127.0.0.1', '::1']``. If
your local settings file has your production ``ALLOWED_HOSTS`` value, you must
now omit it to get those fallback values.
Bugfixes
========
...
...
docs/releases/1.8.16.txt
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -19,3 +19,25 @@ the ``manage.py test --keepdb`` option or if the user has an active session
(such as an attacker's connection).
A randomly generated password is now used for each test run.
DNS rebinding vulnerability when ``DEBUG=True``
===============================================
Older versions of Django don't validate the ``Host`` header against
``settings.ALLOWED_HOSTS`` when ``settings.DEBUG=True``. This makes them
vulnerable to a `DNS rebinding attack
<http://benmmurphy.github.io/blog/2016/07/11/rails-webconsole-dns-rebinding/>`_.
While Django doesn't ship a module that allows remote code execution, this is
at least a cross-site scripting vector, which could be quite serious if
developers load a copy of the production database in development or connect to
some production services for which there's no development instance, for
example. If a project uses a package like the ``django-debug-toolbar``, then
the attacker could execute arbitrary SQL, which could be especially bad if the
developers connect to the database with a superuser account.
``settings.ALLOWED_HOSTS`` is now validated regardless of ``DEBUG``. For
convenience, if ``ALLOWED_HOSTS`` is empty and ``DEBUG=True``, the following
variations of localhost are allowed ``['localhost', '127.0.0.1', '::1']``. If
your local settings file has your production ``ALLOWED_HOSTS`` value, you must
now omit it to get those fallback values.
docs/releases/1.9.11.txt
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -19,3 +19,25 @@ the ``manage.py test --keepdb`` option or if the user has an active session
(such as an attacker's connection).
A randomly generated password is now used for each test run.
DNS rebinding vulnerability when ``DEBUG=True``
===============================================
Older versions of Django don't validate the ``Host`` header against
``settings.ALLOWED_HOSTS`` when ``settings.DEBUG=True``. This makes them
vulnerable to a `DNS rebinding attack
<http://benmmurphy.github.io/blog/2016/07/11/rails-webconsole-dns-rebinding/>`_.
While Django doesn't ship a module that allows remote code execution, this is
at least a cross-site scripting vector, which could be quite serious if
developers load a copy of the production database in development or connect to
some production services for which there's no development instance, for
example. If a project uses a package like the ``django-debug-toolbar``, then
the attacker could execute arbitrary SQL, which could be especially bad if the
developers connect to the database with a superuser account.
``settings.ALLOWED_HOSTS`` is now validated regardless of ``DEBUG``. For
convenience, if ``ALLOWED_HOSTS`` is empty and ``DEBUG=True``, the following
variations of localhost are allowed ``['localhost', '127.0.0.1', '::1']``. If
your local settings file has your production ``ALLOWED_HOSTS`` value, you must
now omit it to get those fallback values.
tests/csrf_tests/tests.py
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -386,7 +386,7 @@ class CsrfViewMiddlewareTest(SimpleTestCase):
self
.
assertEqual
(
len
(
csrf_cookie
.
value
),
CSRF_TOKEN_LENGTH
)
self
.
_check_token_present
(
resp
,
csrf_id
=
csrf_cookie
.
value
)
@override_settings
(
DEBUG
=
True
)
@override_settings
(
DEBUG
=
True
,
ALLOWED_HOSTS
=
[
'www.example.com'
]
)
def
test_https_bad_referer
(
self
):
"""
Test that a POST HTTPS request with a bad referer is rejected
...
...
tests/requests/tests.py
Dosyayı görüntüle @
7fe2d8d9
...
...
@@ -779,21 +779,22 @@ class HostValidationTests(SimpleTestCase):
self
.
assertEqual
(
request
.
get_port
(),
'8080'
)
@override_settings
(
DEBUG
=
True
,
ALLOWED_HOSTS
=
[])
def
test_host_validation_disabled_in_debug_mode
(
self
):
"""If ALLOWED_HOSTS is empty and DEBUG is True, all hosts pass."""
request
=
HttpRequest
()
request
.
META
=
{
'HTTP_HOST'
:
'example.com'
,
}
self
.
assertEqual
(
request
.
get_host
(),
'example.com'
)
def
test_host_validation_in_debug_mode
(
self
):
"""
If ALLOWED_HOSTS is empty and DEBUG is True, variants of localhost are
allowed.
"""
valid_hosts
=
[
'localhost'
,
'127.0.0.1'
,
'[::1]'
]
for
host
in
valid_hosts
:
request
=
HttpRequest
()
request
.
META
=
{
'HTTP_HOST'
:
host
}
self
.
assertEqual
(
request
.
get_host
(),
host
)
# Invalid hostnames would normally raise a SuspiciousOperation,
# but we have DEBUG=True, so this check is disabled.
request
=
HttpRequest
()
request
.
META
=
{
'HTTP_HOST'
:
"invalid_hostname.com"
,
}
self
.
assertEqual
(
request
.
get_host
(),
"invalid_hostname.com"
)
# Other hostnames raise a SuspiciousOperation.
with
self
.
assertRaises
(
SuspiciousOperation
):
request
=
HttpRequest
()
request
.
META
=
{
'HTTP_HOST'
:
'example.com'
}
request
.
get_host
()
@override_settings
(
ALLOWED_HOSTS
=
[])
def
test_get_host_suggestion_of_allowed_host
(
self
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment