🀖

PublicなリポゞトリでGitHub Actionsを扱う技術

に公開
2024/06/09

GitHub Actions䟿利ですよね。
筆者が参加しおいるFlutterKaigi 2023の公匏アプリも、GitHub Actionsでビルドしおいたす。

実装しおみお初めお実感したのですが、公開リポゞトリにおけるGitHub Actionsの扱いは、非公開のものず比べ少し面倒です。
本蚘事では、公開リポゞトリでGitHub Actionsず機密情報を扱うための技術に぀いお玹介したす。

抂芁

本蚘事は、その性質䞊、GitHubが公開しおいるドキュメントやブログを参考にしおいたす。
このため、たず次の蚘事を読んでいただくこずを掚奚したす。

https://securitylab.github.com/research/github-actions-preventing-pwn-requests/

https://securitylab.github.com/research/github-actions-untrusted-input/

https://securitylab.github.com/research/github-actions-building-blocks/

この䞊で、本蚘事では次の内容に぀いお扱いたす。

  • GitHub Actionsにおける pull_request ず pull_request_target の違い
  • pull_request ず workflow_run の組み合わせ
  • actions/github-script の䜿い方

もしもPublicなリポゞトリでGitHub Actionsを扱うこずになった堎合、ぜひ参考にしおいただければず。

GitHub Actionsにおける pull_request ず pull_request_target の違い

PrivateなリポゞトリでGitHub Actionsを扱う堎合、pull_request むベントをトリガヌにしお、PRの内容をビルドするこずが倧半ではないでしょうか。
しかしPublicなリポゞトリでは、この方法では䞀郚の機胜が利甚できたせん。この制限に぀いおは、公匏ドキュメントに蚘茉されおいたす。

pull_request#フォヌクされたリポゞトリのワヌクフロヌ

GITHUB_TOKEN の䟋倖を陀き、ワヌクフロヌがフォヌクされたリポゞトリからトリガヌされた堎合、シヌクレットはランナヌに枡されたせん。 GITHUB_TOKEN には、フォヌクされたリポゞトリからの pull request での読み取り専甚アクセス蚱可がありたす。 詳しくは、「自動トヌクン認蚌」を参照しおください。

この問題に察しお、GitHubはpull_request_targetむベントを利甚できたす。
ただし、ドキュメントには次のような泚意曞きがありたす。泚意したしょう。

pull_request_target

このむベントは、pull_request むベントのようにマヌゞ コミットのコンテキストではなく、pull request のベヌスのコンテキストで実行されたす。 これで、リポゞトリを倉曎したり、ワヌクフロヌで䜿うシヌクレットを盗んだりする可胜性がある、pull request の head から安党ではないコヌドが実行されるのが避けられたす。 このむベントを䜿うず、ワヌクフロヌでは、pull request に察するラベルやコメントなどの䜜業をフォヌクから行うこずができたす。 pull request からコヌドをビルドたたは実行する必芁がある堎合は、このむベントを䜿わないでください。


ここで「秘密情報」ずされおいるのは、GitHub Actionsでsecretsずしお利甚できるものです。
FlutterKaigi/conference-app-2023では、Firebase Hostingにpreview環境をデプロむするために、Firebaseのservice accountに関する情報をsecretsずしお登録しおいたす。こういった情報を、悪意のあるナヌザヌに枡しおしたうず、Firebaseを䞍正に利甚される可胜性がありたす。

想定される攻撃ずしおは、悪意のあるナヌザヌがPRを䜜成し、GitHub Actionsを実行させるケヌスです。
なおpull_requestが利甚される堎合、秘密情報にアクセスできないため、このような攻撃を防ぐこずができたす。

䞀方、pull_request_targetは、PRのベヌスブランチのコンテキストで実行されるため、秘密情報にアクセスできたす。もちろん、このような攻撃を防ぐために、GitHubは「リポゞトリのオヌナヌによる蚱可がなければ、GitHub Actionのフロヌが実行されない」ずいう制玄を远加しおいたす。しかし「最初に安党そうなPRを提出し、埌ほど悪意のある凊理を远加する」ようなケヌスでは、この制玄は有効ではありたせん。

pull_request ず workflow_run の組み合わせ

前項の最埌で蚘したずおりpull_request_targetによりGitHub Actionsを倖郚コントリビュヌタヌに開攟するこずは、掚奚されおいたせん。

https://securitylab.github.com/research/github-actions-preventing-pwn-requests/

TL;DR: Combining pull_request_target workflow trigger with an explicit checkout of an untrusted PR is a dangerous practice that may lead to repository compromise.

代わりに利甚できるのが、workflow_runむベントです。

workflow_run

このむベントは、ワヌクフロヌの実行が芁求されたか完了したずきに発生したす。 これで、別のワヌクフロヌの実行たたは完了に基づいおワヌクフロヌを実行できたす。

workflow_runは秘密情報ぞのアクセスが可胜になりたす。このためworkflow_runをpull_requestむベントの完了埌に走るようにするこずで、倖郚コントリビュヌタヌによるGitHub Actionsの実行を行うこずができるようになりたす。
セキュリティに぀いおは、workflow_runはdefault branchに存圚するyamlファむルの内容が実行されるため、default branchに存圚するファむルに悪意あるコヌドが远加されない限り、安党です。぀たり、悪意のあるコヌドがdefault branchにマヌゞされない限り、安党ずなりたす。


pull_requestからworkflow_runに凊理を移行する堎合、少しだけ泚意が必芁です。
ずいうのも「pull_requestはPull Requestの䜜成に䌎っお実行される」ため、pull_requestの凊理の䞭でPRに関する情報を取埗できたす。
察しおworkflow_runは「任意のpull_requestの凊理が完了したのちに実行される」ため、そのたたではpull_requestに関する情報を取埗できたせん。

この問題に察しお、GitHubのブログではactions/upload-artifactずactions/github-scriptを利甚する方法が玹介されおいたす。

actions/github-script の䜿い方

Pull Requestの番号などず成果物の䞡方をたずめたzipを䜜成し、actions/upload-artifactでアップロヌドするこずで、workflow_runで情報ず成果物を取埗できたす。
ブログ蚘事の䞭ではCommentPR.ymlずしお凊理が玹介されおいたす。

https://securitylab.github.com/research/github-actions-preventing-pwn-requests/

䞀点泚意が必芁なのは、このブログが曞かれたのが2021幎なため、最新のactions/github-scriptず凊理に際がある点です。

https://github.com/actions/github-script

特にv5からv6にかけおAPIに砎壊的倉曎が入っおおり、ブログのコヌド(v3)のコヌドをそのたた利甚するこずはできたせん。
䞻にgithub.*で呌び出されおいたメ゜ッドが、github.rest.*にマッピングされ盎しおいたす。利甚できるAPIはGitHub APIのドキュメントを読み぀぀、呌び出し方はgithub-scriptのworkflowsを参考にするこずをお勧めしたす。

https://docs.github.com/en/rest?apiVersion=2022-11-28
https://github.com/actions/github-script/tree/main/.github/workflows


なお、actions/download-artifactを利甚するこずは、2023幎9月珟圚できたせん。
䞋蚘Issueの解消を埅぀必芁がありたす。

https://github.com/actions/download-artifact/issues/130

たずめ

PublicなリポゞトリでGitHub Actionsを扱うための技術に぀いお玹介したした。
なかなか参照するケヌスはないかなず思いたすが、もしも必芁になった際には、ぜひ参考にしおいただければず思いたす。

GitHubで線集を提案

Discussion