自去年年底 Log4Shell 漏洞的爆出,很多人及企业将其标记为过去十年以来最严重的漏洞之一,而如今,它的影响还在继续。
2 月 10 日,知名软件开发公司 JetBrains 宣布旗下 IntelliJ 平台完全停止使用 Log4J 框架,从而采用 java.util.logging 作为标准日志框架。
从质疑到弃用
对于弃用的原因,Jetbrains 稍显无奈。其在公告中指出,早在几个月前 Log4j 2 漏洞被爆出的第一时间,其就在官方博客上发文澄清,基于 IntelliJ 平台的 IDE 不受 Log4j 2 漏洞的影响,因为它们采用的是 Log4j 1.2 的修复版本,其中还删除可能有问题的 org.apache.log4j.net 包。况且 Log4j 的 1.x 和 2.x 之间也存在很大的差异性,属于两个完全不同的代码库,拥有不兼容的 API。
不过,即使如此,也并没有让人或者自动化安全工具“放心”。在不少开发者使用过程中,很多自动化安全工具仍然直接将 IntelliJ 使用旧版本的 Log4j 框架标记为“安全隐患”。
在此之下,Jetbrains 为了规避种种安全警报以及减少潜在的攻击风险,其决定完全停用 Log4j 框架并切换到 java.util.logging 作为标准日志框架。更改将在 IntelliJ 版本 2022.1 中发布。
值得庆幸的是,IntelliJ 对日志框架的要求相当低,其中使用到的唯一功能就是向文件和控制台记录日志,以及为代码库的不同部分配置日志等级等。这些功能都可以作为 JDK 一部分的标准日志 API(java.util.logging)中,因此弃用 Log4j 也相对而言会更方便一些。
方法
不过,由于大量第三方插件(直接或间接)使用 Log4j,JetBrains 将发布 Log4j API 的默认实现,将日志输出重定向到 java.util.logging,这一功能来自 SLF4J 项目。但是,默认实现并没有完全实现所有方法,因此为了保持插件的全部功能,开发者可能需要调整代码以适应新环境。
开发者可以通过以下几种方法检查自己的代码或者依赖项是否使用了 Log4j,并使用新的方法更新代码:
如果在插件代码中使用 Log4j:切换到使用标准平台日志记录 API,com.intellij.openapi.diagnostic.Logger
如果在自己的代码中使用 Log4j,该代码同时在插件和其他上下文中使用:可切换到使用 SLF4J API。IntelliJ 平台通过 java.util.logging 实现了 SLF4J API,因此该平台完全支持 SLF4J 日志记录。
如果在代码的依赖项中使用了 Log4j:请求依赖项维护者切换到 SLF4J。如果这是不可能的,由于 log4j 到 SLF4J 的桥接,从依赖项中的日志记录很可能会继续工作。
如果使用 Log4j API 自定义使用 SLF4J 的依赖项的日志记录:切换到使用 java.util.logging API 来配置处理程序和日志级别。
如果使用 Log4j XML 文件在测试中配置日志记录:切换到使用 .properties 文件的配置,如 LogManager 文档中所述。使用 IntelliJ 测试框架运行测试时,可以使用 idea.log.config.properties.file 系统属性传递日志记录属性文件的路径。
这些更改即将在 221.4165.x EAP 版本中发布,你期待吗?
《新程序员003》正式上市,50余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!