今天早上收到阿里雲發的報警短信,大致內容如下:

前提分析:
公司代碼代碼倉庫使用是Gogs搭建的,版本是0.11.34,二進制方式安裝的,連接的是其他主機上的MySQL數據庫,因此被檢測到有這個漏洞
處理方式:
- 先登錄Gogs官網,查看Gogs的最新版本,如下圖所示:
地址:https://gogs.io/docs/installation/install_from_binary

同時看到官方提供的有這個信息:如何通過二進制升級?

但是不要被這個信息騙了,升級Gogs版本不能采用這種方式。
注意到官方頁面左側導航有從二進制升級,這個是具體的升級方式,可以參考這個進行操作:
地址:https://gogs.io/docs/upgrade/upgrade_from_binary

- 接下來按照官方文檔提供的升級方式升級就行了
(1) 先停止主機上的Gogs應用程序進程,直接kill就行了
ps -ef | grep gogs # 查看進程pid
lsof -p pid # 查看進程具體路徑, 默認位置在 git 用戶下的家目錄
kill -9 pid # 殺死進程
# 這里寫的有一個gogs.sh腳本,停止進程的話執行這個腳本也行
# gogs.sh
#!/bin/bash
function starT(){
nohup /home/git/gogs/gogs web &
}
function stoP(){
kill -9 `lsof -i:3000 |awk 'NR==2{print $2}'`
}
case $1 in
'start')
starT;
;;
'stop')
stoP;
;;
'restart')
stoP;
starT;
;;
*)
echo '請輸入有效的命令(start|stop|restart)'
;;
esac
(2) 原有程序目錄重命名,下載最新的二進制文件等
# # 默認位置在 git 用戶下的家目錄
$ sudo su - git
$ cd ~
$ pwd
/home/git
$ ls
gogs gogs-repositories
# gogs 目錄是程序目錄
# gogs-repositories 存放倉庫文件的目錄,在配置文件中指定的
# 將當前目錄移動到另一個臨時的位置,但不是刪除!
$ mv gogs gogs_old
載並解壓新的二進制:
# 請根據系統和類型獲取相應的二進制版本
$ wget https://dl.gogs.io/0.12.3/gogs_0.12.3_linux_amd64.tar.gz
$ tar -zxvf gogs_0.12.3_linux_amd64.tar.gz
$ ls
gogs gogs_old gogs-repositories gogs_0.12.3_linux_amd64.tar.gz
# 復制 custom、data 和 log 目錄到新解壓的目錄中:
$ cp -R gogs_old/custom gogs
$ cp -R gogs_old/data gogs
$ cp -R gogs_old/log gogs
# 最后,運行並打開瀏覽器進行測試:
$ cd gogs
$ ./gogs web
- 升級中出現的問題
(1) 啟動的時候報錯:"./gogs: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./gogs)"
分析:當前系統是CentOS release 6.8 (Final),系統的glibc版本太低,軟件編譯時使用了較高版本的glibc引起的
查看當前系統支持的glibc版本:
# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_PRIVATE
當前最高版本是GLIBC_2.10,需要升級到GLIBC_2.14才行。
使用命令:yum update glibc會報錯,提示當前使用的yum倉庫不可用,查看發現得知使用的是官方的yum倉庫,這里更換成使用騰訊雲的yum倉庫
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos6_base.repo # 適用於6.x系統的
然后使用命令:yum update glibc進行更新,不過才更新到GLIBC_2.12版本,還不是GLIBC_2.14版本。
采用源碼編譯方式更新危險性太大,幸好找到了rpm更新包:
地址:https://files.cnblogs.com/files/sanduzxcvbnm/glibc-2.14.1-rpm-all.zip

rpm -Uvh glibc-2.14.1-6.x86_64.rpm glibc-common-2.14.1-6.x86_64.rpm glibc-headers-2.14.1-6.x86_64.rpm glibc-devel-2.14.1-6.x86_64.rpm nscd-2.14.1-6.x86_64.rpm glibc-static-2.14.1-6.x86_64.rpm glibc-utils-2.14.1-6.x86_64.rpm
再次查看發現已經順利升級成功
t# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_PRIVATE
(2) 再次啟動后報這個錯誤:[TRACE] Log Mode: File
看這個不知道啥原因,不過通過查看gogs.log文件可以知道:
tail -n 30 /home/git/gogs/log/gogs.log # 日志文件路徑
# 最新的日志有這么一句話
[FATAL] [gogs.io/gogs/internal/db/repo.go:121 NewRepoContext()] Gogs requires Git version greater or equal to 1.8.3
通過查看本機使用的git版本,發現是1.7.1的,看來還需要升級git版本
# git --version
git version 1.7.1
但是使用命令:yum update git進行升級,最新軟件版本還是1.7.1,看來只能通過其他方式進行升級了。
這里不采用git源碼的方式進行升級,而是通過下載其他的git 倉庫源進行升級
yum -y install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
yum install git # 這一步安裝比較慢
升級成功后再次查看版本,版本大於1.8.3,符合要求了
t# git --version
git version 2.22.0
(3) 注意:若是使用root用戶啟動,則會報錯:
"[FATAL] [gogs.io/gogs/internal/cmd/web.go:161 runWeb()] Failed to initialize application: init configuration: user configured to run Gogs is "git", but the current user is "root""
需要切換到git用戶啟動才行
$ sudo su - git
$ cd ~
$ cd gogs
$ ./gogs web
# 我這操作是切換到git用戶后,使用gogs.sh腳本進行啟動的,腳本內容見上面:bash gogs.sh start
升級總結
1.最新的軟件包上沒有說明一些注意事項,或者前提條件,比如gilibc和git的版本要求
2.下載軟件界面上面有二進制升級方式,若真按照這種方式升級,后果不敢想象

