diff --git a/tensorboard/backend/http_util.py b/tensorboard/backend/http_util.py index fc9850bb97..66c56e1edc 100644 --- a/tensorboard/backend/http_util.py +++ b/tensorboard/backend/http_util.py @@ -201,6 +201,7 @@ def Respond(request, "'self'", *_CSP_FONT_DOMAINS_WHITELIST ), + 'frame-ancestors *', # Dynamic plugins are rendered inside an iframe. "frame-src 'self'", # data uri used by favicon diff --git a/tensorboard/backend/http_util_test.py b/tensorboard/backend/http_util_test.py index ff7c2c7eb6..eaaa76cb43 100644 --- a/tensorboard/backend/http_util_test.py +++ b/tensorboard/backend/http_util_test.py @@ -192,7 +192,7 @@ def testCsp(self): r = http_util.Respond( q, 'hello', 'text/html', csp_scripts_sha256s=['abcdefghi']) expected_csp = ( - "default-src 'self';font-src 'self';" + "default-src 'self';font-src 'self';frame-ancestors *;" "frame-src 'self';img-src 'self' data:;object-src 'none';" "style-src https://www.gstatic.com data: 'unsafe-inline';" "script-src 'self' 'unsafe-eval' 'sha256-abcdefghi'" @@ -204,7 +204,7 @@ def testCsp_noHash(self): q = wrappers.Request(wtest.EnvironBuilder().get_environ()) r = http_util.Respond(q, 'hello', 'text/html', csp_scripts_sha256s=None) expected_csp = ( - "default-src 'self';font-src 'self';" + "default-src 'self';font-src 'self';frame-ancestors *;" "frame-src 'self';img-src 'self' data:;object-src 'none';" "style-src https://www.gstatic.com data: 'unsafe-inline';" "script-src 'none'" @@ -216,7 +216,7 @@ def testCsp_onlySelf(self): q = wrappers.Request(wtest.EnvironBuilder().get_environ()) r = http_util.Respond(q, 'hello', 'text/html', csp_scripts_sha256s=None) expected_csp = ( - "default-src 'self';font-src 'self';" + "default-src 'self';font-src 'self';frame-ancestors *;" "frame-src 'self';img-src 'self' data:;object-src 'none';" "style-src https://www.gstatic.com data: 'unsafe-inline';" "script-src 'self'" @@ -229,7 +229,7 @@ def testCsp_disableUnsafeEval(self): r = http_util.Respond( q, 'hello', 'text/html', csp_scripts_sha256s=['abcdefghi']) expected_csp = ( - "default-src 'self';font-src 'self';" + "default-src 'self';font-src 'self';frame-ancestors *;" "frame-src 'self';img-src 'self' data:;object-src 'none';" "style-src https://www.gstatic.com data: 'unsafe-inline';" "script-src 'self' 'sha256-abcdefghi'" @@ -244,7 +244,7 @@ def testCsp_globalDomainWhiteList(self): q = wrappers.Request(wtest.EnvironBuilder().get_environ()) r = http_util.Respond(q, 'hello', 'text/html', csp_scripts_sha256s=['abcd']) expected_csp = ( - "default-src 'self';font-src 'self';" + "default-src 'self';font-src 'self';frame-ancestors *;" "frame-src 'self';img-src 'self' data: https://example.com;object-src 'none';" "style-src https://www.gstatic.com data: 'unsafe-inline' https://googol.com;" "script-src https://tensorflow.org/tensorboard 'self' 'unsafe-eval' "