From d0c5fe5fab72dc279720f11a243733d98cb42f11 Mon Sep 17 00:00:00 2001 From: Ernesto Puerta Date: Wed, 15 Jan 2020 13:54:26 +0100 Subject: [PATCH] [PATCH] mgr/dashboard: fix improper URL checking This change disables up-level references beyond the HTTP base directory. [CVE-2020-1699] Fixes: https://tracker.ceph.com/issues/43607 Signed-off-by: Ernesto Puerta Gbp-Pq: Name 0443e40c11280ba3b7efcba61522afa70c4f8158.patch --- src/pybind/mgr/dashboard/controllers/home.py | 5 +++++ src/pybind/mgr/dashboard/tests/test_home.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/pybind/mgr/dashboard/controllers/home.py b/src/pybind/mgr/dashboard/controllers/home.py index df1134093..82ad945d0 100644 --- a/src/pybind/mgr/dashboard/controllers/home.py +++ b/src/pybind/mgr/dashboard/controllers/home.py @@ -100,6 +100,11 @@ class HomeController(BaseController): base_dir = self._language_dir(langs) full_path = os.path.join(base_dir, path) + + # Block uplevel attacks + if not os.path.normpath(full_path).startswith(os.path.normpath(base_dir)): + raise cherrypy.HTTPError(403) # Forbidden + logger.debug("serving static content: %s", full_path) if 'Vary' in cherrypy.response.headers: cherrypy.response.headers['Vary'] = "{}, Accept-Language" diff --git a/src/pybind/mgr/dashboard/tests/test_home.py b/src/pybind/mgr/dashboard/tests/test_home.py index 341762572..14f6c90eb 100644 --- a/src/pybind/mgr/dashboard/tests/test_home.py +++ b/src/pybind/mgr/dashboard/tests/test_home.py @@ -31,3 +31,8 @@ class HomeTest(ControllerTestCase): self.assertStatus(200) logger.info(self.body) self.assertIn('', self.body.decode('utf-8')) + + def test_home_uplevel_check(self): + self._get('/../../../../../../etc/shadow') + self.assertStatus(403) + -- 2.30.2