All, Following log4jshell advisory [1], I want to start a discussion thread around what next steps should we follow.
Overview: The log4j 1.x has limited feature set and didn't have the same attack surface as log4j 2.x, this saved the ACS community from log4jshell [1]. In addition, our uber/fat jar build process since (last few years) only bundles classes from dependency jars that CloudStack management server codebase requires; this may benefit that certain classes which could be exploit-able in 1.x weren't actually shadowed/bundled in the cloudstack-management uber/fat jar[2]. This strategy reduces the CloudStack management uber/far jar's attack surface greatly. What is used in CloudStack: (details investigated with my colleague Daan) * Basic logging feature (console/file/rsyslog appenders, log levels, log4j config file) * Context-aware logging (this includes full/abbreviated class/package name, and sometimes specific context, LogContext and CallContext have some example use of MDC, NDC) * Stacktrace upon exception, a custom CglibThrowableRenderer class * Jar dependencies used: log4j v1.2.17, and apache-log4j-extras v1.2.17 As the next step, I think it would be better to refactor the logging usage to a new loggging utility in cloud-utils which can be used throughout the codebase, and this utility can in-turn wrap whatever logging library we use and reduce our dependency on any logging library/version and swiftly change logging library. The utility may also allow us to centrally add custom cloudstack feature (such as context-aware logging, manage stacktrace output etc). I did some research to look at possible options for the community: 1. Status-Quo, stick with log4j 1.x: this is not ideal, as v1.2.17 was the last release in 1.x which has reach EOL [3]. 2. Migrate to 2.x: this is probably what is advised by the Apache Logging PMC [4] since 1.x has EOL, however: * 1.x pretty much sufficed our requirements of a logging library and 2.x has a large attack surface. * * Other Apache projects (such as hadoop, hive etc) are facing while migrating their large codebases to log4j 2.x; the migration will require time, effort, and testing. The 2.x migration guide would require a lot of manual effort, there is no tooling to do this at scale. * On Twitter, some of the Logging PMC have advised that their v3 architecture will make log4j modular and lower attach surfaces. * My opinion: Logging library shouldn't try to do anything beyond logging, I'm less confident in migrating to 2.x after seeing how the CVE was handled by the Logging PMC and I didn't have a good interaction with them in a ML discussion thread. For an ASF TLP that is asked to adhere to the 'community over code' spirit, the user community isn't listend to and in a ML thread, it was deemed that any 1.x fork/maintenance would be considered "hostile" - this has led to interested sponsors and PMCs of other Apache projects joining forces with Ceki to continue log4j 1.x fork outside of ASF (see below). 3. Migrate to 1.x fork, drop-in replacement: Ceki (one of the developers of log4j 1.x, also behind sl4j and logback) has started a fork of 1.x under the name reload4j with which they continue 1.x support and address bugs/CVEs. They have already published v1.2.18 https://github.com/qos-ch/reload4j this is already finding a lot of support with a lot of users. 4. Migrate to logback: This is another project by Ceki/qos-ch, which aims to continue 1.x work while keeping logging library robust/small, uses sl4j. https://logback.qos.ch/ Thoughts, what/where should we go, any other alternatives we should explore? [1] https://blogs.apache.org/cloudstack/entry/log4jshell [2] https://maven.apache.org/plugins/maven-shade-plugin/ [3] https://blogs.apache.org/foundation/entry/apache_logging_services_project_announces [4] https://logging.apache.org/log4j/2.x/ Regards.