12月10日,发现了
log4j2
的一个严重漏洞(CVE-2021-44228)。我被要求检测我们项目中所有使用log4j
(包括直接和传递依赖关系)的情况(主要是Maven项目)。如果log4j2
被列为直接依赖项,则很容易检测出来。我可以通过mvn dependency:tree
或mvn dependency:build-classpath
来检查它们。如下所示的树形结构。我知道Eclipse Steady和OWASP也是使用这种方法。
然而,在某些特殊情况下,情况并不那么简单。例如,我有另一个项目:my-company:my-app:v1.0
\- org.apache.logging.log4j:log4j-api:jar:2.13.3:compile
看起来很清晰,对吧?但实际上,在my-company:my-app2:v1.0
\- com.alibaba:druid:jar:1.2.8:compile
druid 1.2.8
中,log4j2
被列为“provided”依赖项。请参考此处的Pom文件here。根据Maven文档,“provided”域不是传递性的,因此log4j
不在树中列出。
但实际上它确实存在。我可以在这个druid:1.2.8
中找到log4j的函数调用。
请参考此处:log4j2 in druid 。
我还使用soot
来确保可以实际访问该函数。
根据此网页,任何类似于${jndi:ldap://example.com/a}
的字符串都可能引起此类问题。因此,理论上druid:1.2.8
已被感染。
实际上的依赖关系可能像这样:
我们将my-company:my-app2:v1.0
\- com.alibaba:druid:jar:1.2.8:compile
\-org.apache.logging.log4j:log4j-core:jar:2.13.3:provided
log4j
和my-app2
之间的关系定义为传递性“provided”依赖项。
这是我的问题:
为什么Maven依赖树中不会列出传递性的provided依赖?仅仅是为了更好地理解依赖关系。
除了手动逐一检查POM文件,我们该如何解决传递性的provided依赖?