Log4j2 CVE-2021-44288 代码审计(底层调用链分析)
1、搭建本地环境https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320162742854-1814993897.png
2、编写Demo
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320162856824-1634918015.png
3、开启debug跟踪方法
3.1 跟进 error 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164416780-801641560.png
3.2 跟进 logIfEnabled 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164352168-904407123.png
3.3 跟进 logMessage 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164505071-1838971068.png
3.4 跟进 logMessageSafely 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164609995-1395602112.png
3.5 跟进 logMessageTrackRecursion 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164712411-67351249.png
3.6 跟进 tryLogMessage 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164754048-1407455686.png
3.7 跟进 log 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320164954423-1633140566.png
3.8 跟进 log 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320165321012-2076261240.png
3.9 跟进 log 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320165513243-52515292.png
3.9 跟进 processLogEvent 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320165801423-1937398278.png
3.10 跟进 callAppenders 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170013982-1358880904.png
3.11 跟进
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170114638-515277492.png
3.12 跟进 callAppenderPreventRecursion 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170136872-574387517.png
3.13 跟进 callAppender0 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170154636-839924254.png
3.14 跟进 tryCallAppender 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170219081-1521737039.png
3.15 跟进 append 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170241670-2004649188.png
3.16 跟进 tryAppend 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170356402-794962606.png
3.17 跟进 directEncodeEvent 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170609766-550130223.png
3.18 跟进 encode 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320170631417-2084437508.png
3.19 跟进 toText 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320171050799-1524942191.png
3.20 跟进 toSerializable 序列化 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320171111058-1673905794.png
3.21 跟进 format 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320171138325-909480489.png
3.22 跟进 format 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320171201253-1944658005.png
3.23 跟进 replace 方法(进入 if 判断前,做了格式判断,需要满足 "${" 开头才进入 )
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320172937118-807110054.png
3.24 跟进 substitute 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320173034743-1037878090.png
3.25 跟进 resolveVariable 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320173245233-784054632.png
3.26 跟进 lookup 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320173455138-1373300912.png
3.27 跟进 lookup 方法
(将传入的参数 jndi 和 rmi://192.168.3.175:8085/goqzKRmu 分离出来赋值给 name 和 prefix )
(StrLookupMap 中储存的 String,object 键值对,取出 JndiLookup 对象,并调用 jndiLookup 的 look 方法)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320173931881-1262057220.png
3.28 跟进 lookup 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320181216148-718609268.png
3.29 跟进 lookup 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320181253605-1964394873.png
3.30 先跟进 getURLOrDefaultInitCtx 方法(重要调用)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320181628840-2140402967.png
3.30.1 跟进 getURLContext 方法
(此处将 rmi 协议抽取出来)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320181929120-1289737175.png
3.30.2 跟进 getURLObject 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320182436431-356544492.png
3.30.3 跟进 getObjectInstance 方法
(先根据 scheme 属性的 rmi 参数 获取 rmiURLContextFactory 类,然后调用 rmiURLContextFactory 的 getObjectInstance 方法 )
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320183633617-1749257952.png
3.30.4 getObjectInstance 返回值为 rmiURLcontext 对象
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320190647874-2126165308.png
3.31 依次返回到 lookup 方法,因返回值为 rmiURLContext 对象,调用该对象的 lookup 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320181628840-2140402967.png
3.32 先跟进 getRootURLContext 方法
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320191845862-1758574665.png
3.32.1 getRootURLContext 方法 返回一个 解析结果 ResolveResult 对象
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320191726057-1806410864.png
3.33 getResolvedObj 方法返回解析对象,强转接口类,再调用 RegistryContext 类的 lookup 方法,继续跟进
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320192217811-2104162658.png
3.34 继续跟进 decodeObject 方法(var2 这里应该是发起了连接,工具收到 RMI 请求)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320192913573-1079131298.png
执行 this.registry.lookup(var1.get(0)) 语句时收到 RMI 请求
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320193133803-2094750308.png
3.35 关键方法 getObjectInstance 获取对象的实例,跟进该方法
( NamingManager 类是 java 原生类,只与 JDK 版本有关,当前 JDK 版本 8u112)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320193354136-1468834879.png
3.36 继续跟进 get Object Factory From Reference 方法(该方法 从引用获取对象工厂)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320193812332-1539634324.png
3.37 第一个 try catch 应该是本地加载,如果有内容则不进入if判断(未加载到 class,clas 属性还是等于 null)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320194244941-276671399.png
执行到 clas = helper.loadClass(factoryName, codebase) 加载远程类成功,工具收到请求
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320194717735-1560607949.png
计算器 弹出成功(工具写的恶意类 应该是放在 static 代码块中,类加载的时候就会执行 static 代码块,无需使用new创建对象)
(clas.newInstance() 此方法会通过构造方法创建对象)
(恶意代码可以写在 static 代码块中,也可以写在 构造方法 中)
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320194913431-918021882.png
4、log4j2 底层调用链
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320195230469-1016382992.png
总结:会根据传入的值去解析成对应的对象
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320195428259-2028489205.png
比如 java:os ,对应的是系统属性
https://img2023.cnblogs.com/blog/1728854/202303/1728854-20230320195930311-1604172805.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]