Skip to content

Commit

Permalink
[1.11.x] Fixed CVE-2017-7234 -- Fixed open redirect vulnerability in …
Browse files Browse the repository at this point in the history
…views.static.serve().

This is a security fix.
  • Loading branch information
timgraham committed Apr 4, 2017
1 parent 839159b commit 001ff50
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 19 deletions.
22 changes: 4 additions & 18 deletions django/views/static.py
Expand Up @@ -12,9 +12,9 @@

from django.http import (
FileResponse, Http404, HttpResponse, HttpResponseNotModified,
HttpResponseRedirect,
)
from django.template import Context, Engine, TemplateDoesNotExist, loader
from django.utils._os import safe_join
from django.utils.http import http_date, parse_http_date
from django.utils.six.moves.urllib.parse import unquote
from django.utils.translation import ugettext as _, ugettext_lazy
Expand All @@ -36,25 +36,11 @@ def serve(request, path, document_root=None, show_indexes=False):
but if you'd like to override it, you can create a template called
``static/directory_index.html``.
"""
path = posixpath.normpath(unquote(path))
path = path.lstrip('/')
newpath = ''
for part in path.split('/'):
if not part:
# Strip empty path components.
continue
drive, part = os.path.splitdrive(part)
head, part = os.path.split(part)
if part in (os.curdir, os.pardir):
# Strip '.' and '..' in path.
continue
newpath = os.path.join(newpath, part).replace('\\', '/')
if newpath and path != newpath:
return HttpResponseRedirect(newpath)
fullpath = os.path.join(document_root, newpath)
path = posixpath.normpath(unquote(path)).lstrip('/')
fullpath = safe_join(document_root, path)
if os.path.isdir(fullpath):
if show_indexes:
return directory_index(newpath, fullpath)
return directory_index(path, fullpath)
raise Http404(_("Directory indexes are not allowed here."))
if not os.path.exists(fullpath):
raise Http404(_('"%(path)s" does not exist') % {'path': fullpath})
Expand Down
11 changes: 11 additions & 0 deletions docs/releases/1.10.7.txt
Expand Up @@ -6,6 +6,17 @@ Django 1.10.7 release notes

Django 1.10.7 fixes two security issues and a bug in 1.10.6.

CVE-2017-7234: Open redirect vulnerability in ``django.views.static.serve()``
=============================================================================

A maliciously crafted URL to a Django site using the
:func:`~django.views.static.serve` view could redirect to any other domain. The
view no longer does any redirects as they don't provide any known, useful
functionality.

Note, however, that this view has always carried a warning that it is not
hardened for production use and should be used only as a development aid.

Bugfixes
========

Expand Down
11 changes: 11 additions & 0 deletions docs/releases/1.8.18.txt
Expand Up @@ -5,3 +5,14 @@ Django 1.8.18 release notes
*April 4, 2017*

Django 1.8.18 fixes two security issues in 1.8.17.

CVE-2017-7234: Open redirect vulnerability in ``django.views.static.serve()``
=============================================================================

A maliciously crafted URL to a Django site using the
:func:`~django.views.static.serve` view could redirect to any other domain. The
view no longer does any redirects as they don't provide any known, useful
functionality.

Note, however, that this view has always carried a warning that it is not
hardened for production use and should be used only as a development aid.
11 changes: 11 additions & 0 deletions docs/releases/1.9.13.txt
Expand Up @@ -7,6 +7,17 @@ Django 1.9.13 release notes
Django 1.9.13 fixes two security issues and a bug in 1.9.12. This is the final
release of the 1.9.x series.

CVE-2017-7234: Open redirect vulnerability in ``django.views.static.serve()``
=============================================================================

A maliciously crafted URL to a Django site using the
:func:`~django.views.static.serve` view could redirect to any other domain. The
view no longer does any redirects as they don't provide any known, useful
functionality.

Note, however, that this view has always carried a warning that it is not
hardened for production use and should be used only as a development aid.

Bugfixes
========

Expand Down
2 changes: 1 addition & 1 deletion tests/view_tests/tests/test_static.py
Expand Up @@ -110,7 +110,7 @@ def test_404(self):

def test_index(self):
response = self.client.get('/%s/' % self.prefix)
self.assertContains(response, 'Index of /')
self.assertContains(response, 'Index of ./')


class StaticHelperTest(StaticTests):
Expand Down

0 comments on commit 001ff50

Please sign in to comment.