背景:Nexus 被安全部门扫到漏洞 CVE-2020-10199,需要升级解决。由于网上资料较少,升级过程中出现数据紊乱的问题,后来经过努力,终于解决了。
一、漏洞概要
2020年03月31 日,Sonatype 官方发布安全公告,声明修复了存在于 Nexus Repository Manager 3 中的远程代码执行漏洞 CVE-2020-10199。
Sonatype Nexus 是一个 Maven 的仓库管理系统,它提供了强大的仓库管理、构件搜索等功能,并且可以用来搭建 Maven 仓库私服,在代理远程仓库的同时维护本地仓库,以节省带宽和时间。
在 Nexus Repository Manager OSS/Pro 3.21.1 及之前的版本中,由于某处功能安全处理不当,导致经过授权认证的攻击者,可以在远程通过构造恶意的 HTTP 请求,在服务端执行任意恶意代码,获取系统权限。
此漏洞的利用需要攻击者具备任意类型的账号权限。
二、漏洞影响
【危险等级】
高危
【影响版本】
Sonatype Nexus Repository Manager OSS/Pro 3.x <= 3.21.1
三、漏洞修复
注:修复漏洞前请将资料备份,并进行充分测试。笔者认为,Nexus 的数据存储和常规的应用不太一样,sonatype-work/nexus3/ 目录里面的 db、keystone 和 blobs 子目录非常重要,可以定期备份。
目前,官方已发布新版本修复了该漏洞,请受影响的用户升级到安全版本。
下载地址:https://help.sonatype.com/repomanager3/download/
官方升级指引:https://help.sonatype.com/repomanager3/installation-and-upgrades/upgrading-a-standalone-instance
四、升级失败后恢复数据
笔者在升级过程中,由于失误没有备份 sonatype-work 目录就进行升级,直接解压下载的安装包,覆盖了 sonatype-work ,导致原有的 nexus 数据库元数据紊乱,nexus 系统整个挂了。后面经过几天的努力,也没能恢复 nexus,虚拟机也没有购买备份服务,服务也没有配置备份,人都差点整抑郁了。
以后操作一定小心小心再小心,不要犯经验注意错误。
后来经过思考,发现 maven 本地仓库 repository 里面有大部分编译所需要的 jar,只要将仓库 repository 里面的上传到 nexus 系统,从一定程度上恢复 nexus 的数据。
方法如下:
1、切到仓库 repository 里面
2、准备上传脚本 trans_jar.sh,赋予执行权限
#!/bin/bash
# copy and run this script to the root of the repository directory containing files
# this script attempts to exclude uploading itself explicitly so the script name is important
# Get command line params
while getopts ":r:u:p:" opt; do
case $opt in
r) REPO_URL="$OPTARG"
;;
u) USERNAME="$OPTARG"
;;
p) PASSWORD="$OPTARG"
;;
esac
done
find . -type f -not -path './trans_jar\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;
3、在仓库 repository 里面执行脚本
nohup bash trans_jar.sh -u admin -p 'PASSWORD' -r http://10.10.10.100:8081/repository/local-hosted-release
注意:http://10.10.10.100:8081/repository/local-hosted-release jar仓库要提前建好
4、登录 nexus 查看