From 278145348d45eed69120088d055a852d4d2a5a26 Mon Sep 17 00:00:00 2001 From: "Bisht, Shubham" Date: Wed, 12 Nov 2025 15:03:14 +0530 Subject: [PATCH 1/3] fix: Replaced unbounded <.*?> pattern with safe <[^>]*> to prevent CodeQL security issue --- src/main/java/com/solidfire/core/client/ServiceBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/solidfire/core/client/ServiceBase.java b/src/main/java/com/solidfire/core/client/ServiceBase.java index 2532e92d..c29ffd8a 100644 --- a/src/main/java/com/solidfire/core/client/ServiceBase.java +++ b/src/main/java/com/solidfire/core/client/ServiceBase.java @@ -212,7 +212,7 @@ protected TResult decodeResponse(String response, Class resul throw new ApiServerException("Not Found", "404", matcher.group(1)); } // Removes the html tags from the response. - response.replaceAll("<.*?>", ""); + response.replaceAll("<[^>]*>", ""); throw new ApiException(format("There was a problem parsing the response from the server. ( response=%s )", response), e); } catch (NullPointerException | JsonParseException e) { log.debug(response); From e40b37069098296207f58e712ad3ce046e3a8bde Mon Sep 17 00:00:00 2001 From: "Bisht, Shubham" Date: Wed, 12 Nov 2025 15:05:25 +0530 Subject: [PATCH 2/3] fix: Replaced unbounded

(.*?)

pattern with safe

(?:(?!

).)*

to prevent CodeQL security issue --- src/main/java/com/solidfire/core/client/ServiceBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/solidfire/core/client/ServiceBase.java b/src/main/java/com/solidfire/core/client/ServiceBase.java index c29ffd8a..36c714dd 100644 --- a/src/main/java/com/solidfire/core/client/ServiceBase.java +++ b/src/main/java/com/solidfire/core/client/ServiceBase.java @@ -206,7 +206,7 @@ protected TResult decodeResponse(String response, Class resul return result; } catch (ClassCastException e) { - final Pattern pattern = Pattern.compile("

(.*?)

"); + final Pattern pattern = Pattern.compile("

(?:(?!

).)*

"); final Matcher matcher = pattern.matcher(response); if (matcher.find()) { throw new ApiServerException("Not Found", "404", matcher.group(1)); From 8c5344ec1ba821d18ff5c7faed5401c1234a7234 Mon Sep 17 00:00:00 2001 From: "Bisht, Shubham" Date: Fri, 14 Nov 2025 12:44:56 +0530 Subject: [PATCH 3/3] fix: polynomial DoS issue using jsoup html parser --- project/common.scala | 5 ++++- .../com/solidfire/core/client/ServiceBase.java | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/project/common.scala b/project/common.scala index 7eebf35b..e7da3cb0 100644 --- a/project/common.scala +++ b/project/common.scala @@ -90,7 +90,8 @@ object Config { Dependencies.mockito, Dependencies.scalatest, Dependencies.scalacheck, - Dependencies.junit + Dependencies.junit, + Dependencies.jsoup ) ) @@ -125,6 +126,7 @@ object Version { val jodaConvert = "1.8.1" val jodaTime = "2.9.3" val base64 = "2.3.9" + val jsoup = "1.17.2" } object Dependencies { @@ -138,6 +140,7 @@ object Dependencies { lazy val mockito = "org.mockito" % "mockito-all" % Version.mockito % "test" lazy val scalacheck = "org.scalacheck" %% "scalacheck" % Version.scalacheck % "test" lazy val junit = "com.novocode" % "junit-interface" % Version.junit % "test" + lazy val jsoup = "org.jsoup" % "jsoup" % Version.jsoup } diff --git a/src/main/java/com/solidfire/core/client/ServiceBase.java b/src/main/java/com/solidfire/core/client/ServiceBase.java index 36c714dd..5b1a542c 100644 --- a/src/main/java/com/solidfire/core/client/ServiceBase.java +++ b/src/main/java/com/solidfire/core/client/ServiceBase.java @@ -32,8 +32,10 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; -import java.util.regex.Matcher; -import java.util.regex.Pattern; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; import static java.lang.String.format; @@ -206,14 +208,14 @@ protected TResult decodeResponse(String response, Class resul return result; } catch (ClassCastException e) { - final Pattern pattern = Pattern.compile("

(?:(?!

).)*

"); - final Matcher matcher = pattern.matcher(response); - if (matcher.find()) { - throw new ApiServerException("Not Found", "404", matcher.group(1)); + Document parsedResponse = Jsoup.parse(response); + Element pTag = parsedResponse.selectFirst("p"); + if(pTag != null) { + throw new ApiServerException("Not Found", "404", pTag.text()); } // Removes the html tags from the response. - response.replaceAll("<[^>]*>", ""); - throw new ApiException(format("There was a problem parsing the response from the server. ( response=%s )", response), e); + String responseText = parsedResponse.text(); + throw new ApiException(format("There was a problem parsing the response from the server. ( response=%s )", responseText), e); } catch (NullPointerException | JsonParseException e) { log.debug(response); throw new ApiException(format("There was a problem parsing the response from the server. ( response=%s )", response), e);