Log4j2 CVE-2021-44288 代码审计(底层调用链分析)

打印 上一主题 下一主题

主题 637|帖子 637|积分 1911

1、搭建本地环境

2、编写Demo

3、开启debug跟踪方法
3.1 跟进 error 方法 

3.2 跟进 logIfEnabled 方法

3.3 跟进 logMessage 方法

3.4 跟进 logMessageSafely 方法

3.5 跟进 logMessageTrackRecursion 方法

3.6 跟进 tryLogMessage 方法

3.7 跟进 log 方法

3.8 跟进 log 方法

3.9 跟进 log 方法

3.9 跟进 processLogEvent 方法

3.10 跟进 callAppenders 方法

3.11 跟进

3.12 跟进 callAppenderPreventRecursion 方法

3.13 跟进 callAppender0 方法

3.14 跟进 tryCallAppender 方法

3.15 跟进 append 方法

3.16 跟进 tryAppend 方法

3.17 跟进 directEncodeEvent 方法

3.18 跟进 encode 方法

3.19 跟进 toText 方法

3.20 跟进 toSerializable 序列化 方法

3.21 跟进 format 方法

3.22 跟进 format 方法

3.23 跟进 replace 方法(进入 if 判断前,做了格式判断,需要满足 "${" 开头才进入 )

3.24 跟进 substitute 方法

3.25 跟进 resolveVariable 方法

3.26 跟进 lookup 方法

3.27 跟进 lookup 方法
(将传入的参数 jndi 和 rmi://192.168.3.175:8085/goqzKRmu 分离出来赋值给 name 和 prefix )
(StrLookupMap 中储存的 String,object 键值对,取出 JndiLookup 对象,并调用 jndiLookup 的 look 方法)

3.28 跟进 lookup 方法

3.29 跟进 lookup 方法

3.30 先跟进 getURLOrDefaultInitCtx 方法(重要调用)

3.30.1 跟进 getURLContext 方法
(此处将 rmi 协议抽取出来)

3.30.2 跟进 getURLObject 方法

3.30.3 跟进 getObjectInstance 方法
(先根据 scheme 属性的 rmi 参数 获取 rmiURLContextFactory 类,然后调用 rmiURLContextFactory 的 getObjectInstance 方法 )

3.30.4 getObjectInstance 返回值为 rmiURLcontext 对象

3.31 依次返回到 lookup 方法,因返回值为 rmiURLContext 对象,调用该对象的 lookup 方法

3.32 先跟进 getRootURLContext 方法

3.32.1 getRootURLContext 方法 返回一个 解析结果 ResolveResult 对象

3.33 getResolvedObj 方法返回解析对象,强转接口类,再调用 RegistryContext 类的 lookup 方法,继续跟进

3.34 继续跟进 decodeObject 方法(var2 这里应该是发起了连接,工具收到 RMI 请求)

执行 this.registry.lookup(var1.get(0)) 语句时收到 RMI 请求

3.35 关键方法 getObjectInstance 获取对象的实例,跟进该方法
( NamingManager 类是 java 原生类,只与 JDK 版本有关,当前 JDK 版本 8u112)

3.36 继续跟进 get Object Factory From Reference 方法(该方法 从引用获取对象工厂)

3.37  第一个 try catch 应该是本地加载,如果有内容则不进入if判断(未加载到 class,clas 属性还是等于 null)

执行到 clas = helper.loadClass(factoryName, codebase) 加载远程类成功,工具收到请求

计算器 弹出成功(工具写的恶意类 应该是放在 static 代码块中,类加载的时候就会执行 static 代码块,无需使用new创建对象)
(clas.newInstance() 此方法会通过构造方法创建对象)
(恶意代码可以写在 static 代码块中,也可以写在 构造方法 中)

4、log4j2 底层调用链

总结:会根据传入的值去解析成对应的对象

比如 java:os ,对应的是系统属性

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表