kakts-log

技術・エンジニアリング組織などについて調べたことをまとめます

GitHubの Third-party ActionのコミットSHA指定と、dependabotによるコミットSHAの更新

概要

GitHub Actionsでファイルの変更差分を取得するためのサードパーティツールであるtj-actions/changed-files でのコミットの侵害により、Actionsのシークレットの内容をactionsの実行時に出力されてしまうというインシデントがありました。

www.stepsecurity.io

その際に、actionsのGitタグも書き換えられてしまい、そのためこのactionをタグ指定で使っているリポジトリは、この侵害の影響がありました。

対策の一つとして、このactionsのバージョンの指定をタグで指定せず、コミットSHAで指定する方法が推奨されており、その方法と、なぜタグ指定が良くないかについて整理します。
また、Gitリポジトリのツールなどのバージョン更新を行ってくれるdependabotの運用において、コミットSHAでの指定での自動更新をするやり方についてもまとめます。

GitHub Actionsにおけるセキュリティ対策

GitHub ActionsにおけるThird-party actionsを使用する際のセキュリティ対策として、GitHub公式のドキュメントとしてまとめられています。

docs.github.com

  • actionをフルレングスのコミットSHAで指定する
  • actionのソースコードを監査する
  • 開発者がそのThird-party actionの作者を信頼している時のみタグを指定する

この3つが挙げられてますが、1つ目が重要です。

今回のtj-actions/changed-filesでのタグ侵害について

タグを指定した場合になぜ影響があるかを今回の例で説明します。

上述したStepSecurityでの記事によると、既存のタグが参照するコミットSHAが、悪意のあるコミットを指すように更新されていました。
これによりタグを指定した場合に悪意のあるコードが実行されることとなります。

$ git tag -l | while read -r tag ; do git show --format="$tag: %H" --no-patch $tag ; done | sort -k2
v1.0.0: 0e58ed8671d6b60d0890c21b07f8835ace038e67
...
v35.7.7-sec: 0e58ed8671d6b60d0890c21b07f8835ace038e67
...
v44.5.1: 0e58ed8671d6b60d0890c21b07f8835ace038e67
...
v5: 0e58ed8671d6b60d0890c21b07f8835ace038e67
...

git tagのそもそも

git tagについて改めて整理します。

git-scm.com

git tagは、git リポジトリの特定のコミットに対して参照するための名前をつける際に使われます。 下記のように 指定したタグの情報を確認できますが、タグに対してcommit 項目で紐づいているコミットSHAが確認できます。

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

そして、一度作成したタグに対しては、あとからまたタグを付け直すことが可能です。

$ git tag -a v1.2 9fceb02

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    updated rakefile
...

こうすることで、既存のタグに対しても、特定のコミットSHAを参照させることが可能になるため Third-party Actionをタグで指定した際には今回のような事象が発生するため、明確にコミットSHAを指定するのが重要です。

actionsのバージョンをコミットSHAで指定する

このコミットSHAをバージョンとして指定するには、 ${actionName}@${commitSHA} で指定します。

仮に、actions/setup-dummyの タグv2.0.0 に紐づいているコミットSHA: abcd....123456789を使いたいとすると下記のようになります。

steps:
  - uses: actions/setup-dummy@abcd....123456789

これで、指定したactionをコミットSHAで指定することができます。

dependabotによるコミットハッシュでのバージョン指定

dependabotによって、上記のactionを自動で更新するには、#を使って指定した形式でタグ名も指定するとdependabotによってタグとコミットSHAを判定でき、自動更新ができます。

${actionName}@${commitSHA} # ${tag} という形式で コミットSHAの後ろに#とタグ名を指定するtだけで可能です。

steps:
  - uses: actions/setup-node@abcd....123456789 # v2.0.0

これでdependabotによる書き換え対象となります。

参考