8000 [3.1.x] Fixed CVE-2021-33203 -- Fixed potential path-traversal via ad… · django/django@20c67a0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 20c67a0

Browse files
apollo13carltongibson
authored andcommitted
[3.1.x] Fixed CVE-2021-33203 -- Fixed potential path-traversal via admindocs' TemplateDetailView.
1 parent aa8781c commit 20c67a0

File tree

4 files changed

+40
-3
lines changed

4 files changed

+40
-3
lines changed

django/contrib/admindocs/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from django.http import Http404
1717
from django.template.engine import Engine
1818
from django.urls import get_mod_func, get_resolver, get_urlconf
19+
from django.utils._os import safe_join
1920
from django.utils.decorators import method_decorator
2021
from django.utils.inspect import (
2122
func_accepts_kwargs, func_accepts_var_args, get_func_full_args,
@@ -329,7 +330,7 @@ def get_context_data(self, **kwargs):
329330
else:
330331
# This doesn't account for template loaders (#24128).
331332
for index, directory in enumerate(default_engine.dirs):
332-
template_file = Path(directory) / template
333+
template_file = Path(safe_join(directory, template))
333334
if template_file.exists():
334335
template_contents = template_file.read_text()
335336
else:

docs/releases/2.2.24.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,14 @@ Django 2.2.24 release notes
66

77
Django 2.2.24 fixes two security issues in 2.2.23.
88

9-
...
9+
CVE-2021-33203: Potential directory traversal via ``admindocs``
10+
===============================================================
11+
12+
Staff members could use the :mod:`~django.contrib.admindocs`
13+
``TemplateDetailView`` view to check the existence of arbitrary files.
14+
Additionally, if (and only if) the default admindocs templates have been
15+
customized by the developers to also expose the file contents, then not only
16+
the existence but also the file contents would have been exposed.
17+
18+
As a mitigation, path sanitation is now applied and only files within the
19+
template root directories can be loaded.

docs/releases/3.1.12.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,14 @@ Django 3.1.12 release notes
66

77
Django 3.1.12 fixes two security issues in 3.1.11.
88

9-
...
9+
CVE-2021-33203: Potential directory traversal via ``admindocs``
10+
===============================================================
11+
12+
Staff members could use the :mod:`~django.contrib.admindocs`
13+
``TemplateDetailView`` view to check the existence of arbitrary files.
14+
Additionally, if (and only if) the default admindocs templates have been
15+
customized by the developers to also expose the file contents, then not only
16+
the existence but also the file contents would have been exposed.
17+
18+
As a mitigation, path sanitation is now applied and only files within the
19+
template root directories can be loaded.

tests/admin_docs/test_views.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,22 @@ def test_no_sites_framework(self):
137137
self.assertContains(response, 'View documentation')
138138

139139

140+
@unittest.skipUnless(utils.docutils_is_available, 'no docutils installed.')
141+
class AdminDocViewDefaultEngineOnly(TestDataMixin, AdminDocsTestCase):
142+
143+
def setUp(self):
144+
self.client.force_login(self.superuser)
145+
146+
def test_template_detail_path_traversal(self):
147+
cases = ['/etc/passwd', '../passwd']
148+
for fpath in cases:
149+
with self.subTest(path=fpath):
150+
64F0 response = self.client.get(
151+
reverse('django-admindocs-templates', args=[fpath]),
152+
)
153+
self.assertEqual(response.status_code, 400)
154+
155+
140156
@override_settings(TEMPLATES=[{
141157
'NAME': 'ONE',
142158
'BACKEND': 'django.template.backends.django.DjangoTemplates',

0 commit comments

Comments
 (0)
0