This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 266bab6cb47c18c1047b0cbd11aa095029267464 Author: Piotr P. Karwasz <[email protected]> AuthorDate: Thu Nov 2 19:11:55 2023 +0100 Remove PATH_TRAVERSAL_IN/OUT and URLCONNECTION_SSRF_FD warnings --- log4j-api/pom.xml | 2 -- .../logging/log4j/core/appender/package-info.java | 2 +- .../appender/rolling/DefaultRolloverStrategy.java | 13 ++++++++++ .../rolling/DirectWriteRolloverStrategy.java | 5 ++++ .../log4j/core/appender/rolling/FileExtension.java | 9 +++++++ .../core/appender/rolling/RollingFileManager.java | 6 ++++- .../rolling/RollingRandomAccessFileManager.java | 13 ++++++++++ .../rolling/action/AbstractPathAction.java | 5 ++++ .../appender/rolling/action/FileRenameAction.java | 6 +++++ .../core/appender/rolling/action/package-info.java | 2 +- .../log4j/core/appender/rolling/package-info.java | 2 +- .../log4j/core/config/ConfigurationSource.java | 5 ++++ .../core/config/builder/impl/package-info.java | 2 +- .../config/plugins/convert/CoreTypeConverters.java | 9 +++++++ .../core/config/plugins/convert/package-info.java | 2 +- .../core/config/plugins/util/package-info.java | 2 +- .../log4j/core/config/xml/package-info.java | 2 +- .../core/filter/MutableThreadContextMapFilter.java | 5 ++++ .../logging/log4j/core/jmx/LoggerContextAdmin.java | 8 +++++++ .../logging/log4j/core/jmx/package-info.java | 2 +- .../log4j/core/net/UrlConnectionFactory.java | 9 +++++++ .../logging/log4j/core/net/package-info.java | 2 +- .../log4j/core/net/ssl/FilePasswordProvider.java | 6 +++++ .../logging/log4j/core/net/ssl/package-info.java | 2 +- .../apache/logging/log4j/core/package-info.java | 2 +- .../logging/log4j/core/script/package-info.java | 2 +- .../log4j/core/tools/picocli/CommandLine.java | 3 +++ .../logging/log4j/core/util/package-info.java | 2 +- .../logging/log4j/plugins/util/ResolverUtil.java | 9 +++++++ .../apache/logging/log4j/script/ScriptFile.java | 5 ++++ pom.xml | 10 +++++++- spotbugs-exclude.xml | 28 ++++++++++++++++++++++ 32 files changed, 165 insertions(+), 17 deletions(-) diff --git a/log4j-api/pom.xml b/log4j-api/pom.xml index f198d90168..1885edaf9e 100644 --- a/log4j-api/pom.xml +++ b/log4j-api/pom.xml @@ -43,8 +43,6 @@ java.sql;static=true </bnd-extra-module-options> - <!-- FIXME: temporary --> - <spotbugs.skip>true</spotbugs.skip> </properties> <dependencies> <dependency> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/package-info.java index f8fa17bc9e..7213a145a0 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/package-info.java @@ -18,7 +18,7 @@ * Log4j 2 Appenders. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.appender; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java index 93021eab68..ab7f47392a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java @@ -28,6 +28,7 @@ import java.util.SortedMap; import java.util.concurrent.TimeUnit; import java.util.zip.Deflater; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.appender.rolling.action.Action; import org.apache.logging.log4j.core.appender.rolling.action.CompositeAction; import org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction; @@ -358,6 +359,10 @@ public class DefaultRolloverStrategy extends AbstractRolloverStrategy { * @param manager The RollingFileManager * @return true if purge was successful and rollover should be attempted. */ + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) private int purgeAscending(final int lowIndex, final int highIndex, final RollingFileManager manager) { final SortedMap<Integer, Path> eligibleFiles = getEligibleFiles(manager); final int maxFiles = highIndex - lowIndex + 1; @@ -415,6 +420,10 @@ public class DefaultRolloverStrategy extends AbstractRolloverStrategy { * @param manager The RollingFileManager * @return true if purge was successful and rollover should be attempted. */ + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) private int purgeDescending(final int lowIndex, final int highIndex, final RollingFileManager manager) { // Retrieve the files in descending order, so the highest key will be first. final SortedMap<Integer, Path> eligibleFiles = getEligibleFiles(manager, false); @@ -466,6 +475,10 @@ public class DefaultRolloverStrategy extends AbstractRolloverStrategy { * @throws SecurityException if an error occurs. */ @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) public RolloverDescription rollover(final RollingFileManager manager) throws SecurityException { final int fileIndex; final StringBuilder buf = new StringBuilder(255); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java index 389ba809b7..fa40696b19 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java @@ -27,6 +27,7 @@ import java.util.SortedMap; import java.util.concurrent.TimeUnit; import java.util.zip.Deflater; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.appender.rolling.action.Action; import org.apache.logging.log4j.core.appender.rolling.action.CompositeAction; import org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction; @@ -293,6 +294,10 @@ public class DirectWriteRolloverStrategy extends AbstractRolloverStrategy implem * @throws SecurityException if an error occurs. */ @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) public RolloverDescription rollover(final RollingFileManager manager) throws SecurityException { LOGGER.debug("Rolling " + currentFileName); if (maxFiles < 0) { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileExtension.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileExtension.java index 2e5b096e93..0cb2c8ab54 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileExtension.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileExtension.java @@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.appender.rolling; import java.io.File; import java.util.Objects; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.appender.rolling.action.Action; import org.apache.logging.log4j.core.appender.rolling.action.CommonsCompressAction; import org.apache.logging.log4j.core.appender.rolling.action.GzCompressAction; @@ -115,10 +116,18 @@ public enum FileExtension { return extension.length(); } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) File source(final String fileName) { return new File(fileName); } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) File target(final String fileName) { return new File(fileName); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java index 8cf45f910a..345a00cb2f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java @@ -107,6 +107,10 @@ public class RollingFileManager extends FileManager { this.directWrite = rolloverStrategy instanceof DirectFileRolloverStrategy; } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) public void initialize() { if (!initialized) { @@ -684,7 +688,7 @@ public class RollingFileManager extends FileManager { */ @Override @SuppressFBWarnings( - value = "PATH_TRAVERSAL_IN", + value = {"PATH_TRAVERSAL_IN", "PATH_TRAVERSAL_OUT"}, justification = "The destination file should be specified in the configuration file." ) public RollingFileManager createManager(final String name, final FactoryData data) { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java index f0d719e050..38ac430e8d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java @@ -23,6 +23,7 @@ import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.file.Paths; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.AppenderLoggingException; @@ -145,10 +146,18 @@ public class RollingRandomAccessFileManager extends RollingFileManager { } @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) protected void createFileAfterRollover() throws IOException { createFileAfterRollover(getFileName()); } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) private void createFileAfterRollover(final String fileName) throws IOException { this.randomAccessFile = new RandomAccessFile(fileName, "rw"); if (isAttributeViewEnabled()) { @@ -214,6 +223,10 @@ public class RollingRandomAccessFileManager extends RollingFileManager { * @return a RollingFileManager. */ @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) public RollingRandomAccessFileManager createManager(final String name, final FactoryData data) { File file = null; long size = 0; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractPathAction.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractPathAction.java index 247da93107..402cf29d1a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractPathAction.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractPathAction.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.lookup.StrSubstitutor; /** @@ -101,6 +102,10 @@ public abstract class AbstractPathAction extends AbstractAction { * * @return the base path (all lookups resolved) */ + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) public Path getBasePath() { return Paths.get(subst.replace(getBasePathString())); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java index 86f0bf206e..6cdfa997eb 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java @@ -25,6 +25,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * File rename action. */ @@ -103,6 +105,10 @@ public class FileRenameAction extends AbstractAction { * @param renameEmptyFiles if true, rename file even if empty, otherwise delete empty files. * @return true if successfully renamed. */ + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) public static boolean execute(final File source, final File destination, final boolean renameEmptyFiles) { if (renameEmptyFiles || (source.length() > 0)) { final File parent = destination.getParentFile(); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/package-info.java index df9c341d7e..7605459736 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/package-info.java @@ -18,7 +18,7 @@ * Support classes for the Rolling File Appender. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.appender.rolling.action; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/package-info.java index 094ddc03a5..4c94140c90 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/package-info.java @@ -18,7 +18,7 @@ * Rolling File Appender and support classes. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.appender.rolling; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java index 75e1c05295..bc613980a3 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java @@ -34,6 +34,7 @@ import java.util.Objects; import javax.net.ssl.HttpsURLConnection; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.net.ssl.LaxHostnameVerifier; import org.apache.logging.log4j.core.net.ssl.SslConfiguration; import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory; @@ -324,6 +325,10 @@ public class ConfigurationSource { return getConfigurationSource(url); } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed files is based on a configuration value." + ) private static ConfigurationSource getConfigurationSource(final URL url) { try { final URLConnection urlConnection = url.openConnection(); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/package-info.java index 9eacd9d0b7..c56f92230f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/package-info.java @@ -20,7 +20,7 @@ * @since 2.4 */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.config.builder.impl; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java index fdace9dfb1..1214c1014d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java @@ -34,6 +34,7 @@ import java.util.Base64; import java.util.UUID; import java.util.regex.Pattern; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.appender.rolling.action.Duration; import org.apache.logging.log4j.core.util.CronExpression; @@ -200,6 +201,10 @@ public final class CoreTypeConverters { @Plugin public static class FileConverter implements TypeConverter<File> { @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed file is based on a configuration value." + ) public File convert(final String s) { return new File(s); } @@ -238,6 +243,10 @@ public final class CoreTypeConverters { @Plugin public static class PathConverter implements TypeConverter<Path> { @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The name of the accessed file is based on a configuration value." + ) public Path convert(final String s) throws Exception { return Paths.get(s); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/package-info.java index 22632e1998..59da1e88bc 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/package-info.java @@ -20,7 +20,7 @@ * attributes in plugin factory methods. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.config.plugins.convert; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/package-info.java index 49657032f1..c2c42b8d5b 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/package-info.java @@ -19,7 +19,7 @@ * Utility and manager classes for Log4j 2 plugins. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.config.plugins.util; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/package-info.java index caf38c6281..f0a6c9d7e4 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/package-info.java @@ -18,7 +18,7 @@ * Classes and interfaces supporting configuration of Log4j 2 with XML. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.config.xml; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java index 18dd235010..741e05e71d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java @@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.ContextDataInjector; @@ -321,6 +322,10 @@ public class MutableThreadContextMapFilter extends AbstractFilter { } } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The location of the file comes from a configuration value." + ) private static LastModifiedSource getSource(final String configLocation) { LastModifiedSource source = null; try { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java index 657c748073..7ea5319fd0 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/LoggerContextAdmin.java @@ -107,6 +107,10 @@ public class LoggerContextAdmin extends NotificationBroadcasterSupport implement } @Override + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The location of the configuration comes from a running configuration." + ) public String getConfigLocationUri() { if (loggerContext.getConfigLocation() != null) { return String.valueOf(loggerContext.getConfigLocation()); @@ -118,6 +122,10 @@ public class LoggerContextAdmin extends NotificationBroadcasterSupport implement } @Override + @SuppressFBWarnings( + value = {"URLCONNECTION_SSRF_FD", "PATH_TRAVERSAL_IN"}, + justification = "This method should only be called by a secure JMX connection." + ) public void setConfigLocationUri(final String configLocation) throws URISyntaxException, IOException { if (configLocation == null || configLocation.isEmpty()) { throw new IllegalArgumentException("Missing configuration location"); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/package-info.java index ec3945d302..07c55a1e0b 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/package-info.java @@ -18,7 +18,7 @@ * Log4j 2 JMX support. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.jmx; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java index bb5a448086..1d21f6c478 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java @@ -27,6 +27,7 @@ import java.util.List; import javax.net.ssl.HttpsURLConnection; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.net.ssl.LaxHostnameVerifier; import org.apache.logging.log4j.core.net.ssl.SslConfiguration; import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory; @@ -57,6 +58,10 @@ public class UrlConnectionFactory { private static final String NO_PROTOCOLS = "_none"; public static final String ALLOWED_PROTOCOLS = "log4j2.Configuration.allowedProtocols"; + @SuppressFBWarnings( + value = "URLCONNECTION_SSRF_FD", + justification = "The URL parameter originates only from secure sources." + ) public static <T extends URLConnection> T createConnection(final URL url, final long lastModifiedMillis, final SslConfiguration sslConfiguration, final AuthorizationProvider authorizationProvider, @@ -113,6 +118,10 @@ public class UrlConnectionFactory { return Cast.cast(urlConnection); } + @SuppressFBWarnings( + value = "URLCONNECTION_SSRF_FD", + justification = "This method sanitizes the usage of the provided URL." + ) public static URLConnection createConnection(final URL url) throws IOException { final URLConnection urlConnection; if (url.getProtocol().equals(HTTPS) || url.getProtocol().equals(HTTP)) { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/package-info.java index 28e4e9575c..5bc2e4b5cd 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/package-info.java @@ -25,7 +25,7 @@ * </ul> */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.net; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/FilePasswordProvider.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/FilePasswordProvider.java index 1351a7feab..28f024a1d8 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/FilePasswordProvider.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/FilePasswordProvider.java @@ -26,6 +26,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + /** * PasswordProvider that reads password from a file. * <p> @@ -53,6 +55,10 @@ class FilePasswordProvider implements PasswordProvider { * @param passwordFile the path to the password file * @throws NoSuchFileException if the password file does not exist when this FilePasswordProvider is constructed */ + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The file name comes from a configuration option." + ) public FilePasswordProvider(final String passwordFile) throws NoSuchFileException { this.passwordPath = Paths.get(passwordFile); if (!Files.exists(passwordPath)) { diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java index 6f29c65481..db4860c1ff 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/package-info.java @@ -18,7 +18,7 @@ * Log4j 2 SSL support */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.net.ssl; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/package-info.java index 60748c1e65..a11875eea4 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/package-info.java @@ -18,7 +18,7 @@ * Implementation of Log4j 2. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java index d905a95c59..d973435b64 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java @@ -18,7 +18,7 @@ * Log4j 2 Script support. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.script; import org.osgi.annotation.bundle.Export; diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java index be3d141a57..1706fa406f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java @@ -64,6 +64,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import java.util.regex.Pattern; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.IStyle; import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.Style; import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.Text; @@ -2637,6 +2638,7 @@ public class CommandLine { * Inner class to group the built-in {@link ITypeConverter} implementations. */ private static final class BuiltIn { + @SuppressFBWarnings("PATH_TRAVERSAL_IN") static class PathConverter implements ITypeConverter<Path> { @Override public Path convert(final String value) { return Paths.get(value); } } @@ -2712,6 +2714,7 @@ public class CommandLine { public Double convert(final String value) { return Double.valueOf(value); } } + @SuppressFBWarnings("PATH_TRAVERSAL_IN") static class FileConverter implements ITypeConverter<File> { @Override public File convert(final String value) { return new File(value); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/package-info.java index 7fae142a82..753b7c456b 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/package-info.java @@ -18,7 +18,7 @@ * Log4j 2 helper classes. */ @Export -@Version("2.20.1") +@Version("2.20.2") package org.apache.logging.log4j.core.util; import org.osgi.annotation.bundle.Export; diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java index f2004a32bc..0710dd5a4a 100644 --- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java +++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java @@ -28,6 +28,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarInputStream; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.status.StatusLogger; import org.apache.logging.log4j.util.LoaderUtil; @@ -164,6 +165,10 @@ public class ResolverUtil { * @param packageName * the name of the package from which to start scanning for classes, e.g. {@code net.sourceforge.stripes} */ + @SuppressFBWarnings( + value = {"URLCONNECTION_SSRF_FD", "PATH_TRAVERSAL_IN"}, + justification = "The URLs used come from the classloader." + ) public void findInPackage(final Test test, String packageName) { packageName = packageName.replace('.', '/'); final ClassLoader loader = getClassLoader(); @@ -236,6 +241,10 @@ public class ResolverUtil { } } + @SuppressFBWarnings( + value = "PATH_TRAVERSAL_IN", + justification = "The URLs used come from the classloader." + ) String extractPath(final URL url) throws UnsupportedEncodingException, URISyntaxException { String urlPath = url.getPath(); // same as getFile but without the Query portion // System.out.println(url.getProtocol() + "->" + urlPath); diff --git a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptFile.java b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptFile.java index edc42a6f52..0ad60fec56 100644 --- a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptFile.java +++ b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptFile.java @@ -27,6 +27,7 @@ import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.logging.log4j.core.util.ExtensionLanguageMapping; import org.apache.logging.log4j.core.util.FileUtils; import org.apache.logging.log4j.core.util.NetUtils; @@ -61,6 +62,10 @@ public class ScriptFile extends AbstractScript { } @PluginFactory + @SuppressFBWarnings( + value = {"URLCONNECTION_SSRF_FD", "PATH_TRAVERSAL_IN"}, + justification = "The `filePathOrUri` parameter comes from configuration." + ) public static ScriptFile createScript( // @formatter:off @PluginAttribute String name, diff --git a/pom.xml b/pom.xml index 05eca168ee..107eccc629 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,6 @@ <docLabel>Site Documentation</docLabel> <projectDir /> <module.name /> - <spotbugs.maxRank>14</spotbugs.maxRank> <project.build.outputTimestamp>2023-10-23T19:03:40Z</project.build.outputTimestamp> <!-- ======================== @@ -680,6 +679,15 @@ </configuration> </plugin> + <!-- TODO: Remove after upgrading to `logging-parent` 10.3.0 --> + <plugin> + <groupId>com.github.spotbugs</groupId> + <artifactId>spotbugs-maven-plugin</artifactId> + <configuration> + <excludeFilterFile>${maven.multiModuleProjectDirectory}/spotbugs-exclude.xml</excludeFilterFile> + </configuration> + </plugin> + <!-- ███████ ████████ █████ ██████ ████████ ███████ ██ ████████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ███████ ██████ ██ ███████ ██ ██ █████ diff --git a/spotbugs-exclude.xml b/spotbugs-exclude.xml new file mode 100644 index 0000000000..be6759cc45 --- /dev/null +++ b/spotbugs-exclude.xml @@ -0,0 +1,28 @@ +<?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. + --> +<FindBugsFilter + xmlns="https://github.com/spotbugs/filter/3.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://github.com/spotbugs/filter/3.0.0 https://raw.githubusercontent.com/spotbugs/spotbugs/3.1.0/spotbugs/etc/findbugsfilter.xsd"> + <Match> + <Not> + <Bug category="SECURITY"/> + </Not> + <Rank value="9"/> + </Match> +</FindBugsFilter>
