log4j2漏洞应急思路

近期log4j2算是出名了,网络上看到很多解决方案

1、升级补丁啦

2、删除JndiLookup的类文件啦

分析漏洞原因前面也分析过了,但是还是要做应急的

基于我们这边的情况

1、组件信息无法排查,需要业务协助

2、影响范围确认进度极慢

这么严重的问题,咋搞呢

我们这边主要是k8s的,运维大佬说可以统一下个agent去处理,然后根据漏洞原理写了个agent

ClassFileTransformer实现类的主要逻辑就是不让使用jndi

大概代码如下

 private static String JndiManagerClassName = "org.apache.logging.log4j.core.net.JndiManager";
   
   private static String JndiManagerLookupMethodName = "lookup";
   
   public JndiManagerTransformer(Instrumentation inst) {
     this.inst = inst;
   }
   
   public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
     if (className.replace("/", ".").equals(JndiManagerClassName)) {
       System.out.println("Start Patch JndiManager Lookup Method!");
       CtClass ctClass = null;
       CtMethod ctMethod = null;
       try {
         ClassPool classPool = new ClassPool();
         classPool.appendSystemPath();
         if (loader != null)
           classPool.appendClassPath((ClassPath)new LoaderClassPath(loader)); 
         ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
         for (CtMethod method : ctClass.getMethods()) {
           if (method.getName().equals(JndiManagerLookupMethodName)) {
             ctMethod = method;
             break;
           } 
         } 
         assert ctMethod != null;
         ctMethod.setBody("return null;"); // 直接lookup返回null,这样就不会走到JndiLookkup里面触发漏洞了
         System.out.println("Patch JndiManager Lookup Success!");
         return ctClass.toBytecode();
       } catch (Exception e) {
         e.printStackTrace();
       } finally {
         if (ctClass != null)
           ctClass.detach(); 
       } 
     } else {
       return classfileBuffer;
     } 
     return classfileBuffer;
   }
 }

而且这样还不需要业务太多的配合,我们只需要确认是否使用到这个特性功能即可,然后统一下发agent,重启解决全部问题。

高呼k8s大佬牛逼~

发表评论

登录后才能评论
网站客服
网站客服
申请收录 侵权处理
分享本页
返回顶部