[java-identity-provider] branch dev/IDP-2183 updated: IDP-2183 - Use of JS in views needs to be hardened via CSP

Scott Cantor cantor.2 at osu.edu
Tue Oct 24 19:24:38 UTC 2023


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch dev/IDP-2183
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=8b2101741073b78f950e8e77ca9034d3a088590c

The following commit(s) were added to refs/heads/dev/IDP-2183 by this push:
     new 8b2101741 IDP-2183 - Use of JS in views needs to be hardened via CSP
8b2101741 is described below

commit 8b2101741073b78f950e8e77ca9034d3a088590c
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Oct 24 15:24:34 2023 -0400

    IDP-2183 - Use of JS in views needs to be hardened via CSP
    
    https://shibboleth.atlassian.net/browse/IDP-2183
    
    Replace setHeader with addHeader calls.
    Harden default CSP header with base-uri block.
---
 idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/filters.xml  | 2 +-
 .../src/main/resources/net/shibboleth/idp/module/conf/idp.properties  | 2 +-
 .../src/main/resources/net/shibboleth/idp/module/views/admin/hello.vm | 2 +-
 .../resources/net/shibboleth/idp/module/views/admin/unlock-keys.vm    | 2 +-
 .../shibboleth/idp/module/views/client-storage/client-storage-read.vm | 4 ++--
 .../idp/module/views/client-storage/client-storage-write.vm           | 4 ++--
 .../src/main/resources/net/shibboleth/idp/module/views/error.vm       | 2 +-
 .../net/shibboleth/idp/module/views/intercept/attribute-release.vm    | 2 +-
 .../net/shibboleth/idp/module/views/intercept/expiring-password.vm    | 2 +-
 .../net/shibboleth/idp/module/views/intercept/impersonate.vm          | 2 +-
 .../net/shibboleth/idp/module/views/intercept/terms-of-use.vm         | 2 +-
 .../src/main/resources/net/shibboleth/idp/module/views/login.vm       | 2 +-
 .../main/resources/net/shibboleth/idp/module/views/logout-complete.vm | 2 +-
 .../resources/net/shibboleth/idp/module/views/logout-propagate.vm     | 2 +-
 .../src/main/resources/net/shibboleth/idp/module/views/logout.vm      | 2 +-
 .../resources/net/shibboleth/idp/module/views/spnego-unavailable.vm   | 2 +-
 .../src/main/resources/net/shibboleth/idp/module/views/user-prefs.vm  | 4 ++--
 .../src/main/resources/net/shibboleth/idp/views/logout/propagate.vm   | 2 +-
 .../src/main/resources/net/shibboleth/idp/views/logout/saml-async.vm  | 2 +-
 19 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/filters.xml b/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/filters.xml
index 2b1cfa9a4..704cff616 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/filters.xml
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/conf/filters.xml
@@ -23,7 +23,7 @@
             <map>
                 <entry key="Strict-Transport-Security" value="%{idp.hsts:max-age=31536000}" />
                 <entry key="X-Frame-Options" value="%{idp.frameoptions:DENY}" />
-                <entry key="Content-Security-Policy" value="%{idp.csp:frame-ancestors 'none';}"/>
+                <entry key="Content-Security-Policy" value="%{idp.csp:frame-ancestors 'none'; base-uri 'none';}"/>
             </map>
         </property>
     </bean>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/idp.properties b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/idp.properties
index d91c58d67..ca5cb4ec3 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/idp.properties
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/conf/idp.properties
@@ -46,7 +46,7 @@ idp.csrf.enabled = true
 # X-Frame-Options value, set to DENY or SAMEORIGIN to block framing
 #idp.frameoptions = DENY
 # Content-Security-Policy value, set to match X-Frame-Options default
-#idp.csp = frame-ancestors 'none';
+#idp.csp = frame-ancestors 'none'; base-uri 'none';
 
 # Set to false to disable filter that forcibly applies UTF-8 encoding
 #idp.encoding.forceUTF8 = true
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/hello.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/hello.vm
index 67dc673b5..200f1d47a 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/hello.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/hello.vm
@@ -12,7 +12,7 @@
 ## environment - Spring Environment object for property resolution
 ## custom - arbitrary object injected by deployer
 ##
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/unlock-keys.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/unlock-keys.vm
index a124a62b4..447f03162 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/unlock-keys.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/admin/unlock-keys.vm
@@ -13,7 +13,7 @@
 #set ($titleSuffix = $springMacroRequestContext.getMessage("idp.unlock-keys.title", "Attended Restart Key Unlock"))
 #set ($eventId = $profileRequestContext.getSubcontext("org.opensaml.profile.context.EventContext").getEvent())
 #set ($state = $flowRequestContext.getCurrentState().getId())
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-read.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-read.vm
index 8bfe9a299..882b22217 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-read.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-read.vm
@@ -17,10 +17,10 @@
 #set ($titleSuffix = $springMacroRequestContext.getMessage("idp.client-storage-read.suffix", "Loading Session Information"))
 ##
 #set ($onLoad = "doLoad()")
-$response.setHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)'")
+$response.addHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)'")
 ## Nonce for dynanmic scripts.
 #set ($nonce = $cspNonce.generateIdentifier())
-$response.setHeader("Content-Security-Policy", "script-src-elem 'nonce-$nonce'")
+$response.addHeader("Content-Security-Policy", "script-src-elem 'nonce-$nonce'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-write.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-write.vm
index f03a249ef..dc673368e 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-write.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/client-storage/client-storage-write.vm
@@ -17,10 +17,10 @@
 #set ($titleSuffix = $springMacroRequestContext.getMessage("idp.client-storage-write.suffix", "Saving Session Information..."))
 ##
 #set ($onLoad = "doSave()")
-$response.setHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)'")
+$response.addHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)'")
 ## Nonce for dynanmic scripts.
 #set ($nonce = $cspNonce.generateIdentifier())
-$response.setHeader("Content-Security-Policy", "script-src-elem 'nonce-$nonce'")
+$response.addHeader("Content-Security-Policy", "script-src-elem 'nonce-$nonce'")
 <!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/error.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/error.vm
index f3b53c419..efc943148 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/error.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/error.vm
@@ -47,7 +47,7 @@
     $response.setStatus(500)
 #end
 ##
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/attribute-release.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/attribute-release.vm
index 32f9e30f7..3e9e547fa 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/attribute-release.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/attribute-release.vm
@@ -25,7 +25,7 @@
 #set ($rpOrganizationName = $rpUIContext.organizationDisplayName)
 #set ($replaceDollarWithNewline = true)
 ##
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/expiring-password.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/expiring-password.vm
index 4523ab4c9..665c96707 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/expiring-password.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/expiring-password.vm
@@ -16,7 +16,7 @@
 ## environment - Spring Environment object for property resolution
 ## custom - arbitrary object injected by deployer
 ##
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/impersonate.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/impersonate.vm
index 8e4b40786..192be8904 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/impersonate.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/impersonate.vm
@@ -14,7 +14,7 @@
 ## custom - arbitrary object injected by deployer
 ##
 #set ($rpContext = $profileRequestContext.getSubcontext('net.shibboleth.profile.context.RelyingPartyContext'))
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/terms-of-use.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/terms-of-use.vm
index c3a0460d2..63e40ed07 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/terms-of-use.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/intercept/terms-of-use.vm
@@ -15,7 +15,7 @@
 #set ($serviceName = $rpUIContext.serviceName)
 #set ($rpOrganizationLogo = $rpUIContext.getLogo())
 ##
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/login.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/login.vm
index 2ed0cd253..43965dc80 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/login.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/login.vm
@@ -23,7 +23,7 @@
 #set ($username = $authenticationContext.getSubcontext('net.shibboleth.idp.authn.context.UsernamePasswordContext', true).getUsername())
 ##
 #set ($onClick = "this.childNodes[0].nodeValue='#springMessageText('idp.login.pleasewait', 'Logging in, please wait...')'")
-$response.setHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onClick)'")
+$response.addHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onClick)'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-complete.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-complete.vm
index 93e9ac9ea..fcadf0c0f 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-complete.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-complete.vm
@@ -18,7 +18,7 @@
 ##
 #set ($activeIdPSessions = $logoutContext and !$logoutContext.getIdPSessions().isEmpty())
 #set ($activeSPSessions = $logoutContext and !$logoutContext.getSessionMap().isEmpty())
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'; base-uri 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-propagate.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-propagate.vm
index 675968882..e2fdc41ba 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-propagate.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout-propagate.vm
@@ -19,7 +19,7 @@
 ## custom - arbitrary object injected by deployer
 ##
 #set ($hidden = $environment.getProperty("idp.logout.propagationHidden", "false"))
-$response.setHeader("Content-Security-Policy", "script-src 'unsafe-inline' 'self'")
+$response.addHeader("Content-Security-Policy", "base-uri 'none'; script-src 'unsafe-inline' 'self'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout.vm
index dc2397cb0..f5e6d0cc4 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/logout.vm
@@ -22,7 +22,7 @@
 #end
 #set ($promptForIdP = $logoutContext and !$logoutContext.getIdPSessions().isEmpty())
 #set ($promptForSP = $logoutContext and !$logoutContext.getSessionMap().isEmpty())
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'; base-uri 'none'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/spnego-unavailable.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/spnego-unavailable.vm
index 6fed743b6..0a8c92a36 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/spnego-unavailable.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/spnego-unavailable.vm
@@ -15,7 +15,7 @@
 ##
 #set ($eventKey = $springMacroRequestContext.getMessage("SPNEGOUnavailable", "spnego-unavailable"))
 #set ($onLoad = "window.location = '$errorUrl'")
-$response.setHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)'")
+$response.addHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)'")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/user-prefs.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/user-prefs.vm
index d790ddb1a..becd24fc4 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/user-prefs.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/module/views/user-prefs.vm
@@ -12,9 +12,9 @@
 ##
 #set ($onLoad = "load('spnego')")
 #set ($onClick = "check(this)")
-$response.setHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)','sha256-$cspDigester.apply($onClick)'")
+$response.addHeader("Content-Security-Policy", "script-src-attr 'unsafe-hashes' 'sha256-$cspDigester.apply($onLoad)','sha256-$cspDigester.apply($onClick)'")
 ## Hash of user-prefs.js (being injected inline below).
-$response.setHeader("Content-Security-Policy", "script-src-elem 'unsafe-hashes' 'sha256-mXQMhpzvwZ/f5iKzcm/iFe50L/0b7cNjsvcFVu/PMTg='")
+$response.addHeader("Content-Security-Policy", "script-src-elem 'unsafe-hashes' 'sha256-mXQMhpzvwZ/f5iKzcm/iFe50L/0b7cNjsvcFVu/PMTg='")
 <!DOCTYPE html>
 <html>
     <head>
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/propagate.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/propagate.vm
index 34db86bf0..8b2a454cf 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/propagate.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/propagate.vm
@@ -50,7 +50,7 @@
         #end
     </ol>
     <script src="$request.getContextPath()/js/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="></script>
-    <script>
+    <script #if ($nonce)nonce="$nonce"#end>
     <!--
         function check_status() {
             // Check every property of the object.
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/saml-async.vm b/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/saml-async.vm
index 836f51251..49b9d2021 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/saml-async.vm
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/views/logout/saml-async.vm
@@ -9,7 +9,7 @@
 ## environment - Spring Environment object for property resolution
 ## custom - arbitrary object injected by deployer
 ##
-$response.setHeader("Content-Security-Policy", "script-src 'none'")
+$response.addHeader("Content-Security-Policy", "script-src 'none'; base-uri 'none'")
 <!DOCTYPE html>
 <html>
 <head>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list