扒一扒这个注解,我发现还有点意思。 (上)

简介: 扒一扒这个注解,我发现还有点意思。 (上)

你好呀,我是歪歪。

不是 Log4j 爆出漏洞了嘛,然后前几天有小伙伴来问我:我项目里面用的是 Lombok 的 @Slf4j 这个会有影响吗?

image.png

你说这事多巧,我也用的这个注解,所以我当时稍微的看了一下。

先说结论:有没有影响还是取决于你项目中依赖的 log4j2 包,和 Lombok 没有任何关系。

另外“求求你提问之前三思,不要浪费我们的时间,不要问那些你自己就能搞清楚的问题”这句话不是我说的,是 Lombok 的作者说的:

image.png

他为什么会说出这样的略带一丝丝气愤的话呢?


网络异常,图片无法展示
|



从issue 说起


你在 github 上找到 Lombok 项目,然后查看它的 issue 会看到关于 log4j 的问题已经被置顶了:


image.png

所以关于这个问题,我就从这个 issue 说起吧,这里面有 Lombok 维护者的权威回答。

https://github.com/projectlombok/lombok/issues/3063


image.png

这个 issue 的标题翻译过来就是:

结论:关于 log4j 的 0day 问题,Lombok 本身不受影响。

注意啊,这个里面有个非常耐人寻味的单词:itself。

image.png

一般我们说 Lombok 不受影响就行了,为什么还得加个 itself(本身)呢?

这里面就是有故事的。

首先是 12 月 10 日下午 5 点 41 分,也就是漏洞被爆出的那个下午,有个哥们在 Lombok 的 issue 提出了这个问题:

image.png

他说:铁子们,出事了,log4j 爆出惊天大漏洞,赶紧补吧。

image.png

image.png

老哥,你能解释一下这个漏洞 对 Lombok 有什么影响吗?据我所知,log4j 只是在运行测试时不出现编译错误时才需要。

这个老哥明显是对 Lombok 比较了解的,他其实已经指出关键的地方了:Lombok 并没有依赖 log4j。

但是紧接着有人指出:

image.png

Lombok 提供了一个注解,叫做 @log4j。这玩意使用了 Log4J 的库吧,毕竟要用它记录日志。

确实有这个注解啊,给大家看一下:

image.png

我一般是用 @Slf4j 这个注解,但是它确实是还提供了其他的日志注解,这个先按下不表,等下再说。

现在的主线任务是这个 issue,接着往下看。

接下来,来了一个控场的哥们,看一下他说了啥:

image.png

他先艾特了前面的说 @log4j 注解的这个哥们,给他解释说:虽然 Lombok 会生成代码来创建一个 logger 的实例,但我们并没有 ship, distribute or require 任何特定的版本,如果用户要用这个注解,需要他们自己提供对应的依赖。

这里我有三个词我还没翻译:ship, distribute or require。

require 其实很简单,就是要求。

意思是我们没有要求用户使用的时候必须给到指定版本的依赖。说白了就是,假设你要用 @Log4j,那就提供对应的依赖,至于这个依赖的版本是什么 Lombok 并不关心。

剩下的 ship 直译过来是“运送” 的意思,而 distribute 有“分发”的意思。

这个我用一张图片来解释吧:

image.png

可以看到,在项目中我引用了 Lombok,但是它并没有传递依赖进来任何其他的包。不像是 spring-boot-starter 后面跟着一大坨东西。

我理解这就是他想要表达的:we do not ship, distribute or require any specific version.

然后接着说:在我们的代码库中确实可以找到一个 log4j2 的版本,但那只是在测试代码里面使用,以便能够无错误地编译生成的代码。

最后这个哥们总结到:放心,老铁们,Lombok 仍然可以安全的使用。但我觉得虽然是测试代码中引用到了 Log4j ,也还是应该把依赖关系更新到安全的版本。

怎么样,是不是感觉这个老哥说话有一种不可置疑的自信感。

我读完这个回答之后就是有这样的感觉,隐隐觉得这就是个大佬。

于是我去扒了一下这个老哥的背景:


image.png

本来我是想从他的 github 主页上寻找答案,居然没有发现和 Lombok 相关的项目。

而且只有 49 个 followers,看着也不符合大佬的数据呀:

image.png

于是我转战浏览器,搜索了:Roel Spilker Lombok.

找到了这个:

image.png

才发现,好家伙,他是 Lombok 的爸爸啊,难怪说话这么硬气。

还发现了一个花边新闻:他们之前还把关于 Lombok 的想法贡献给了 Oracle,但是被拒绝了。官方不支持,他们只有揭竿而起,自己搞了。

现在 Lombok 的市场占有率还是很高的吧,算是把这事儿干成功了。

另外,其实这里就可以直接看到他的身份:

image.png

Collaborator,就是合作人。他的回答可以等同于官方回答了。

到这里事情还算是发展的比较顺利,官方亲自下场来解答这个问题,且已经明说了:

image.png

算是可以完结撒花了。

但是,就怕出现但是啊,后面发生的事情我就觉得有点离谱了。

首先是 SunriseChair 老哥献出了一杀:

image.png

他首先引用了作者的回复,然后说,如果你在你的 maven 或者 gradle 中声明 Lombok 这个依赖项,那么 Log4j 的依赖项不也会被包括在内吗?这可能是 classpath 上唯一的依赖,而 Lombok 生成的代码也会用到它?如果我说错了,请纠正我......

他想要表达的是什么意思呢。

首先我觉得是他读完作者的回答后觉得 Lombok 是依赖了 Log4j 的,所以他的核心问题就是,如果我引用了 Lombok 那么 Log4j 的依赖岂不是也会传递进来?

但是作者都说了:there is a version to be found in our code base, but that's 仅仅用于测试类中。

但凡你稍微了解一点开源项目的工作原理,也就知道测试相关的部分都不会提供出去,如果你要看测试类,你得把项目源码拉下来。

简单来说就是如果你通过 maven 依赖了 Lombok,测试相关的东西你肯定是看不到的。

接着一位叫做 RuanNunes 的老哥也出来补枪了,献上了二杀,他说他在整个项目里面搜索到了这个东西:


image.png

这个配置是存在漏洞的。

然后作者对这两个问题进行了一一回复:

image.png

首先,说 Lombok 依赖了 log4j 的老哥听着:Lombok 没有对 log4j 或任何其他库进行依赖。如果你在你的代码中使用 @Log4j 注解,但是又不直接或间接地依赖 log4j ,你的编译就会产生一个错误信息。

关于这一点,前面的依赖分析截图也已经说明了,我就不再贴一次了。

然后说找到漏洞的哥们听着:在你找到的这个漏洞的同一目录下有一个文本文件,但凡你去看一眼,你就知道我们不会将该文件作为我们发布的一部分。

所以我理解压根不会发布出去,即使有漏洞,对于 Lombok 的用户来说也没有任何毛病吧?

我也去找了一下作者说的这个文件,就是它:

https://github.com/projectlombok/lombok/blob/d3b763f9dab4a46e88ff10bc2132fb6f12fda639/src/support/info.txt


image.png

这个文件里面清清楚楚的说了:not part of lombok itself.

如果前面这两个问题,已经让作者有点点不爽的感觉的话,那么接下来这个问题,可能就是引爆点,完成三杀,一波带走:

image.png

这个哥们上来就说:老铁,我问个问题哈。我使用的是 @slf4j 注解,这个漏洞和我有关系吗?

不行了不行了,血压上来了。

网络异常,图片无法展示
|

我觉得这个哥们提问之前完全没有看前面的回复,如果他在作者进行了两次解释之前提出这个问题,那么我觉得完全可以理解。

但是在作者已经在这个 issue 里面解释了两次“Lombok 不受影响”的前提下,他哗一下,上来就是一个暴击:

老哥,我用的这个注解有问题吗?

我写到这里都有点血压上来了。

这特么特别像是之前有一次在一个群里和别人讨论事务失效的场景,已经讨论到尾声了,突然跳出来一个哥们,甩出来一个代码片段,这个片段的写法就是一个经典的 this 调用导致事务注解失效的场景,而这就是我们刚刚讨论中的一部分。

知道我们在讨论这个问题,哪怕你稍微往上翻一翻呢,了解一下上下文再提问不好吗?

不扯远了,也许是我过度解读把,反正我觉得提问的艺术大家都得好好学一下。

回到我们的主线剧情,看一下作者是怎么回答这个问题的:

image.png

他说:老铁,这个问题我帮不了你啊。我对于这个漏洞一无所知,我甚至不明白为什么你会认为它也会影响 @Slf4j。

我可以告诉你的是,Lombok 没有使用、传递、要求对这些库的依赖。

我们的工作原理是生成了你"看不见的源代码"。

如果你有任何理由怀疑类似的问题也可能发生在他们的产品中,请联系 Slf4j 的维护者。

image.png

目录
相关文章
|
5月前
|
存储 设计模式 人工智能
AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
887 0
|
8月前
|
存储 分布式计算 监控
ClickHouse简介
ClickHouse是一款专注于OLAP(联机分析处理)的列式存储数据库,以其极致的查询性能、高压缩率和实时分析能力著称。它通过列式存储、向量化查询引擎及分布式架构,满足大规模数据复杂聚合需求,适用于实时日志分析、用户行为分析等场景。然而,ClickHouse不支持事务(ACID),JOIN性能较弱,且对单行更新/删除效率低,不适合OLTP场景。其丰富的表引擎(如MergeTree系列)和数据类型(如LowCardinality优化类型)为不同业务需求提供了灵活支持。
|
数据采集 监控 JavaScript
工厂生产管理系统MES十大核心功能模块
MES提供了对生产现场的实时可视化,帮助企业管理生产计划、物料追踪、工艺控制、产品质量和生产设备等方面的工作。
636 11
|
XML Java 测试技术
TestNG 与 JUnit 测试框架:哪个更好?
【2月更文挑战第16天】
837 1
TestNG 与 JUnit 测试框架:哪个更好?
|
1天前
|
数据采集 人工智能 安全
|
10天前
|
云安全 监控 安全
|
2天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
915 150
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1649 8
|
6天前
|
人工智能 前端开发 文件存储
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择
星哥带你玩转飞牛NAS,部署开源笔记TriliumNext!支持树状知识库、多端同步、AI摘要与代码高亮,数据自主可控,打造个人“第二大脑”。高效玩家的新选择,轻松搭建专属知识管理体系。
366 152