漏洞描述
近日,腾讯云关注到 Apache Log4j2远程代码执行漏洞被公开,Log4j2中存在 JNDI 注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,利用此漏洞可以在目标服务器上执行任意代码。具体漏洞信息请参见 Apache Log4j2远程代码执行漏洞风险紧急告警。
漏洞影响
在弹性 MapReduce 服务中 flink、hive、ranger、 presto、 oozie 、knox 、 storm 、druid 等组件有受此漏洞影响。请受影响的用户可参照以下方案进行修复。
解决方案
替换 log4j2的包为安全版本。
受影响版本:Apache log4j2 2.0 ~ 2.15.0-rc1。
安全版本:Apache log4j2-2.17.1正式版。
修复命令
1. 标准 EMR 目录修复命令。
wget https://image-repo-gz-1259353343.cos.ap-guangzhou.myqcloud.com/user-patches/common/fix-log4j2.sh -O fix-log4j2.sh && bash -x fix-log4j2.sh /usr/local/service
2. 运行任务时缓存目录中 jar 修复。
确保提交的任务里面没有问题 jar,否则下次提交的任务还会缓存。
直接删除目录下的问题 jar。
/data/emr/yarn/local/filecache//data/emr/yarn/local/usercache//data1/emr/yarn/local/filecache//data1/emr/yarn/local/usercache//data2/emr/yarn/local/filecache//data2/emr/yarn/local/usercache/
上述只列出了3块数据盘的情况,其中/data 后面跟的数字为数据盘索引,需要把全部数据盘的/data 目录下对应文件进行清理。
3. 非标准目录(非/usr/local/service 目录)修复,执行命令。
EXTRA_DISRUPTOR_DIR=/path/to/other bash fix-log4j2.sh /path/to/other
4. 其他场景修复。
升级该漏洞相关的6个jar包:log4j-api、log4j-core、log4j-jul、log4j-slf4j-impl、log4j-web 和 disruptor。如果没有上述的某个包,则无需替换。
重启服务与灰度修复
1. 对集群的某台机器执行修复。
重启这个节点上的服务 flink、spark、hive、ranger 、 presto 、oozie、storm、impala、knox、druid。
重启各个常驻任务,flink 任务,storm 任务,spark 任务。
2. 此节点重启服务验证没问题后,再执行其他节点的修复。
修复原理
1. 将修复后的6个 jar 放在执行目录的 fix-log4j 目录下。
2. 查找待修复目录,修复6个 jar 包,发现则替换,未发现不会替换,会同时替换 tar.gz 以及 war 包中的对应问题 jar,以及 hdfs 上/user/hadoop/share 路径下的缓存包。
替换其中的
log4j-api,log4j-core,log4j-jul,log4j-slf4j-impl,log4j-web 2.0~2.17.1
为2.17.1版本。替换其中的
disruptor-3.4.2.jar
以下的版本为3.4.2版本,注意 disruptor 仅对部分组件替换。服务有问题回滚步骤
需要将问题 jar 包拷贝回去,并删除添加的最新 jar 包。
1. 解压备份文件。
cd fix-log4j2tar zxvf rm_if_no_need_to_rollback.tar.gz.1639576622
其中1639576622为临时生成的时间戳,需找到对应文件进行解压。
2. 将备份文件拷贝回去。
cp -r ./root/fix-log4j2/emr_fix_log4j_bak_10812_1639576622/usr/local/service/* /usr/local/service/
其中10812_1639576622 为执行时临时生成的数字,需找到对应文件进行复制。
3. 删除添加的 log4j 系列最新 jar 包。
find /usr/local/service/ -name log4j-api-2.17.1.jar | xargs -n1 -I{} rm -f {}find /usr/local/service/ -name log4j-web-2.17.1.jar | xargs -n1 -I{} rm -f {}find /usr/local/service/ -name log4j-jul-2.17.1.jar | xargs -n1 -I{} rm -f {}find /usr/local/service/ -name log4j-slf4j-impl-2.17.1.jar | xargs -n1 -I{} rm -f {}find /usr/local/service/ -name log4j-core-2.17.1.jar | xargs -n1 -I{} rm -f {}
4. 如果是其他目录/path/to/other 的回滚,则将/usr/local/service/替换为/path/to/other。