CVE-2017-5929 Security vulnerability and redefine default log rotation policy.

Patch by Michael Shuler; Reviewed by Ariel Weisberg for CASSANDRA-14183
This commit is contained in:
Michael Shuler 2018-02-14 11:42:59 -05:00 committed by Ariel Weisberg
parent 44ce9536ff
commit c0aa79e545
11 changed files with 39 additions and 21 deletions

View File

@ -1,4 +1,5 @@
4.0 4.0
* CVE-2017-5929 Security vulnerability and redefine default log rotation policy (CASSANDRA-14183)
* Use JVM default SSL validation algorithm instead of custom default (CASSANDRA-13259) * Use JVM default SSL validation algorithm instead of custom default (CASSANDRA-13259)
* Better document in code InetAddressAndPort usage post 7544, incorporate port into UUIDGen node (CASSANDRA-14226) * Better document in code InetAddressAndPort usage post 7544, incorporate port into UUIDGen node (CASSANDRA-14226)
* Fix sstablemetadata date string for minLocalDeletionTime (CASSANDRA-14132) * Fix sstablemetadata date string for minLocalDeletionTime (CASSANDRA-14132)

View File

@ -383,8 +383,8 @@
<dependency groupId="org.slf4j" artifactId="slf4j-api" version="1.7.25"/> <dependency groupId="org.slf4j" artifactId="slf4j-api" version="1.7.25"/>
<dependency groupId="org.slf4j" artifactId="log4j-over-slf4j" version="1.7.25"/> <dependency groupId="org.slf4j" artifactId="log4j-over-slf4j" version="1.7.25"/>
<dependency groupId="org.slf4j" artifactId="jcl-over-slf4j" version="1.7.25" /> <dependency groupId="org.slf4j" artifactId="jcl-over-slf4j" version="1.7.25" />
<dependency groupId="ch.qos.logback" artifactId="logback-core" version="1.1.3"/> <dependency groupId="ch.qos.logback" artifactId="logback-core" version="1.2.3"/>
<dependency groupId="ch.qos.logback" artifactId="logback-classic" version="1.1.3"/> <dependency groupId="ch.qos.logback" artifactId="logback-classic" version="1.2.3"/>
<dependency groupId="org.codehaus.jackson" artifactId="jackson-core-asl" version="1.9.2"/> <dependency groupId="org.codehaus.jackson" artifactId="jackson-core-asl" version="1.9.2"/>
<dependency groupId="org.codehaus.jackson" artifactId="jackson-mapper-asl" version="1.9.2"/> <dependency groupId="org.codehaus.jackson" artifactId="jackson-mapper-asl" version="1.9.2"/>
<dependency groupId="com.googlecode.json-simple" artifactId="json-simple" version="1.1"/> <dependency groupId="com.googlecode.json-simple" artifactId="json-simple" version="1.1"/>

View File

@ -22,7 +22,7 @@ In order to disable debug.log, comment-out the ASYNCDEBUGLOG
appender reference in the root level section below. appender reference in the root level section below.
--> -->
<configuration scan="true"> <configuration scan="true" scanPeriod="60 seconds">
<jmxConfigurator /> <jmxConfigurator />
<!-- No shutdown hook; we run it ourselves in StorageService after shutdown --> <!-- No shutdown hook; we run it ourselves in StorageService after shutdown -->
@ -34,14 +34,14 @@ appender reference in the root level section below.
<level>INFO</level> <level>INFO</level>
</filter> </filter>
<file>${cassandra.logdir}/system.log</file> <file>${cassandra.logdir}/system.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${cassandra.logdir}/system.log.%i.zip</fileNamePattern> <!-- rollover daily -->
<minIndex>1</minIndex> <fileNamePattern>${cassandra.logdir}/system.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
<maxIndex>20</maxIndex> <!-- each file should be at most 50MB, keep 7 days worth of history, but at most 5GB -->
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy> </rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
<encoder> <encoder>
<pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern> <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern>
</encoder> </encoder>
@ -51,14 +51,14 @@ appender reference in the root level section below.
<appender name="DEBUGLOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="DEBUGLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${cassandra.logdir}/debug.log</file> <file>${cassandra.logdir}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${cassandra.logdir}/debug.log.%i.zip</fileNamePattern> <!-- rollover daily -->
<minIndex>1</minIndex> <fileNamePattern>${cassandra.logdir}/debug.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
<maxIndex>20</maxIndex> <!-- each file should be at most 50MB, keep 7 days worth of history, but at most 5GB -->
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy> </rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
<encoder> <encoder>
<pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern> <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern>
</encoder> </encoder>

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/logback-core-1.2.3.jar Normal file

Binary file not shown.

View File

@ -88,6 +88,8 @@ public final class ThreadAwareSecurityManager extends SecurityManager
// To work around this, a custom ReconfigureOnChangeFilter is installed, that simply // To work around this, a custom ReconfigureOnChangeFilter is installed, that simply
// prevents this configuration file check and possible reload of the configration, // prevents this configuration file check and possible reload of the configration,
// while executing sandboxed UDF code. // while executing sandboxed UDF code.
//
// NOTE: this is obsolte with logback versions (at least since 1.2.3)
Logger l = LoggerFactory.getLogger(ThreadAwareSecurityManager.class); Logger l = LoggerFactory.getLogger(ThreadAwareSecurityManager.class);
ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) l; ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) l;
LoggerContext ctx = logbackLogger.getLoggerContext(); LoggerContext ctx = logbackLogger.getLoggerContext();
@ -110,6 +112,9 @@ public final class ThreadAwareSecurityManager extends SecurityManager
/** /**
* The purpose of this class is to prevent logback from checking for config file change, * The purpose of this class is to prevent logback from checking for config file change,
* if the current thread is executing a sandboxed thread to avoid {@link AccessControlException}s. * if the current thread is executing a sandboxed thread to avoid {@link AccessControlException}s.
*
* This is obsolete with logback versions that replaced {@link ReconfigureOnChangeFilter}
* with {@link ch.qos.logback.classic.joran.ReconfigureOnChangeTask} (at least logback since 1.2.3).
*/ */
private static class SMAwareReconfigureOnChangeFilter extends ReconfigureOnChangeFilter private static class SMAwareReconfigureOnChangeFilter extends ReconfigureOnChangeFilter
{ {

View File

@ -17,7 +17,7 @@
under the License. under the License.
--> -->
<configuration debug="false" scan="true"> <configuration debug="false" scan="true" scanPeriod="60 seconds">
<!-- Shutdown hook ensures that async appender flushes --> <!-- Shutdown hook ensures that async appender flushes -->
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/> <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>

View File

@ -218,10 +218,10 @@ public class DatabaseDescriptorRefTest
method.invoke(null); method.invoke(null);
if ("clientInitialization".equals(methodName) && if ("clientInitialization".equals(methodName) &&
threadCount + 1 == threads.getThreadCount()) threadCount + 2 == threads.getThreadCount())
{ {
// ignore the "AsyncAppender-Worker-ASYNC" thread // ignore the "AsyncAppender-Worker-ASYNC" and "logback-1" threads
threadCount++; threadCount = threadCount + 2;
} }
if (threadCount != threads.getThreadCount()) if (threadCount != threads.getThreadCount())

View File

@ -38,6 +38,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.ReconfigureOnChangeTask;
import ch.qos.logback.classic.spi.TurboFilterList; import ch.qos.logback.classic.spi.TurboFilterList;
import ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter; import ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter;
import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.classic.turbo.TurboFilter;
@ -58,6 +59,7 @@ import org.apache.cassandra.transport.Event;
import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.transport.ProtocolVersion;
import org.apache.cassandra.transport.messages.ResultMessage; import org.apache.cassandra.transport.messages.ResultMessage;
import static ch.qos.logback.core.CoreConstants.RECONFIGURE_ON_CHANGE_TASK;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
@ -1849,6 +1851,16 @@ public class AggregationTest extends CQLTester
break; break;
} }
} }
ReconfigureOnChangeTask roct = (ReconfigureOnChangeTask) ctx.getObject(RECONFIGURE_ON_CHANGE_TASK);
if (roct != null)
{
// New functionality in logback - they replaced ReconfigureOnChangeFilter (which runs in the logging code)
// with an async ReconfigureOnChangeTask - i.e. in a thread that does not become sandboxed.
// Let the test run anyway, just we cannot reconfigure it (and it is pointless to reconfigure).
return;
}
assertTrue("ReconfigureOnChangeFilter not in logback's turbo-filter list - do that by adding scan=\"true\" to logback-test.xml's configuration element", done); assertTrue("ReconfigureOnChangeFilter not in logback's turbo-filter list - do that by adding scan=\"true\" to logback-test.xml's configuration element", done);
} }