File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1515from django .http import Http404
1616from django .template .engine import Engine
1717from django .urls import get_mod_func , get_resolver , get_urlconf
18+ from django .utils ._os import safe_join
1819from django .utils .decorators import method_decorator
1920from django .utils .inspect import (
2021 func_accepts_kwargs , func_accepts_var_args , get_func_full_args ,
@@ -328,7 +329,7 @@ def get_context_data(self, **kwargs):
328329 else :
329330 # This doesn't account for template loaders (#24128).
330331 for index , directory in enumerate (default_engine .dirs ):
331- template_file = Path (directory ) / template
332+ template_file = Path (safe_join ( directory , template ))
332333 if template_file .exists ():
333334 with template_file .open () as f :
334335 template_contents = f .read ()
Original file line number Diff line number Diff line change @@ -6,4 +6,14 @@ Django 2.2.24 release notes
66
77Django 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.
Original file line number Diff line number Diff line change @@ -134,6 +134,22 @@ def test_no_sites_framework(self):
134134 self .assertContains (response , 'View documentation' )
135135
136136
137+ @unittest .skipUnless (utils .docutils_is_available , 'no docutils installed.' )
138+ class AdminDocViewDefaultEngineOnly (TestDataMixin , AdminDocsTestCase ):
139+
140+ def setUp (self ):
141+ self .client .force_login (self .superuser )
142+
143+ def test_template_detail_path_traversal (self ):
144+ cases = ['/etc/passwd' , '../passwd' ]
145+ for fpath in cases :
146+ with self .subTest (path = fpath ):
147+ response = self .client .get (
148+ reverse ('django-admindocs-templates' , args = [fpath ]),
149+ )
150+ self .assertEqual (response .status_code , 400 )
151+
152+
137153@override_settings (TEMPLATES = [{
138154 'NAME' : 'ONE' ,
139155 'BACKEND' : 'django.template.backends.django.DjangoTemplates' ,
You can’t perform that action at this time.
0 commit comments