Skip to content

Commit 3a33cc0

Browse files
committed
Fixed SECURITY-3000
1 parent 6c0061b commit 3a33cc0

3 files changed

Lines changed: 56 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## [Unreleased]
44

5+
- Fixed security issue (SECURITY-3000).
6+
57
## [1.6.2] - 2022-05-29
68

79
- Added explicit dependency on JAXB plugin (JENKINS-68455).

src/main/java/org/jenkinsci/plugins/cas/spring/CasConfigurationContext.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.jenkinsci.plugins.cas.CasProtocol;
1111
import org.jenkinsci.plugins.cas.CasSecurityRealm;
1212
import org.jenkinsci.plugins.cas.spring.security.CasRestAuthenticator;
13+
import org.jenkinsci.plugins.cas.spring.security.CasSessionFixationProtectionStrategy;
1314
import org.jenkinsci.plugins.cas.spring.security.CasSingleSignOutFilter;
1415
import org.jenkinsci.plugins.cas.spring.security.CasUserDetailsService;
1516
import org.jenkinsci.plugins.cas.spring.security.DynamicServiceAuthenticationDetailsSource;
@@ -143,12 +144,13 @@ public CasSingleSignOutFilter casSingleSignOutFilter(CasSecurityRealm securityRe
143144
}
144145

145146
@Bean
146-
public CasAuthenticationFilter casAuthenticationFilter(AuthenticationManager casAuthenticationManager, DynamicServiceAuthenticationDetailsSource casAuthenticationDetailsSource, ServiceProperties casServiceProperties) {
147+
public CasAuthenticationFilter casAuthenticationFilter(AuthenticationManager casAuthenticationManager, DynamicServiceAuthenticationDetailsSource casAuthenticationDetailsSource, ServiceProperties casServiceProperties, SessionMappingStorage casSessionMappingStorage) {
147148
CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
148149
casAuthenticationFilter.setFilterProcessesUrl("/" + CasSecurityRealm.getFinishLoginUrl());
149150
casAuthenticationFilter.setAuthenticationManager(casAuthenticationManager);
150151
casAuthenticationFilter.setAuthenticationDetailsSource(casAuthenticationDetailsSource);
151152
casAuthenticationFilter.setServiceProperties(casServiceProperties);
153+
casAuthenticationFilter.setSessionAuthenticationStrategy(new CasSessionFixationProtectionStrategy(casSessionMappingStorage));
152154
casAuthenticationFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler("/" + CasSecurityRealm.getFailedLoginUrl()));
153155
casAuthenticationFilter.setAuthenticationSuccessHandler(new SessionUrlAuthenticationSuccessHandler("/"));
154156
casAuthenticationFilter.setContinueChainBeforeSuccessfulAuthentication(true); // Required to reach CasSecurityRealm.doFinishLogin()
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.jenkinsci.plugins.cas.spring.security;
2+
3+
import javax.servlet.http.HttpSession;
4+
5+
import org.jasig.cas.client.session.SessionMappingStorage;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.security.core.Authentication;
9+
import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
10+
11+
/**
12+
* Session fixation protection strategy that invalidates the existing session
13+
* and integrates with the Single Sign-Out session mapping storage.
14+
*
15+
* @author Fabien Crespel
16+
*/
17+
public class CasSessionFixationProtectionStrategy extends SessionFixationProtectionStrategy {
18+
19+
private static final Logger LOG = LoggerFactory.getLogger(CasSessionFixationProtectionStrategy.class);
20+
21+
protected SessionMappingStorage sessionStorage = null;
22+
23+
public CasSessionFixationProtectionStrategy() {
24+
}
25+
26+
public CasSessionFixationProtectionStrategy(SessionMappingStorage sessionStorage) {
27+
this.sessionStorage = sessionStorage;
28+
}
29+
30+
@Override
31+
protected void onSessionChange(String originalSessionId, HttpSession newSession, Authentication auth) {
32+
if (sessionStorage != null) {
33+
LOG.debug("Session changed, removing existing session with ID '{}'", originalSessionId);
34+
sessionStorage.removeBySessionById(originalSessionId);
35+
if (auth.getCredentials() instanceof String) {
36+
LOG.debug("Session changed, adding new session with ID '{}'", newSession.getId());
37+
sessionStorage.addSessionById((String) auth.getCredentials(), newSession);
38+
}
39+
}
40+
super.onSessionChange(originalSessionId, newSession, auth);
41+
}
42+
43+
public SessionMappingStorage getSessionStorage() {
44+
return sessionStorage;
45+
}
46+
47+
public void setSessionStorage(SessionMappingStorage sessionStorage) {
48+
this.sessionStorage = sessionStorage;
49+
}
50+
51+
}

0 commit comments

Comments
 (0)