Publicãªãªããžããªã§GitHub Actionsãæ±ãæè¡
GitHub Actions䟿å©ã§ãããã
çè
ãåå ããŠããFlutterKaigi 2023ã®å
¬åŒã¢ããªããGitHub Actionsã§ãã«ãããŠããŸãã
å®è£
ããŠã¿ãŠåããŠå®æããã®ã§ãããå
¬éãªããžããªã«ãããGitHub Actionsã®æ±ãã¯ãéå
¬éã®ãã®ãšæ¯ã¹å°ãé¢åã§ãã
æ¬èšäºã§ã¯ãå
¬éãªããžããªã§GitHub Actionsãšæ©å¯æ
å ±ãæ±ãããã®æè¡ã«ã€ããŠç޹ä»ããŸãã
æŠèŠ
æ¬èšäºã¯ããã®æ§è³ªäžãGitHubãå
¬éããŠããããã¥ã¡ã³ããããã°ãåèã«ããŠããŸãã
ãã®ããããŸã次ã®èšäºãèªãã§ããã ãããšãæšå¥šããŸãã
ãã®äžã§ãæ¬èšäºã§ã¯æ¬¡ã®å 容ã«ã€ããŠæ±ããŸãã
- 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ã€ãã³ãã®ããã«ããŒãž ã³ãããã®ã³ã³ããã¹ãã§ã¯ãªãã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ãå€éšã³ã³ããªãã¥ãŒã¿ãŒã«éæŸããããšã¯ãæšå¥šãããŠããŸããã
TL;DR: Combining
pull_request_targetworkflow 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ã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ãšããŠåŠçã玹ä»ãããŠããŸãã
äžç¹æ³šæãå¿
èŠãªã®ã¯ããã®ããã°ãæžãããã®ã2021幎ãªãããææ°ã®actions/github-scriptãšåŠçã«éãããç¹ã§ãã
ç¹ã«v5ããv6ã«ãããŠAPIã«ç Žå£ç倿Žãå
¥ã£ãŠãããããã°ã®ã³ãŒã(v3)ã®ã³ãŒãããã®ãŸãŸå©çšããããšã¯ã§ããŸããã
äž»ã«github.*ã§åŒã³åºãããŠããã¡ãœããããgithub.rest.*ã«ãããã³ã°ããçŽããŠããŸããå©çšã§ããAPIã¯GitHub APIã®ããã¥ã¡ã³ããèªã¿ã€ã€ãåŒã³åºãæ¹ã¯github-scriptã®workflowsãåèã«ããããšããå§ãããŸãã
ãªããactions/download-artifactãå©çšããããšã¯ã2023幎9æçŸåšã§ããŸããã
äžèšIssueã®è§£æ¶ãåŸ
ã€å¿
èŠããããŸãã
ãŸãšã
Publicãªãªããžããªã§GitHub Actionsãæ±ãããã®æè¡ã«ã€ããŠç޹ä»ããŸããã
ãªããªãåç
§ããã±ãŒã¹ã¯ãªãããªãšæããŸããããããå¿
èŠã«ãªã£ãéã«ã¯ããã²åèã«ããŠããã ããã°ãšæããŸãã
Discussion