fix CVE-2021-25122 and CVE-2021-25329
This commit is contained in:
parent
1a1171614a
commit
8c2dd0cb8f
53
CVE-2021-25122-pre.patch
Normal file
53
CVE-2021-25122-pre.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From 995115a24bb868d1204a796f5b3170f62618a6bb Mon Sep 17 00:00:00 2001
|
||||||
|
From: wang_yue111 <648774160@qq.com>
|
||||||
|
Date: Thu, 11 Mar 2021 18:35:41 +0800
|
||||||
|
Subject: [PATCH] SocketWrapper.upgraded is no longer used
|
||||||
|
|
||||||
|
It used to be used to determine if the processor should be recycled. It
|
||||||
|
has been replaced by a flag on the processor.
|
||||||
|
|
||||||
|
---
|
||||||
|
java/org/apache/coyote/AbstractProtocol.java | 2 --
|
||||||
|
.../apache/tomcat/util/net/SocketWrapperBase.java | 12 ++++++++++++
|
||||||
|
2 files changed, 12 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/java/org/apache/coyote/AbstractProtocol.java b/java/org/apache/coyote/AbstractProtocol.java
|
||||||
|
index 09ed0a9..9f83906 100644
|
||||||
|
--- a/java/org/apache/coyote/AbstractProtocol.java
|
||||||
|
+++ b/java/org/apache/coyote/AbstractProtocol.java
|
||||||
|
@@ -799,8 +799,6 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
|
||||||
|
processor, wrapper));
|
||||||
|
}
|
||||||
|
wrapper.unRead(leftOverInput);
|
||||||
|
- // Mark the connection as upgraded
|
||||||
|
- wrapper.setUpgraded(true);
|
||||||
|
// Associate with the processor with the connection
|
||||||
|
connections.put(socket, processor);
|
||||||
|
// Initialise the upgrade handler (which may trigger
|
||||||
|
diff --git a/java/org/apache/tomcat/util/net/SocketWrapperBase.java b/java/org/apache/tomcat/util/net/SocketWrapperBase.java
|
||||||
|
index 2479d6d..f8a79db 100644
|
||||||
|
--- a/java/org/apache/tomcat/util/net/SocketWrapperBase.java
|
||||||
|
+++ b/java/org/apache/tomcat/util/net/SocketWrapperBase.java
|
||||||
|
@@ -138,7 +138,19 @@ public abstract class SocketWrapperBase<E> {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /**
|
||||||
|
+ * @return {@code true} if the connection has been upgraded.
|
||||||
|
+ *
|
||||||
|
+ * @deprecated Unused. Will be removed in Tomcat 10.
|
||||||
|
+ */
|
||||||
|
+ @Deprecated
|
||||||
|
public boolean isUpgraded() { return upgraded; }
|
||||||
|
+ /**
|
||||||
|
+ * @param upgraded {@code true} if the connection has been upgraded.
|
||||||
|
+ *
|
||||||
|
+ * @deprecated Unused. Will be removed in Tomcat 10.
|
||||||
|
+ */
|
||||||
|
+ @Deprecated
|
||||||
|
public void setUpgraded(boolean upgraded) { this.upgraded = upgraded; }
|
||||||
|
public boolean isSecure() { return secure; }
|
||||||
|
public void setSecure(boolean secure) { this.secure = secure; }
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
45
CVE-2021-25122.patch
Normal file
45
CVE-2021-25122.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From 7b8b7134813a356595eacf01fd9e8ea6b3752c8b Mon Sep 17 00:00:00 2001
|
||||||
|
From: wang_yue111 <648774160@qq.com>
|
||||||
|
Date: Thu, 11 Mar 2021 18:42:09 +0800
|
||||||
|
Subject: [PATCH] Simplify the code and fix an edge case for BZ 64830
|
||||||
|
|
||||||
|
https://bz.apache.org/bugzilla/show_bug.cgi?id=64830
|
||||||
|
---
|
||||||
|
java/org/apache/coyote/AbstractProtocol.java | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/java/org/apache/coyote/AbstractProtocol.java b/java/org/apache/coyote/AbstractProtocol.java
|
||||||
|
index 9f83906..b5c4d5b 100644
|
||||||
|
--- a/java/org/apache/coyote/AbstractProtocol.java
|
||||||
|
+++ b/java/org/apache/coyote/AbstractProtocol.java
|
||||||
|
@@ -766,8 +766,10 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
|
||||||
|
if (state == SocketState.UPGRADING) {
|
||||||
|
// Get the HTTP upgrade handler
|
||||||
|
UpgradeToken upgradeToken = processor.getUpgradeToken();
|
||||||
|
- // Retrieve leftover input
|
||||||
|
+ // Restore leftover input to the wrapper so the upgrade
|
||||||
|
+ // processor can process it.
|
||||||
|
ByteBuffer leftOverInput = processor.getLeftoverInput();
|
||||||
|
+ wrapper.unRead(leftOverInput);
|
||||||
|
if (upgradeToken == null) {
|
||||||
|
// Assume direct HTTP/2 connection
|
||||||
|
UpgradeProtocol upgradeProtocol = getProtocol().getUpgradeProtocol("h2c");
|
||||||
|
@@ -776,7 +778,6 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
|
||||||
|
release(processor);
|
||||||
|
// Create the upgrade processor
|
||||||
|
processor = upgradeProtocol.getProcessor(wrapper, getProtocol().getAdapter());
|
||||||
|
- wrapper.unRead(leftOverInput);
|
||||||
|
// Associate with the processor with the connection
|
||||||
|
connections.put(socket, processor);
|
||||||
|
} else {
|
||||||
|
@@ -798,7 +799,6 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
|
||||||
|
getLog().debug(sm.getString("abstractConnectionHandler.upgradeCreate",
|
||||||
|
processor, wrapper));
|
||||||
|
}
|
||||||
|
- wrapper.unRead(leftOverInput);
|
||||||
|
// Associate with the processor with the connection
|
||||||
|
connections.put(socket, processor);
|
||||||
|
// Initialise the upgrade handler (which may trigger
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
24
CVE-2021-25329-pre1.patch
Normal file
24
CVE-2021-25329-pre1.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
From d63695a656f04e39bd1ad4dee0f2339b0e3b898f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Thomas <markt@apache.org>
|
||||||
|
Date: Wed, 3 Oct 2018 11:16:07 +0000
|
||||||
|
Subject: [PATCH] Ensure that a canonical path is always used for the docBase
|
||||||
|
of a Context to ensure consistent behaviour.
|
||||||
|
|
||||||
|
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1842702 13f79535-47bb-0310-9956-ffa450edef68
|
||||||
|
---
|
||||||
|
java/org/apache/catalina/startup/ContextConfig.java | 2 +-
|
||||||
|
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
index be74f29168..f3935038fc 100644
|
||||||
|
--- a/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
+++ b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
@@ -579,7 +579,7 @@ protected void fixDocBase() throws IOException {
|
||||||
|
|
||||||
|
File file = new File(docBase);
|
||||||
|
if (!file.isAbsolute()) {
|
||||||
|
- docBase = (new File(appBase, docBase)).getPath();
|
||||||
|
+ docBase = (new File(appBase, docBase)).getCanonicalPath();
|
||||||
|
} else {
|
||||||
|
docBase = file.getCanonicalPath();
|
||||||
|
}
|
||||||
28
CVE-2021-25329-pre2.patch
Normal file
28
CVE-2021-25329-pre2.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From ad60947e42e666dc9c9d77315787ea9bb567e3fd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Thomas <markt@apache.org>
|
||||||
|
Date: Wed, 13 Mar 2019 11:18:45 +0000
|
||||||
|
Subject: [PATCH] Always process the docBase using absolute path during
|
||||||
|
deployment
|
||||||
|
|
||||||
|
Use absolute path to determine the Context name, deployment type,
|
||||||
|
whether the docBase is located within the appBase etc.
|
||||||
|
---
|
||||||
|
java/org/apache/catalina/startup/ContextConfig.java | 4 ++--
|
||||||
|
2 files changed, 8 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
index ebd3d8221f..0c67af3bf4 100644
|
||||||
|
--- a/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
+++ b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
@@ -582,9 +582,9 @@ protected void fixDocBase() throws IOException {
|
||||||
|
|
||||||
|
File file = new File(docBase);
|
||||||
|
if (!file.isAbsolute()) {
|
||||||
|
- docBase = (new File(appBase, docBase)).getCanonicalPath();
|
||||||
|
+ docBase = (new File(appBase, docBase)).getAbsolutePath();
|
||||||
|
} else {
|
||||||
|
- docBase = file.getCanonicalPath();
|
||||||
|
+ docBase = file.getAbsolutePath();
|
||||||
|
}
|
||||||
|
file = new File(docBase);
|
||||||
|
String origDocBase = docBase;
|
||||||
144
CVE-2021-25329-pre3.patch
Normal file
144
CVE-2021-25329-pre3.patch
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
From 2c5066316f6b138c4130a87cae4db05d75afe150 Mon Sep 17 00:00:00 2001
|
||||||
|
From: wang_yue111 <648774160@qq.com>
|
||||||
|
Date: Fri, 12 Mar 2021 09:44:04 +0800
|
||||||
|
Subject: [PATCH] 2
|
||||||
|
|
||||||
|
---
|
||||||
|
.../catalina/startup/ContextConfig.java | 75 ++++++++++---------
|
||||||
|
1 file changed, 41 insertions(+), 34 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
index 89eb8d3..a4210f8 100644
|
||||||
|
--- a/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
+++ b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
@@ -566,25 +566,29 @@ public class ContextConfig implements LifecycleListener {
|
||||||
|
Host host = (Host) context.getParent();
|
||||||
|
File appBase = host.getAppBaseFile();
|
||||||
|
|
||||||
|
- String docBase = context.getDocBase();
|
||||||
|
- if (docBase == null) {
|
||||||
|
+ // This could be blank, relative, absolute or canonical
|
||||||
|
+ String docBaseConfigured = context.getDocBase();
|
||||||
|
+ // If there is no explicit docBase, derive it from the path and version
|
||||||
|
+ if (docBaseConfigured == null) {
|
||||||
|
// Trying to guess the docBase according to the path
|
||||||
|
String path = context.getPath();
|
||||||
|
if (path == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ContextName cn = new ContextName(path, context.getWebappVersion());
|
||||||
|
- docBase = cn.getBaseName();
|
||||||
|
+ docBaseConfigured = cn.getBaseName();
|
||||||
|
}
|
||||||
|
|
||||||
|
- File file = new File(docBase);
|
||||||
|
- if (!file.isAbsolute()) {
|
||||||
|
- docBase = (new File(appBase, docBase)).getAbsolutePath();
|
||||||
|
- } else {
|
||||||
|
- docBase = file.getAbsolutePath();
|
||||||
|
- }
|
||||||
|
- file = new File(docBase);
|
||||||
|
- String origDocBase = docBase;
|
||||||
|
+ // Obtain the absolute docBase in String and File form
|
||||||
|
+ String docBaseAbsolute;
|
||||||
|
+ File docBaseConfiguredFile = new File(docBaseConfigured);
|
||||||
|
+ if (!docBaseConfiguredFile.isAbsolute()) {
|
||||||
|
+ docBaseAbsolute = (new File(appBase, docBaseConfigured)).getAbsolutePath();
|
||||||
|
+ } else {
|
||||||
|
+ docBaseAbsolute = docBaseConfiguredFile.getAbsolutePath();
|
||||||
|
+ }
|
||||||
|
+ File docBaseAbsoluteFile = new File(docBaseAbsolute);
|
||||||
|
+ String originalDocBase = docBaseAbsolute;
|
||||||
|
|
||||||
|
ContextName cn = new ContextName(context.getPath(), context.getWebappVersion());
|
||||||
|
String pathName = cn.getBaseName();
|
||||||
|
@@ -597,28 +601,29 @@ public class ContextConfig implements LifecycleListener {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- boolean docBaseInAppBase = docBase.startsWith(appBase.getPath() + File.separatorChar);
|
||||||
|
-
|
||||||
|
- if (docBase.toLowerCase(Locale.ENGLISH).endsWith(".war") && !file.isDirectory()) {
|
||||||
|
- URL war = UriUtil.buildJarUrl(new File(docBase));
|
||||||
|
+ // At this point we need to determine if we have a WAR file in the
|
||||||
|
+ // appBase that needs to be expanded. Therefore we consider the absolute
|
||||||
|
+ // docBase NOT the canonical docBase. This is because some users symlink
|
||||||
|
+ // WAR files into the appBase and we want this to work correctly.
|
||||||
|
+ boolean docBaseAbsoluteInAppBase = docBaseAbsolute.startsWith(appBase.getPath() + File.separatorChar);
|
||||||
|
+ if (docBaseAbsolute.toLowerCase(Locale.ENGLISH).endsWith(".war") && !docBaseAbsoluteFile.isDirectory()) {
|
||||||
|
+ URL war = UriUtil.buildJarUrl(docBaseAbsoluteFile);
|
||||||
|
if (unpackWARs) {
|
||||||
|
- docBase = ExpandWar.expand(host, war, pathName);
|
||||||
|
- file = new File(docBase);
|
||||||
|
- docBase = file.getCanonicalPath();
|
||||||
|
+ docBaseAbsolute = ExpandWar.expand(host, war, pathName);
|
||||||
|
+ docBaseAbsoluteFile = new File(docBaseAbsolute);
|
||||||
|
if (context instanceof StandardContext) {
|
||||||
|
- ((StandardContext) context).setOriginalDocBase(origDocBase);
|
||||||
|
+ ((StandardContext) context).setOriginalDocBase(originalDocBase);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ExpandWar.validate(host, war, pathName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- File docDir = new File(docBase);
|
||||||
|
- File warFile = new File(docBase + ".war");
|
||||||
|
+ File docBaseAbsoluteFileWar = new File(docBaseAbsolute + ".war");
|
||||||
|
URL war = null;
|
||||||
|
- if (warFile.exists() && docBaseInAppBase) {
|
||||||
|
- war = UriUtil.buildJarUrl(warFile);
|
||||||
|
+ if (docBaseAbsoluteFileWar.exists() && docBaseAbsoluteInAppBase) {
|
||||||
|
+ war = UriUtil.buildJarUrl(docBaseAbsoluteFileWar);
|
||||||
|
}
|
||||||
|
- if (docDir.exists()) {
|
||||||
|
+ if (docBaseAbsoluteFile.exists()) {
|
||||||
|
if (war != null && unpackWARs) {
|
||||||
|
// Check if WAR needs to be re-expanded (e.g. if it has
|
||||||
|
// changed). Note: HostConfig.deployWar() takes care of
|
||||||
|
@@ -629,31 +634,33 @@ public class ContextConfig implements LifecycleListener {
|
||||||
|
} else {
|
||||||
|
if (war != null) {
|
||||||
|
if (unpackWARs) {
|
||||||
|
- docBase = ExpandWar.expand(host, war, pathName);
|
||||||
|
- file = new File(docBase);
|
||||||
|
- docBase = file.getCanonicalPath();
|
||||||
|
+ docBaseAbsolute = ExpandWar.expand(host, war, pathName);
|
||||||
|
+ docBaseAbsoluteFile = new File(docBaseAbsolute);
|
||||||
|
} else {
|
||||||
|
- docBase = warFile.getCanonicalPath();
|
||||||
|
+ docBaseAbsolute = docBaseAbsoluteFileWar.getAbsolutePath();
|
||||||
|
+ docBaseAbsoluteFile = docBaseAbsoluteFileWar;
|
||||||
|
ExpandWar.validate(host, war, pathName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (context instanceof StandardContext) {
|
||||||
|
- ((StandardContext) context).setOriginalDocBase(origDocBase);
|
||||||
|
+ ((StandardContext) context).setOriginalDocBase(originalDocBase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- // Re-calculate now docBase is a canonical path
|
||||||
|
- docBaseInAppBase = docBase.startsWith(appBase.getPath() + File.separatorChar);
|
||||||
|
+ String docBaseCanonical = docBaseAbsoluteFile.getCanonicalPath();
|
||||||
|
|
||||||
|
- if (docBaseInAppBase) {
|
||||||
|
- docBase = docBase.substring(appBase.getPath().length());
|
||||||
|
+ // Re-calculate now docBase is a canonical path
|
||||||
|
+ boolean docBaseCanonicalInAppBase = docBaseCanonical.startsWith(appBase.getPath() + File.separatorChar);
|
||||||
|
+ String docBase;
|
||||||
|
+ if (docBaseCanonicalInAppBase) {
|
||||||
|
+ docBase = docBaseCanonical.substring(appBase.getPath().length());
|
||||||
|
docBase = docBase.replace(File.separatorChar, '/');
|
||||||
|
if (docBase.startsWith("/")) {
|
||||||
|
docBase = docBase.substring(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- docBase = docBase.replace(File.separatorChar, '/');
|
||||||
|
+ docBase = docBaseCanonical.replace(File.separatorChar, '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
context.setDocBase(docBase);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
157
CVE-2021-25329.patch
Normal file
157
CVE-2021-25329.patch
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
From 48590d3fc54100031ba9d8c4f6362afb15c6697f Mon Sep 17 00:00:00 2001
|
||||||
|
From: wang_yue111 <648774160@qq.com>
|
||||||
|
Date: Fri, 12 Mar 2021 09:53:00 +0800
|
||||||
|
Subject: [PATCH] Use java.nio.file.Path for consistent sub-directory
|
||||||
|
checking
|
||||||
|
|
||||||
|
---
|
||||||
|
.../catalina/servlets/DefaultServlet.java | 2 +-
|
||||||
|
.../apache/catalina/session/FileStore.java | 2 +-
|
||||||
|
.../catalina/startup/ContextConfig.java | 3 ++-
|
||||||
|
.../apache/catalina/startup/ExpandWar.java | 21 +++++++------------
|
||||||
|
.../apache/catalina/startup/HostConfig.java | 3 +--
|
||||||
|
webapps/docs/changelog.xml | 4 ++++
|
||||||
|
6 files changed, 16 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java b/java/org/apache/catalina/servlets/DefaultServlet.java
|
||||||
|
index 8b453bf..5ad60ec 100644
|
||||||
|
--- a/java/org/apache/catalina/servlets/DefaultServlet.java
|
||||||
|
+++ b/java/org/apache/catalina/servlets/DefaultServlet.java
|
||||||
|
@@ -1992,7 +1992,7 @@ public class DefaultServlet extends HttpServlet {
|
||||||
|
|
||||||
|
// First check that the resulting path is under the provided base
|
||||||
|
try {
|
||||||
|
- if (!candidate.getCanonicalPath().startsWith(base.getCanonicalPath())) {
|
||||||
|
+ if (!candidate.getCanonicalFile().toPath().startsWith(base.getCanonicalFile().toPath())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
diff --git a/java/org/apache/catalina/session/FileStore.java b/java/org/apache/catalina/session/FileStore.java
|
||||||
|
index 0c7f728..f77b46a 100644
|
||||||
|
--- a/java/org/apache/catalina/session/FileStore.java
|
||||||
|
+++ b/java/org/apache/catalina/session/FileStore.java
|
||||||
|
@@ -356,7 +356,7 @@ public final class FileStore extends StoreBase {
|
||||||
|
File file = new File(storageDir, filename);
|
||||||
|
|
||||||
|
// Check the file is within the storage directory
|
||||||
|
- if (!file.getCanonicalPath().startsWith(storageDir.getCanonicalPath())) {
|
||||||
|
+ if (!file.getCanonicalFile().toPath().startsWith(storageDir.getCanonicalFile().toPath())) {
|
||||||
|
log.warn(sm.getString("fileStore.invalid", file.getPath(), id));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
index a4210f8..5202253 100644
|
||||||
|
--- a/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
+++ b/java/org/apache/catalina/startup/ContextConfig.java
|
||||||
|
@@ -651,7 +651,8 @@ public class ContextConfig implements LifecycleListener {
|
||||||
|
String docBaseCanonical = docBaseAbsoluteFile.getCanonicalPath();
|
||||||
|
|
||||||
|
// Re-calculate now docBase is a canonical path
|
||||||
|
- boolean docBaseCanonicalInAppBase = docBaseCanonical.startsWith(appBase.getPath() + File.separatorChar);
|
||||||
|
+ boolean docBaseCanonicalInAppBase =
|
||||||
|
+ docBaseAbsoluteFile.getCanonicalFile().toPath().startsWith(appBase.toPath());
|
||||||
|
String docBase;
|
||||||
|
if (docBaseCanonicalInAppBase) {
|
||||||
|
docBase = docBaseCanonical.substring(appBase.getPath().length());
|
||||||
|
diff --git a/java/org/apache/catalina/startup/ExpandWar.java b/java/org/apache/catalina/startup/ExpandWar.java
|
||||||
|
index 7fd7144..55fe1f5 100644
|
||||||
|
--- a/java/org/apache/catalina/startup/ExpandWar.java
|
||||||
|
+++ b/java/org/apache/catalina/startup/ExpandWar.java
|
||||||
|
@@ -26,6 +26,7 @@ import java.net.JarURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.nio.channels.FileChannel;
|
||||||
|
+import java.nio.file.Path;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.jar.JarEntry;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
@@ -116,10 +117,7 @@ public class ExpandWar {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expand the WAR into the new document base directory
|
||||||
|
- String canonicalDocBasePrefix = docBase.getCanonicalPath();
|
||||||
|
- if (!canonicalDocBasePrefix.endsWith(File.separator)) {
|
||||||
|
- canonicalDocBasePrefix += File.separator;
|
||||||
|
- }
|
||||||
|
+ Path canonicalDocBasePath = docBase.getCanonicalFile().toPath();
|
||||||
|
|
||||||
|
// Creating war tracker parent (normally META-INF)
|
||||||
|
File warTrackerParent = warTracker.getParentFile();
|
||||||
|
@@ -134,14 +132,13 @@ public class ExpandWar {
|
||||||
|
JarEntry jarEntry = jarEntries.nextElement();
|
||||||
|
String name = jarEntry.getName();
|
||||||
|
File expandedFile = new File(docBase, name);
|
||||||
|
- if (!expandedFile.getCanonicalPath().startsWith(
|
||||||
|
- canonicalDocBasePrefix)) {
|
||||||
|
+ if (!expandedFile.getCanonicalFile().toPath().startsWith(canonicalDocBasePath)) {
|
||||||
|
// Trying to expand outside the docBase
|
||||||
|
// Throw an exception to stop the deployment
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
sm.getString("expandWar.illegalPath",war, name,
|
||||||
|
expandedFile.getCanonicalPath(),
|
||||||
|
- canonicalDocBasePrefix));
|
||||||
|
+ canonicalDocBasePath));
|
||||||
|
}
|
||||||
|
int last = name.lastIndexOf('/');
|
||||||
|
if (last >= 0) {
|
||||||
|
@@ -217,10 +214,7 @@ public class ExpandWar {
|
||||||
|
File docBase = new File(host.getAppBaseFile(), pathname);
|
||||||
|
|
||||||
|
// Calculate the document base directory
|
||||||
|
- String canonicalDocBasePrefix = docBase.getCanonicalPath();
|
||||||
|
- if (!canonicalDocBasePrefix.endsWith(File.separator)) {
|
||||||
|
- canonicalDocBasePrefix += File.separator;
|
||||||
|
- }
|
||||||
|
+ Path canonicalDocBasePath = docBase.getCanonicalFile().toPath();
|
||||||
|
JarURLConnection juc = (JarURLConnection) war.openConnection();
|
||||||
|
juc.setUseCaches(false);
|
||||||
|
try (JarFile jarFile = juc.getJarFile()) {
|
||||||
|
@@ -229,14 +223,13 @@ public class ExpandWar {
|
||||||
|
JarEntry jarEntry = jarEntries.nextElement();
|
||||||
|
String name = jarEntry.getName();
|
||||||
|
File expandedFile = new File(docBase, name);
|
||||||
|
- if (!expandedFile.getCanonicalPath().startsWith(
|
||||||
|
- canonicalDocBasePrefix)) {
|
||||||
|
+ if (!expandedFile.getCanonicalFile().toPath().startsWith(canonicalDocBasePath)) {
|
||||||
|
// Entry located outside the docBase
|
||||||
|
// Throw an exception to stop the deployment
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
sm.getString("expandWar.illegalPath",war, name,
|
||||||
|
expandedFile.getCanonicalPath(),
|
||||||
|
- canonicalDocBasePrefix));
|
||||||
|
+ canonicalDocBasePath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
diff --git a/java/org/apache/catalina/startup/HostConfig.java b/java/org/apache/catalina/startup/HostConfig.java
|
||||||
|
index a4dad6f..d7bf6a2 100644
|
||||||
|
--- a/java/org/apache/catalina/startup/HostConfig.java
|
||||||
|
+++ b/java/org/apache/catalina/startup/HostConfig.java
|
||||||
|
@@ -597,8 +597,7 @@ public class HostConfig implements LifecycleListener {
|
||||||
|
docBase = new File(host.getAppBaseFile(), context.getDocBase());
|
||||||
|
}
|
||||||
|
// If external docBase, register .xml as redeploy first
|
||||||
|
- if (!docBase.getCanonicalPath().startsWith(
|
||||||
|
- host.getAppBaseFile().getAbsolutePath() + File.separator)) {
|
||||||
|
+ if (!docBase.getCanonicalFile().toPath().startsWith(host.getAppBaseFile().toPath())) {
|
||||||
|
isExternal = true;
|
||||||
|
deployedApp.redeployResources.put(
|
||||||
|
contextXml.getAbsolutePath(),
|
||||||
|
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
|
||||||
|
index 1fc4907..bc37288 100644
|
||||||
|
--- a/webapps/docs/changelog.xml
|
||||||
|
+++ b/webapps/docs/changelog.xml
|
||||||
|
@@ -947,6 +947,10 @@
|
||||||
|
Update the NSIS Installer used to build the Windows installer to version
|
||||||
|
3.03. (kkolinko)
|
||||||
|
</update>
|
||||||
|
+ <scode>
|
||||||
|
+ Use <code>java.nio.file.Path</code> to test for one directory being a
|
||||||
|
+ sub-directory of another in a consistent way. (markt)
|
||||||
|
+ </scode>
|
||||||
|
</changelog>
|
||||||
|
</subsection>
|
||||||
|
</section>
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
14
tomcat.spec
14
tomcat.spec
@ -13,7 +13,7 @@
|
|||||||
Name: tomcat
|
Name: tomcat
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
Version: %{major_version}.%{minor_version}.%{micro_version}
|
Version: %{major_version}.%{minor_version}.%{micro_version}
|
||||||
Release: 17
|
Release: 18
|
||||||
Summary: Implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies
|
Summary: Implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies
|
||||||
License: ASL 2.0
|
License: ASL 2.0
|
||||||
URL: http://tomcat.apache.org/
|
URL: http://tomcat.apache.org/
|
||||||
@ -76,6 +76,12 @@ Patch6030: CVE-2020-13943-3.patch
|
|||||||
Patch6031: CVE-2020-13943-4.patch
|
Patch6031: CVE-2020-13943-4.patch
|
||||||
Patch6032: CVE-2020-17527.patch
|
Patch6032: CVE-2020-17527.patch
|
||||||
Patch6033: CVE-2021-24122.patch
|
Patch6033: CVE-2021-24122.patch
|
||||||
|
Patch6035: CVE-2021-25122-pre.patch
|
||||||
|
Patch6036: CVE-2021-25122.patch
|
||||||
|
Patch6037: CVE-2021-25329-pre1.patch
|
||||||
|
Patch6038: CVE-2021-25329-pre2.patch
|
||||||
|
Patch6039: CVE-2021-25329-pre3.patch
|
||||||
|
Patch6040: CVE-2021-25329.patch
|
||||||
|
|
||||||
BuildRequires: ecj >= 1:4.6.1 findutils apache-commons-collections apache-commons-daemon
|
BuildRequires: ecj >= 1:4.6.1 findutils apache-commons-collections apache-commons-daemon
|
||||||
BuildRequires: apache-commons-dbcp apache-commons-pool tomcat-taglibs-standard ant
|
BuildRequires: apache-commons-dbcp apache-commons-pool tomcat-taglibs-standard ant
|
||||||
@ -477,6 +483,12 @@ fi
|
|||||||
%{_javadocdir}/%{name}
|
%{_javadocdir}/%{name}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Mar 12 2021 wangyue <wangyue92@huawei.com> - 1:9.0.10-18
|
||||||
|
- Type:cve
|
||||||
|
- ID: CVE-2021-25122 CVE-2021-25329
|
||||||
|
- SUG:restart
|
||||||
|
- DESC: fix CVE-2021-25122 CVE-2021-25329
|
||||||
|
|
||||||
* Thu Feb 18 2021 wangxiao <wangxiao65@huawei.com> - 1:9.0.10-17
|
* Thu Feb 18 2021 wangxiao <wangxiao65@huawei.com> - 1:9.0.10-17
|
||||||
- Type:cve
|
- Type:cve
|
||||||
- ID: CVE-2021-24122
|
- ID: CVE-2021-24122
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user