This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 4049ef1ad0c1624dd13c0cd7dd8a7b709342ef0e Author: Francesco Chicchiriccò <[email protected]> AuthorDate: Wed Sep 2 09:49:09 2026 +0200 Cleanup --- .../apache/syncope/client/console/pages/Logs.java | 15 +- .../client/console/rest/LoggerConfRestClient.java | 11 +- .../apache/syncope/core/logic/SRARouteLogic.java | 5 +- .../syncope/core/logic/wa/WAConfigLogic.java | 4 +- .../java/org/apache/syncope/sra/RouteProvider.java | 31 +- .../org/apache/syncope/sra/SecurityConfig.java | 34 +- .../apache/syncope/sra/SyncopeSRAApplication.java | 8 +- sra/src/test/resources/debug/sra-debug.properties | 2 + src/site/xdoc/security.xml | 786 --------------------- .../apache/syncope/wa/bootstrap/WAProperties.java | 10 +- .../syncope/wa/starter/SyncopeWAApplication.java | 2 +- wa/starter/src/main/resources/wa.properties | 2 + 12 files changed, 59 insertions(+), 851 deletions(-) diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java index 2f7cf5f62b..d9d96d21ac 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Logs.java @@ -29,9 +29,7 @@ import org.apache.syncope.client.console.panels.LogsPanel; import org.apache.syncope.client.console.rest.LoggerConf; import org.apache.syncope.client.console.rest.LoggerConfOp; import org.apache.syncope.client.console.rest.LoggerConfRestClient; -import org.apache.syncope.common.keymaster.client.api.DomainOps; import org.apache.syncope.common.keymaster.client.api.ServiceOps; -import org.apache.syncope.common.keymaster.client.api.model.Domain; import org.apache.syncope.common.keymaster.client.api.model.NetworkService; import org.apache.wicket.extensions.markup.html.tabs.AbstractTab; import org.apache.wicket.extensions.markup.html.tabs.ITab; @@ -51,9 +49,6 @@ public class Logs extends BasePage { @SpringBean private ServiceOps serviceOps; - @SpringBean - private DomainOps domainOps; - @SpringBean private LoggingSystem loggingSystem; @@ -71,8 +66,6 @@ public class Logs extends BasePage { private List<ITab> buildTabList() { List<ITab> tabs = new ArrayList<>(); - List<Domain> domains = domainOps.list(); - List<NetworkService> coreInstances = serviceOps.list(NetworkService.Type.CORE); tabs.add(new AbstractTab(Model.of(NetworkService.Type.CORE.name())) { @@ -80,7 +73,7 @@ public class Logs extends BasePage { @Override public Panel getPanel(final String panelId) { - return new LogsPanel(panelId, new LoggerConfRestClient(coreInstances, domains), getPageReference()); + return new LogsPanel(panelId, new LoggerConfRestClient(coreInstances), getPageReference()); } }); @@ -125,7 +118,7 @@ public class Logs extends BasePage { @Override public Panel getPanel(final String panelId) { - return new LogsPanel(panelId, new LoggerConfRestClient(euInstances, domains), getPageReference()); + return new LogsPanel(panelId, new LoggerConfRestClient(euInstances), getPageReference()); } }); } @@ -138,7 +131,7 @@ public class Logs extends BasePage { @Override public Panel getPanel(final String panelId) { - return new LogsPanel(panelId, new LoggerConfRestClient(waInstances, domains), getPageReference()); + return new LogsPanel(panelId, new LoggerConfRestClient(waInstances), getPageReference()); } }); } @@ -151,7 +144,7 @@ public class Logs extends BasePage { @Override public Panel getPanel(final String panelId) { - return new LogsPanel(panelId, new LoggerConfRestClient(sraInstances, domains), getPageReference()); + return new LogsPanel(panelId, new LoggerConfRestClient(sraInstances), getPageReference()); } }); } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java index 529265f284..2e8129c719 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java @@ -25,14 +25,10 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.syncope.client.console.SyncopeWebApplication; import org.apache.syncope.client.ui.commons.rest.RestClient; -import org.apache.syncope.common.keymaster.client.api.model.Domain; import org.apache.syncope.common.keymaster.client.api.model.NetworkService; -import org.apache.syncope.common.lib.SyncopeConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.logging.LogLevel; @@ -49,13 +45,8 @@ public class LoggerConfRestClient implements RestClient, LoggerConfOp { private final List<NetworkService> instances; - private final List<String> domains; - - public LoggerConfRestClient(final List<NetworkService> instances, final List<Domain> domains) { + public LoggerConfRestClient(final List<NetworkService> instances) { this.instances = instances; - this.domains = Stream.concat( - Stream.of(SyncopeConstants.MASTER_DOMAIN), domains.stream().map(Domain::getKey)). - collect(Collectors.toList()); } protected String getActuatorEndpoint(final NetworkService instance) { diff --git a/core/am/logic/src/main/java/org/apache/syncope/core/logic/SRARouteLogic.java b/core/am/logic/src/main/java/org/apache/syncope/core/logic/SRARouteLogic.java index 419a11c88d..99dbdd118d 100644 --- a/core/am/logic/src/main/java/org/apache/syncope/core/logic/SRARouteLogic.java +++ b/core/am/logic/src/main/java/org/apache/syncope/core/logic/SRARouteLogic.java @@ -120,9 +120,10 @@ public class SRARouteLogic extends AbstractTransactionalLogic<SRARouteTO> { POST(HttpRequest.BodyPublishers.noBody()).build(), HttpResponse.BodyHandlers.discarding()). thenAcceptAsync(response -> LOG.info( - "Pushed to SRA instance {} with HTTP status: {}", sra.getAddress(), response.statusCode()))); + "Pushed to SRA instance {} with HTTP status: {}", + sra.getAddress(), response.statusCode()))); } catch (KeymasterException e) { - throw new NotFoundException("Could not find any WA instance", e); + throw new NotFoundException("Could not find any SRA instance", e); } } diff --git a/core/am/logic/src/main/java/org/apache/syncope/core/logic/wa/WAConfigLogic.java b/core/am/logic/src/main/java/org/apache/syncope/core/logic/wa/WAConfigLogic.java index 66f663fde1..9426dc1ef7 100644 --- a/core/am/logic/src/main/java/org/apache/syncope/core/logic/wa/WAConfigLogic.java +++ b/core/am/logic/src/main/java/org/apache/syncope/core/logic/wa/WAConfigLogic.java @@ -100,7 +100,7 @@ public class WAConfigLogic extends AbstractTransactionalLogic<EntityTO> { GET().build(), HttpResponse.BodyHandlers.discarding()). thenAcceptAsync(response -> LOG.info( - "Pushed to {} with HTTP status: {}", target, response.statusCode())); + "Pushed to {} with HTTP status: {}", target, response.statusCode())); } protected void refresh(final HttpClient client, final String serviceAddress) { @@ -112,7 +112,7 @@ public class WAConfigLogic extends AbstractTransactionalLogic<EntityTO> { POST(HttpRequest.BodyPublishers.noBody()).build(), HttpResponse.BodyHandlers.discarding()). thenAcceptAsync(response -> LOG.info( - "Pushed to {} with HTTP status: {}", target, response.statusCode())); + "Pushed to {} with HTTP status: {}", target, response.statusCode())); } @PreAuthorize("hasRole('" + AMEntitlement.WA_CONFIG_PUSH + "')") diff --git a/sra/src/main/java/org/apache/syncope/sra/RouteProvider.java b/sra/src/main/java/org/apache/syncope/sra/RouteProvider.java index 272882502a..6443b015bc 100644 --- a/sra/src/main/java/org/apache/syncope/sra/RouteProvider.java +++ b/sra/src/main/java/org/apache/syncope/sra/RouteProvider.java @@ -143,21 +143,21 @@ public class RouteProvider { String[] addRequestHeaderArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(AddRequestHeaderGatewayFilterFactory.class). apply(c -> c.setName(addRequestHeaderArgs[0].trim()). - setValue(addRequestHeaderArgs[1].trim())); + setValue(addRequestHeaderArgs[1].trim())); break; case ADD_REQUEST_PARAMETER: String[] addRequestParameterArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(AddRequestParameterGatewayFilterFactory.class). apply(c -> c.setName(addRequestParameterArgs[0].trim()). - setValue(addRequestParameterArgs[1].trim())); + setValue(addRequestParameterArgs[1].trim())); break; case ADD_RESPONSE_HEADER: String[] addResponseHeaderArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(AddResponseHeaderGatewayFilterFactory.class). apply(c -> c.setName(addResponseHeaderArgs[0].trim()). - setValue(addResponseHeaderArgs[1].trim())); + setValue(addResponseHeaderArgs[1].trim())); break; case DEDUPE_RESPONSE_HEADER: @@ -195,7 +195,7 @@ public class RouteProvider { String[] mapRequestHeaderArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(MapRequestHeaderGatewayFilterFactory.class). apply(c -> c.setFromHeader(mapRequestHeaderArgs[0].trim()). - setToHeader(mapRequestHeaderArgs[1].trim())); + setToHeader(mapRequestHeaderArgs[1].trim())); break; case PREFIX_PATH: @@ -249,7 +249,7 @@ public class RouteProvider { String[] rewritePathArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(RewritePathGatewayFilterFactory.class). apply(c -> c.setRegexp(rewritePathArgs[0].trim()). - setReplacement(rewritePathArgs[1].trim())); + setReplacement(rewritePathArgs[1].trim())); break; case REWRITE_LOCATION: @@ -274,8 +274,8 @@ public class RouteProvider { String[] rewriteResponseHeaderArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(RewriteResponseHeaderGatewayFilterFactory.class). apply(c -> c.setReplacement(rewriteResponseHeaderArgs[2].trim()). - setRegexp(rewriteResponseHeaderArgs[1].trim()). - setName(rewriteResponseHeaderArgs[0].trim())); + setRegexp(rewriteResponseHeaderArgs[1].trim()). + setName(rewriteResponseHeaderArgs[0].trim())); break; case RETRY: @@ -309,14 +309,14 @@ public class RouteProvider { String[] setRequestHeaderArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(SetRequestHeaderGatewayFilterFactory.class). apply(c -> c.setName(setRequestHeaderArgs[0].trim()). - setValue(setRequestHeaderArgs[1].trim())); + setValue(setRequestHeaderArgs[1].trim())); break; case SET_RESPONSE_HEADER: String[] setResponseHeaderArgs = gwfilter.getArgs().split(","); filter = ctx.getBean(SetResponseHeaderGatewayFilterFactory.class). apply(c -> c.setName(setResponseHeaderArgs[0].trim()). - setValue(setResponseHeaderArgs[1].trim())); + setValue(setResponseHeaderArgs[1].trim())); break; case SET_STATUS: @@ -428,21 +428,21 @@ public class RouteProvider { String[] betweenArgs = gwpredicate.getArgs().split(","); predicate = ctx.getBean(BetweenRoutePredicateFactory.class). applyAsync(c -> c.setDatetime1(ZonedDateTime.parse(betweenArgs[0].trim())). - setDatetime2(ZonedDateTime.parse(betweenArgs[1].trim()))); + setDatetime2(ZonedDateTime.parse(betweenArgs[1].trim()))); break; case COOKIE: String[] cookieArgs = gwpredicate.getArgs().split(","); predicate = ctx.getBean(CookieRoutePredicateFactory.class). applyAsync(c -> c.setName(cookieArgs[0].trim()). - setRegexp(cookieArgs[1].trim())); + setRegexp(cookieArgs[1].trim())); break; case HEADER: String[] headerArgs = gwpredicate.getArgs().split(","); predicate = ctx.getBean(HeaderRoutePredicateFactory.class). applyAsync(c -> c.setHeader(headerArgs[0].trim()). - setRegexp(headerArgs[1].trim())); + setRegexp(headerArgs[1].trim())); break; case HOST: @@ -454,8 +454,9 @@ public class RouteProvider { case METHOD: String[] methodArgs = gwpredicate.getArgs().split(","); predicate = ctx.getBean(MethodRoutePredicateFactory.class). - applyAsync(c -> c.setMethods( - Stream.of(methodArgs).map(arg -> HttpMethod.valueOf(arg.trim())).toArray(HttpMethod[]::new))); + applyAsync(c -> c.setMethods(Stream.of(methodArgs). + map(arg -> HttpMethod.valueOf(arg.trim())). + toArray(HttpMethod[]::new))); break; case PATH: @@ -491,7 +492,7 @@ public class RouteProvider { } predicate = ctx.getBean(WeightRoutePredicateFactory.class). applyAsync(c -> c.setGroup(weigthArgs[0].trim()). - setWeight(weight.get())); + setWeight(weight.get())); break; case CUSTOM: diff --git a/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java b/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java index 7fa2764910..663be849a3 100644 --- a/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java +++ b/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java @@ -88,25 +88,9 @@ public class SecurityConfig { Security.addProvider(new BouncyCastleProvider()); } - @Bean - @Order(0) - @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "SAML2") - public SecurityWebFilterChain saml2SecurityFilterChain(final ServerHttpSecurity http) { - ServerWebExchangeMatcher metadataMatcher = - ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, SAML2MetadataEndpoint.METADATA_URL); - http.securityMatcher(metadataMatcher); - - http.authorizeExchange(customizer -> customizer.anyExchange().permitAll()); - - http.csrf(customizer -> customizer. - requireCsrfProtectionMatcher(new NegatedServerWebExchangeMatcher(metadataMatcher))); - - return http.build(); - } - @ConditionalOnMissingBean @Bean - @Order(1) + @Order(0) public SecurityWebFilterChain actuatorSecurityFilterChain(final ServerHttpSecurity http) { ServerWebExchangeMatcher actuatorMatcher = EndpointRequest.toAnyEndpoint(); http.securityMatcher(actuatorMatcher); @@ -132,6 +116,22 @@ public class SecurityConfig { return new MapReactiveUserDetailsService(user); } + @Bean + @Order(1) + @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "SAML2") + public SecurityWebFilterChain saml2SecurityFilterChain(final ServerHttpSecurity http) { + ServerWebExchangeMatcher metadataMatcher = + ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, SAML2MetadataEndpoint.METADATA_URL); + http.securityMatcher(metadataMatcher); + + http.authorizeExchange(customizer -> customizer.anyExchange().permitAll()); + + http.csrf(customizer -> customizer. + requireCsrfProtectionMatcher(new NegatedServerWebExchangeMatcher(metadataMatcher))); + + return http.build(); + } + @Bean @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OIDC") public ClientRegistration oidcClientRegistration(final SRAProperties props) { diff --git a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java index 4b711f434c..bc0eac198d 100644 --- a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java +++ b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java @@ -69,9 +69,11 @@ public class SyncopeSRAApplication { @ConditionalOnMissingBean @Bean - public RouteProvider routeProvider(final ConfigurableApplicationContext ctx, + public RouteProvider routeProvider( + final ConfigurableApplicationContext ctx, final ServiceOps serviceOps, final SRAProperties props) { + return new RouteProvider( serviceOps, ctx, @@ -94,8 +96,10 @@ public class SyncopeSRAApplication { @ConditionalOnMissingBean @Bean - public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator(final ServiceOps serviceOps, + public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator( + final ServiceOps serviceOps, final SRAProperties props) { + return new SyncopeCoreHealthIndicator( serviceOps, props.getAnonymousUser(), diff --git a/sra/src/test/resources/debug/sra-debug.properties b/sra/src/test/resources/debug/sra-debug.properties index a0429cdf39..47247d7930 100644 --- a/sra/src/test/resources/debug/sra-debug.properties +++ b/sra/src/test/resources/debug/sra-debug.properties @@ -18,6 +18,8 @@ keymaster.address=https://localhost:9443/syncope/rest/keymaster keymaster.username=${anonymousUser} keymaster.password=${anonymousKey} +management.endpoints.web.exposure.include=info,health,env,beans,loggers,metrics,gateway,sraSessions + #sra.am-type=OIDC #sra.oidc.configuration=https://localhost:9443/syncope-wa/oidc #sra.oidc.client-id=oidcTestClientId diff --git a/src/site/xdoc/security.xml b/src/site/xdoc/security.xml deleted file mode 100644 index edb143d2f1..0000000000 --- a/src/site/xdoc/security.xml +++ /dev/null @@ -1,786 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. - ---> -<document xmlns="http://maven.apache.org/XDOC/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd"> - - <properties> - <title>Security Advisories</title> - <author email="[email protected]">Apache Syncope Documentation Team</author> - </properties> - - <body> - - <section name="Security Advisories"> - <p>This page lists all security vulnerabilities fixed in released versions of Apache Syncope.</p> - <p>Please note that binary patches are never provided. If you need to apply a source code patch, use the - <a href="building.html">building instructions</a> or - <a href="docs/getting-started.html#create-project">re-generate your Maven project</a> from published archetype.</p> - - <p>If you want to report a vulnerability, please follow <a href="https://www.apache.org/security/">the procedure</a>.</p> - - <subsection name="CVE-2026-42797: Apache Syncope: JexlContextBuilder Information Disclosure"> - <p>Exposure of Sensitive Information Through Data Queries vulnerability in Apache Syncope.</p> - <p>An administrator with adequate entitlements for Derived Schemas can create a malicious JEXL expression which allows any administrator with sufficient entitlements for User read to access User-related security-sensitive information.</p> - - <p> - <b>Severity</b> - </p> - <p>Moderate</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>4.1 through 4.1.0</li> - <li>4.0 through 4.0.5</li> - <li>3.0 through 3.0.16</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 4.1.1 / 4.0.6 which fix this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 4.1.1</li> - <li>Release 4.0.6</li> - </ul> - </p> - - <p>Read the <a href="https://www.cve.org/CVERecord?id=CVE-2026-42797">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2026-42782: Apache Syncope: Post-auth RCE via Groovy static"> - <p>Improper Isolation or Compartmentalization vulnerability in Apache Syncope.</p> - <p>An administrator with adequate entitlements for Implementations can create a malicious Groovy class containing untrusted code reaching a non-sandboxed execution path via the class static initializer.</p> - - <p> - <b>Severity</b> - </p> - <p>Moderate</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>4.1 through 4.1.0</li> - <li>4.0 through 4.0.5</li> - <li>3.0 through 3.0.16</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 4.1.1 / 4.0.6 which fix this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 4.1.1</li> - <li>Release 4.0.6</li> - </ul> - </p> - - <p>Read the <a href="https://www.cve.org/CVERecord?id=CVE-2026-42782">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2026-23795: Apache Syncope: Console XXE on Keymaster parameters"> - <p>Improper Restriction of XML External Entity Reference vulnerability in Apache Syncope Console.</p> - <p>An administrator with adequate entitlements to create or edit Keymaster parameters via Console can construct malicious XML text to launch an XXE attack, thereby causing sensitive data leakage occurs.</p> - - <p> - <b>Severity</b> - </p> - <p>Important</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>4.0 through 4.0.3</li> - <li>3.0 through 3.0.15</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 4.0.4 / 3.0.16 which fix this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 4.0.4</li> - <li>Release 3.0.16</li> - </ul> - </p> - - <p>Read the <a href="https://www.cve.org/CVERecord?id=CVE-2026-23795">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2026-23794: Apache Syncope: Reflected XSS on Enduser Login"> - <p>Reflected XSS in Apache Syncope's Enduser Login page.</p> - <p>An attacker that tricks a legitimate user into clicking a malicious link and logging in to Syncope Enduser could steal that user's credentials.</p> - - <p> - <b>Severity</b> - </p> - <p>Important</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>4.0 through 4.0.3</li> - <li>3.0 through 3.0.15</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 4.0.4 / 3.0.16 which fix this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 4.0.4</li> - <li>Release 3.0.16</li> - </ul> - </p> - - <p>Read the <a href="https://www.cve.org/CVERecord?id=CVE-2026-23794">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2025-65998: Apache Syncope: Default AES key used for internal password encryption"> - <p>Apache Syncope can be configured to store the user password values in the internal database with AES encryption, though this is not the default option.</p> - - <p>When AES is configured, the default key value, hard-coded in the source code, is always used. - This allows a malicious attacker, once obtained access to the internal database content, to reconstruct the original cleartext password values.<br/> - This is not affecting encrypted plain attributes, whose values are also stored using AES encryption.</p> - - <p>Users are recommended to upgrade to version 4.0.3 / 3.0.15, which fix this issue.</p> - <p> - <b>Severity</b> - </p> - <p>Important</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>4.0 through 4.0.2</li> - <li>3.0 through 3.0.14</li> - <li>2.1 through 2.1.14</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 4.0.3 / 3.0.15 which fix this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 4.0.3</li> - <li>Release 3.0.15</li> - </ul> - </p> - - <p>Read the <a href="https://www.cve.org/CVERecord?id=CVE-2025-65998">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2025-57738: Apache Syncope: Remote Code Execution by delegated administrators"> - <p>Apache Syncope offers the ability to extend / customize the base behavior on every deployment by allowing to provide custom implementations of a few Java interfaces; such implementations can be provided either as Java or Groovy classes, with the latter being particularly attractive as the machinery is set for runtime reload. - Such a feature has been available for a while, but recently it was discovered that a malicious administrator can inject Groovy code that can be executed remotely by a running Apache Syncope Core instance. - Users are recommended to upgrade to version 3.0.14 / 4.0.2, which fix this issue by forcing the Groovy code to run in a sandbox.</p> - - <p> - <b>Severity</b> - </p> - <p>Moderate</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>4.0 through 4.0.1</li> - <li>3.0 through 3.0.13</li> - <li>2.1 through 2.1.14</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 4.0.2 / 3.0.14 which fix this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 4.0.2</li> - <li>Release 3.0.14</li> - </ul> - </p> - - <p>Read the <a href="https://www.cve.org/CVERecord?id=CVE-2025-57738">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2024-45031: Apache Syncope: Stored XSS in Console and Enduser"> - <p>When editing objects in the Syncope Console, incomplete HTML tags could be used to bypass HTML sanitization. This made it possible to inject stored XSS payloads which would trigger for other users during ordinary usage of the application.<br/> - XSS payloads could also be injected in Syncope Enduser when editing “Personal Information” or “User Requests”: such payloads would trigger for administrators in Syncope Console, thus enabling session hijacking.</p> - - <p> - <b>Severity</b> - </p> - <p>Moderate</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>3.0 through 3.0.8</li> - <li>2.1 through 2.1.14</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 3.0.9, which fixes this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 3.0.9</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-45031">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2024-38503: HTML tags can be injected into Console or Enduser text fields"> - <p>When editing a user, group or any object in the Syncope Console, HTML tags could be added to any text field and could lead to potential exploits. - The same vulnerability was found in the Syncope Enduser, when editing “Personal Information” or “User Requests”.</p> - - <p> - <b>Severity</b> - </p> - <p>Moderate</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>3.0 through 3.0.7</li> - <li>2.1 through 2.1.14</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Users are recommended to upgrade to version 3.0.8, which fixes this issue.</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 3.0.8</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-38503">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2020-11977: Remote Code Execution via Flowable workflow definition"> - <p>When the Flowable extension is enabled, an administrator with workflow entitlements can use Shell Service Tasks to perform malicious operations, including but not limited - to file read, file write, and code execution.</p> - - <p> - <b>Severity</b> - </p> - <p>Low</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>2.1.X releases prior to 2.1.7</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>2.1.X users should upgrade to 2.1.7</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 2.1.7</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11977">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2020-1961: Server-Side Template Injection on mail templates"> - <p>Vulnerability to Server-Side Template Injection on Mail templates enabling attackers to inject arbitrary JEXL - expressions, leading to Remote Code Execution (RCE) was discovered.</p> - - <p> - <b>Severity</b> - </p> - <p>Important</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>2.0.X releases prior to 2.0.15</li> - <li>2.1.X releases prior to 2.1.6</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>2.0.X users should upgrade to 2.0.15</li> - <li>2.1.X users should upgrade to 2.1.6</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 2.0.15</li> - <li>Release 2.1.6</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1961">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2020-1959: Multiple Remote Code Execution Vulnerabilities"> - <p>A Server-Side Template Injection was identified in Syncope enabling attackers to inject arbitrary Java EL - expressions, leading to an unauthenticated Remote Code Execution (RCE) vulnerability. - Apache Syncope uses Java Bean Validation (JSR 380) custom constraint validators. When building custom - constraint violation error messages, they support different types of interpolation, including Java EL - expressions. - Therefore, if an attacker can inject arbitrary data in the error message template being passed, they will be - able to run arbitrary Java code.</p> - - <p> - <b>Severity</b> - </p> - <p>Important</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>2.1.X releases prior to 2.1.6</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>2.1.X users should upgrade to 2.1.6</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 2.1.6</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1959">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2019-17557: Enduser UI XSS"> - <p>It was found that the EndUser UI login page reflects the successMessage parameters. - By this mean, a user accessing the Enduser UI could execute javascript code from URL query string.</p> - - <p> - <b>Severity</b> - </p> - <p>Medium</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>2.0.X releases prior to 2.0.15</li> - <li>2.1.X releases prior to 2.1.6</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>2.0.X users should upgrade to 2.0.15</li> - <li>2.1.X users should upgrade to 2.1.6</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 2.0.15</li> - <li>Release 2.1.6</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-17557">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2018-17186: XXE on BPMN definitions"> - <p>An administrator with workflow definition entitlements can use DTD to perform malicious operations, including - but not limited to file read, file write, and code execution.</p> - - <p> - <b>Severity</b> - </p> - <p>Medium</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>Releases prior to 2.0.11</li> - <li>Releases prior to 2.1.2</li> - </ul> - </p> - <p>The unsupported Releases 1.2.x may be also affected.</p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>2.0.X users should upgrade to 2.0.11</li> - <li>2.1.X users should upgrade to 2.1.2</li> - </ul> - </p> - - <p> - <b>Mitigation</b> - </p> - <p>Do not assign workflow definition entitlements to any administrator.</p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 2.0.11</li> - <li>Release 2.1.2</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17186">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2018-17184: Stored XSS"> - <p>A malicious user with enough administration entitlements can inject html-like elements containing JavaScript - statements into Connector names, Report names, AnyTypeClass keys and Policy descriptions.<br/> - When another user with enough administration entitlements edits one of the Entities above via Admin Console, - the injected JavaScript code is executed.</p> - - <p> - <b>Severity</b> - </p> - <p>Important</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>Releases prior to 2.0.11</li> - <li>Releases prior to 2.1.2</li> - </ul> - </p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>2.0.X users should upgrade to 2.0.11</li> - <li>2.1.X users should upgrade to 2.1.2</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 2.0.11</li> - <li>Release 2.1.2</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17184">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2018-1322: Information disclosure via FIQL and ORDER BY sorting"> - <p>An administrator with user search entitlements can recover sensitive security values using the - <code>fiql</code> and <code>orderby</code> parameters.</p> - - <p> - <b>Severity</b> - </p> - <p>Medium</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>Releases prior to 1.2.11</li> - <li>Releases prior to 2.0.8</li> - </ul> - </p> - <p>The unsupported Releases 1.0.x, 1.1.x may be also affected.</p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Syncope 1.2.x users should upgrade to 1.2.11</li> - <li>Syncope 2.0.x users should upgrade to 2.0.8</li> - </ul> - </p> - - <p> - <b>Mitigation</b> - </p> - <p>Do not assign user search entitlements to any administrator.</p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 1.2.11</li> - <li>Release 2.0.8</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1322">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2018-1321: Remote code execution by administrators with report and template entitlements"> - <p>An administrator with report and template entitlements can use XSL Transformations (XSLT) to perform - malicious operations, including but not limited to file read, file write, and code execution.</p> - - <p> - <b>Severity</b> - </p> - <p>Medium</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>Releases prior to 1.2.11</li> - <li>Releases prior to 2.0.8</li> - </ul> - </p> - <p>The unsupported Releases 1.0.x, 1.1.x may be also affected.</p> - - <p> - <b>Solution</b> - </p> - <p> - <ul> - <li>Syncope 1.2.x users should upgrade to 1.2.11</li> - <li>Syncope 2.0.x users should upgrade to 2.0.8</li> - </ul> - </p> - - <p> - <b>Mitigation</b> - </p> - <p>Do not assign report and template entitlements to any administrator.</p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Release 1.2.11</li> - <li>Release 2.0.8</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1321">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2014-3503: Insecure Random implementations used to generate passwords"> - <p>A password is generated for a user in Apache Syncope under certain circumstances, when no existing password - is found. However, the password generation code is relying on insecure Random implementations, which means - that an attacker could attempt to guess a generated password.</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>Releases 1.1.0 to 1.1.7</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Revision <a href="http://svn.apache.org/viewvc?view=revision&revision=r1596537">1596537</a></li> - <li>Release 1.1.8</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3503">full CVE advisory</a>.</p> - </subsection> - - <subsection name="CVE-2014-0111: Remote code execution by an authenticated administrator"> - <p>In the various places in which Apache Commons JEXL expressions are allowed (derived schema definition, - user / group templates, connObjectLinks of resource mappings) a malicious administrator can inject Java code - that can be executed remotely by the Java EE container running the Apache Syncope core.</p> - - <p> - <b>Affects</b> - </p> - <p> - <ul> - <li>Releases 1.0.0 to 1.0.8</li> - <li>Releases 1.1.0 to 1.1.6</li> - </ul> - </p> - - <p> - <b>Fixed in</b> - </p> - <p> - <ul> - <li>Revisions <a href="http://svn.apache.org/viewvc?view=revision&revision=r1586349">1586349</a> / <a href="http://svn.apache.org/viewvc?view=revision&revision=r1586317">1586317</a></li> - <li>Releases 1.0.9 / 1.1.7</li> - </ul> - </p> - - <p>Read the <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0111">full CVE advisory</a>.</p> - </subsection> - </section> - - </body> -</document> diff --git a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/WAProperties.java b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/WAProperties.java index 5dec150a1a..9735b3e6ca 100644 --- a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/WAProperties.java +++ b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/WAProperties.java @@ -26,13 +26,13 @@ public class WAProperties extends SyncopeProperties { private static final long serialVersionUID = 7925827623055998239L; - private int contextRefreshDelay = 15; + private int contextRefreshDelaySeconds = 15; - public int getContextRefreshDelay() { - return contextRefreshDelay; + public int getContextRefreshDelaySeconds() { + return contextRefreshDelaySeconds; } - public void setContextRefreshDelay(final int contextRefreshDelay) { - this.contextRefreshDelay = contextRefreshDelay; + public void setContextRefreshDelaySeconds(final int contextRefreshDelaySeconds) { + this.contextRefreshDelaySeconds = contextRefreshDelaySeconds; } } diff --git a/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java b/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java index 809ba33071..5aa2ca54a2 100644 --- a/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java +++ b/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java @@ -95,7 +95,7 @@ public class SyncopeWAApplication extends SpringBootServletInitializer { WAProperties waProperties = event.getApplicationContext().getBean(WAProperties.class); TaskScheduler scheduler = event.getApplicationContext().getBean(TaskScheduler.class); - Instant startAt = Instant.now().plusSeconds(waProperties.getContextRefreshDelay()); + Instant startAt = Instant.now().plusSeconds(waProperties.getContextRefreshDelaySeconds()); try { scheduler.schedule(job, startAt); LOG.info("Scheduled job to refresh application context @ [{}]", startAt); diff --git a/wa/starter/src/main/resources/wa.properties b/wa/starter/src/main/resources/wa.properties index d22b2fb564..21fc8b05f3 100644 --- a/wa/starter/src/main/resources/wa.properties +++ b/wa/starter/src/main/resources/wa.properties @@ -66,6 +66,8 @@ wa.anonymousKey=${anonymousKey} wa.useGZIPCompression=true +wa.contextRefreshDelaySeconds=15 + # Conf directories conf.directory=${syncope.conf.dir} cas.standalone.configuration-directory=${syncope.conf.dir}
