2022年8月4日,Apache Hadoop官方披露修复了一个Shell命令注入漏洞CVE-2022-25168。由于Apache Hadoop的FileUtil.unTar API在传递Shell之前未对输入的文件名进行转义,攻击者可以利用该漏洞注入任意命令,从而对集群造成破坏。

漏洞影响

  • 漏洞影响的Hadoop版本:
    • 2.0.0 <= Apache Hadoop <= 2.10.1
    • 3.0.0-alpha <= Apache Hadoop <= 3.2.3
    • 3.3.0 <= Apache Hadoop <= 3.3.2
  • 漏洞影响的EMR版本:存量集群的EMR 3.x系列、EMR 4.x系列、EMR 5.x系列(EMR-5.8.x及之前的版本)均涉及。
  • 缺陷严重程度:该漏洞被评估为高危漏洞,需要尽快修复。

关于该漏洞的详细信息,请参见阿里云漏洞库说明Apache Hadoop FileUtil.unTar 命令注入漏洞(CVE-2022-25168)

修复流程

EMR集群

  1. 单击hadoop-patches-tools.zip下载patch包。
  2. 登录EMR集群的Matser节点,并将上一步骤中下载的patch包放在emr-user用户或hadoop用户的HOME目录下。
  3. 执行以下命令,切换用户并解压缩hadoop-patches-tools.zip包。
    • 新版数据湖(DataLake)、实时数据流(DataFlow)、数据分析(OLAP)、数据服务(DataServing)和自定义场景的集群
      su emr-user
      unzip hadoop-patches-tools.zip
    • 其余集群
      su hadoop
      unzip hadoop-patches-tools.zip
  4. 执行以下命令,进入hadoop-patches-tools目录,然后编辑hosts文件。
    cd hadoop-patches-tools
    vim hosts
    添加集群所有节点的host name,文件内容以行分割。hosts文件内容示例如下。
    emr-header-1
    emr-worker-1
    emr-worker-2
    重要 对于EMR 3.x系列中EMR-3.41及之后的版本,EMR 5.x系列中EMR-5.7.0及之后的版本集群,hostname已经发生了变化,hosts文件内容示例如下。
    core-1-1
    core-1-2
    task-1-1
    task-1-2
  5. 通过fix.sh脚本执行修复操作。
    ./fix.sh
    脚本执行完成后,返回如下提示信息。
    ### NOTICE: YOU CAN RESTORE THIS PATCH BY RUN RESTORE SCRIPT ABOVE
    $> sh ./restore.sh 20221024160338
    ### DONE
    如果您需要将上述修复过程进行回滚,可以执行以下命令。
    sh ./restore.sh 20221024160338

    最后可以执行./check.sh命令来验证修复过程是否完成。

    如果修复完成,则返回以下提示信息。
    ********************************************************************
         OK: CVE-2022-25168 is already fixed.
                              This tools updated at 2022/10/13.
    ********************************************************************
    重要 本修复方式是替换源码修改后的同命名JAR,云安全中心是通过版本号检查该漏洞,此时忽略该漏洞检查即可。
  6. 重启服务。
    HDFS、Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件需要重启之后才能完全修复漏洞,为减少对业务的影响,请尽量一台节点一台节点的执行重启操作。

    以HDFS组件为例,在EMR集群的HDFS服务页面,选择右上角的更多操作 > 重启

Gateway集群

由于该方案依赖于SSH免密登录,对于Gateway集群,您需要手动将patch包上传到Gateway集群的每一个节点,并按EMR集群的修复流程分别执行修复操作。
重要 patch包中的hosts文件只需要填写当前执行节点的hostname。

新建集群和扩容已有集群

新建EMR集群时在EMR控制台添加引导操作,或扩容已有集群时可以自动修复漏洞。具体操作步骤如下:

  1. 单击hadoop-patches-tools.zipbootstrap_hadoop.sh,下载patch包和bootstrap脚本,并且上传到OSS上。
    例如,上传到OSS的路径为oss://<bucket-name>/path/to/hadoop-patches-tools.ziposs://<bucket-name>/path/to/bootstrap_hadoop.sh
  2. 在EMR控制台添加引导操作,详细信息请参见管理引导操作
    添加引导操作对话框中,填写配置项。
    参数描述
    名称引导操作的名称。例如,FileUtil.unTar命令注入漏洞修复。
    脚本位置选择脚本所在OSS的位置。

    脚本路径格式必须为oss://**/*.sh格式。本文示例为oss://<bucket-name>/path/to/bootstrap_hadoop.sh

    参数引导操作脚本的参数,指定脚本中所引用的变量的值。

    本文示例为oss://<bucket-name>/path/to/hadoop-patches-tools.zip

    执行范围选择集群
    执行时间选择组件启动后
    执行失败策略选择继续执行
  3. 如果是新建集群,则需要重启所有节点上的HDFS、Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件。如果是新扩容节点,则只需要重启扩容节点上的相应组件。