- GitHub Actionsで
run:ブロックを実行するときに使うシェルは、shellキーワードで指定できる
- ワークフローでは任意だが、個別のアクション定義では必須項目
- デフォルト値はOSに応じて自動設定される: Linux/macOSは
bash、Windowsはpwsh
- 明示的に
shell: bashを設定すると、次のようなデフォルトフラグも含まれる: --noprofile --norc -eo pipefail
任意の実行ファイルをshellとして指定可能
- 一般には、
shellに使える値は限定されていると思いがち
- 実際には、
$PATH上にあるあらゆる実行ファイルをシェルとして使える
- 実行コマンドがファイル入力を受け取らない場合は、特別な引数
{0}を渡す必要がある
{0}はGitHubが自動的に一時ファイルのパスへ置き換える
実験的な例
- C言語コンパイラ(tcc)をシェルのように使って直接実行することも可能
$PATHを操作して偽のbashシェルを作って使うことも可能
- GitHubは
shell項目に指定された値が実際にどんな実行ファイルであっても気にしない
セキュリティ上の示唆
- GitHub Actionsでは、ファイル書き込みと実行の境界が曖昧(
GITHUB_ENV、$GITHUB_PATHなど経由でも実行可能性がある)
shell: bashのようなよく知られた値でさえ$PATH経由で探索され、固定の実行パス(/bin/bash)は使われない
- 予想に反して、
pythonのような値も単なるツールキャッシュ参照ではなく、実際のパスベース実行になっている
2件のコメント
github/runner-image レポジトリを見るだけでも、そのまま使えるパッケージがかなり多くインストールされていますよね…。
イメージを作ると、1GBくらいはあっという間に入ってしまう…。
Hacker Newsのコメント
-xフラグを使って、Actions ワークフローで実行されるすべてのコマンドを出力するよう強制したことがある。デバッグに非常に便利だったrepository_dispatchイベント名をマッチさせることScriptHandler.csには、プロセス環境や引数などを準備するコードがすべて入っているbashをだまして、どんなプログラムでも実行できるgoevalはまだファイル入力を直接サポートしていないgoevalの作者だ