tech.guitarrapc.cóm

Technical updates

GitHub ActionsでダウンロードしたActionsのパス

GitHub Actionsが他CIと決定的に違うポイントの1つがカスタムアクションです。他のCIサービスにも類するものはありますが、圧倒的なボリュームと参照しやすさ、作りやすさが他のCIサービスと一線を画しています。1

今回はそんなカスタムアクションの豆知識です。

まとめ

簡単まとめです。

  • ワークフローで利用しているカスタムアクションは事前にダウンロードされる
  • ダウンロードされたカスタムアクションは/home/runner/work/_actions/{Owner}/{Repository}/{Ref}/にダウンロードされる
  • ダウンロードされた中にはアクションに関係ないファイルも入っているので、これ経由でアクションと関係ないファイルを触れる

カスタムアクションはワークフロー開始時にダウンロードされる

カスタムアクションを使ったワークフローがあるとしましょう。

name: Debug Remote Action Download Structure
on:
  workflow_dispatch:

jobs:
  remote:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

実行したログを見ると、どんなワークフローでも冒頭に必ずSet up jobというステップがあります。このステップをよく見るとワークフローで参照しているカスタムアクションは事前ダウンロードされていることがわかります。Download immutable action package 'actions/checkout@v4'の中を見てみると、どうやらカスタムアクションをダウンロードしていることがわかります。

image

Download immutable action package 'actions/checkout@v4'
  Version: 4.2.2
  Digest: sha256:ccb2698953eaebd21c7bf6268a94f9c26518a7e38e27e0b83c1fe1ad049819b1
  Source commit SHA: 11bd71901bbe5b1630ceea73d27597364c9af683

このダウンロードされたアクションは/home/runner/work/_actions/{Owner}/{Repository}/{Ref}/にダウンロードされます。

今回はactions/checkout@v4なので/home/runner/work/_actions/actions/checkout/v4/にダウンロードされています。次のようなデバッグステップを実行すると確認できます。

      - name: debug
        run: ls -R /home/runner/work/_actions/actions/checkout/v4

image

チェックアウトされたアクションはこのディレクトリにダウンロードされていることがわかります。アクション実行に関係ないリポジトリのファイルが丸っととれていますね。

利用シーンは各自で、としておきます。

懸念

この挙動は割と悪用できそうなラインなので、将来的につぶされてほしいところです。

セキュリティ的なチートシートにも記載があるのですが、事前にダウンロードされるということは「実行前に書き換えができる」ことを意味します。 書き換えて何をするかといえば、悪意を持っているとアクションに渡すシークレットへアクセスできます。もしも悪意のあるアクションが、このパスにある特定のアクションのYAML定義などを書き換えることで攻撃を差し込む余地があります。

第三者のアクションを利用するときはコミットハッシュ指定で、といわれるリスクが現実味を帯びるシナリオになりかねないところです。


  1. 例えばCircleCIにもOrbがありますが作りやすさ、配布しやすさ、参照しにくさに難があります。JenkinsもPluginはあるものの、一部のStageだけ、Stageの一部処理だけOSSのを使うというのは難しい。